一、不动点迭代法求方程的解
import sympy
#迭代的方程为 f(x)=pow(x,3)-x-1
def psi(x):
return pow(x+1,1/3)
def dif(x0): #求导函数用于判断最后的是否局部收敛
x = sympy.Symbol('x')
Y = pow(x+1,1/3)
difY=(sympy.diff(Y, x))
a=difY.subs(x,x0)
return a
def Fix(x0):
p0=psi(x0)
x1=p0
k=0
while k>=0:
if abs(x1-x0)<10e-9:
print("方程的根为",x1)
print("迭代次数为",k)
if abs(dif(x0))<1:
print("此迭代局部收敛")
else:
print("此迭代非局部收敛")
break
else:
x0=x1
p0=psi(x0)
x1=p0
print("第",k+1,"次迭代值为",x0)
k=k+1
return x0
Fix(1.5)
运行结果
第 1 次迭代值为 1.3572088082974532
第 2 次迭代值为 1.3308609588014277
第 3 次迭代值为 1.325883774232348
第 4 次迭代值为 1.324939363401885
第 5 次迭代值为 1.3247600112927027
第 6 次迭代值为 1.3247259452268871
第 7 次迭代值为 1.324719474534364
第 8 次迭代值为 1.3247182454489357
第 9 次迭代值为 1.324718011988197
第 10 次迭代值为 1.3247179676430874
方程的根为 1.3247179592198772
迭代次数为 10
此迭代局部收敛
二、斯特芬森(Stephens)迭代法
# 斯蒂芬斯加速迭代,同样的例题,不动点迭代法用这个迭代方程还无法迭代,需要另一个迭代方程
#但这种方法即使是使用不动迭代的那个方程依旧可以迭代,而且这个方法迭代两次,用不动点迭代要十次迭代
import sympy
#迭代的方程为 f(x)=pow(x,3)-x-1 与不动点迭代是同个例子,但迭代方程不同
def psi(x):
return pow(x,3)-1 #这个迭代方程用不动点迭代方法无法迭代,发散
def dif(x0): #求导函数用于判断最后的是否局部收敛
x = sympy.Symbol('x')
Y = pow(x+1,1/3)
difY=(sympy.diff(Y, x))
a=difY.subs(x,x0)
return a
def Fix(x0): #x0是选取的初值
p0=psi(x0)
y0=p0
z0=psi(y0)
k=0
while k>=0:
if abs(y0-x0)<10e-9:
print("方程的根为",x0)
print("迭代次数为",k)
if abs(dif(x0))<1:
print("此迭代局部收敛")
else:
print("此迭代非局部收敛")
break
else:
x0=x0-((y0-x0)**2)/(z0-2*y0+x0)
y0=psi(x0)
z0=psi(y0)
print("第",k+1,"次迭代值为",x0)
k=k+1
return x0
Fix(1.5)
运行结果
第 1 次迭代值为 1.4162929745889388
第 2 次迭代值为 1.355650441476644
第 3 次迭代值为 1.3289487772840107
第 4 次迭代值为 1.3248044890410438
第 5 次迭代值为 1.3247179939688145
第 6 次迭代值为 1.3247179572447527
方程的根为 1.3247179572447527
迭代次数为 6
此迭代局部收敛