目录
1 原理
设方程为,为求解它的实根,将其改成等价的形式:
也就是说x*是方程的一个根,当且仅当
。取方程根的初值x0进行迭代,迭代公式如下:
如果通过上述公式得到的序列{
}收敛,即
,则x*为方程
的根。由于
,所以常称x*为迭代函数
的一个不动点。
2 一般迭代法求解
2.1 一般迭代法求解步骤
① 构造迭代函数,迭代函数必须是收敛的(可用压缩映像原理判断是否收敛)。迭代函数的选择没有固定的方法,具有一定的经验性,而迭代函数选择是否恰当,对迭代过程的收敛性有很大影响。
② 根据迭代函数得到迭代公式;
③ 确定迭代初值,根据经验确定接近真实解的初值;
④ 确定迭代终止条件。根据精度要求确定迭代停止条件,也就是跳出循环的判断条件。
2.2 一般迭代法的几何解释
以,即迭代函数单调递增为例来描述迭代过程:
- 以横坐标为
,在迭代函数
上取一点
;
- 以纵坐标为
,在直线y=x上取一点
,其中
;
- 以横坐标为
, 在迭代函数
上取一点
;
- 以纵坐标为
,在直线y=x上取一点
,其中
;
- ......
- 如此循环,
逐渐逼近真实解
。
3 Steffensen加速收敛方法介绍
Steffensen加速收敛方法是对一般迭代法的改良,可以提高算法的运行效率。
3.1 Steffensen加速收敛方法实现步骤
Steffensen加速收敛法的实现步骤和一般迭代法一样,只是两者的迭代公式不同而已。
3.2 Steffensen加速收敛方法的迭代公式
Steffensen迭代格式为:
这种方式求得的更接近于真实解
,所以可以加快迭代速度。可以证明得到:以Steffensen迭代格式确定的序列{
}最少以平方收敛于
。
3.3 Steffensen加速收敛方法几何解释
迭代过程如下:
曲线上点P
为迭代起始点;
- 在
的曲线上取一点Q
,连接PQ两个点;
- 这两个点的连线和直线y=x的交点R即为
,这个交点的横坐标更接近于真实解
;
- 在
再取一点
为迭代起始点
- ......
- 如此循环,交点R的横坐标会无限接近于真实解
。
4 案例&Python实现
求解方程
在区间[1,2]的根。
误差要求
。
分别采用一般迭代法和Steffensen加速收敛法计算方程的根,并比较两者的迭代速度。
方程可变形为:
所以可得迭代函数为:
已知迭代函数就能得到迭代公式。
Python代码如下:
#一般迭代法
import numpy as np
def f(x):
y=(x+1)**(1/3) #迭代函数
return y
def main():
#-----一般迭代法-----#
x0=1.5 #一般迭代法迭代初始值
e=10**(-9) #误差要求
m=0
while abs((f(x0)-x0))>e: #采用残差来判断
x1=f(x0) #迭代公式
x0=x1
m=m+1 #统计迭代次数
print(f"x0={x0}")
print(f"m={m}")
#-----Steffensen加速收敛法-----#
x0=1.5 # 迭代初始值
n=0
while abs((f(x0)-x0)) > e: # 采用残差来判断
y0=f(x0)
z0=f(y0)
x1=x0-(y0-x0)**2/(z0-2*y0+x0) #迭代公式
x0=x1
n=n+1 #统计迭代次数
print(f"x0={x0}")
print(f"n={n}")
if __name__ == '__main__':
main()
运行结果如下:
x0=1.3247179576199157
m=12
x0=1.3247179574544752
n=2
达到相同的结果精度,一般迭代法需要12次,而Steffensen加速收敛法只需要两次。