Aitkin加速算法可对线性收敛的简单迭代法起到加速作用
由于
(x(k+1)-x*)=phi’(m1)(x(k)-x*),m1是介于x(k)与x之间的一个值
(x(k+2)-x)=phi’(m2)(x(k+1)-x*),m2是介于x(k+1)与x之间的一个值
在需要求的方程f(x)=0的左右两端各加一个x,即得到新方程phi(x)=x
若phi’(m1)≈phi’(m2),则有
(x(k+1)-x)/(x(k+2)-x*)≈(x(k)-x*)/(x(k+1)-x*)
整理得
x*=(x(k)*x(k+2)-x(k+1)^2)/(x(k)+x(k+2)-2x(k+1))
令x(k+1)=phi(x(k)), x(k+2)=phi(x(k+1)),再令左端的x星变为x(k+1),就得到递推公式
例子:求解方程f(x)=x^3-x-1在x=1.5附近的根
代码如下
# -*- coding: utf-8 -*-
"""
Created on Sat Feb 16 07:35:33 2019
@author: Minghua Chen
"""
#Aitkin加速算法解线性收敛
def f(x):
return x**3-x-1
def phi(f,x):
return f+x
def y(f,x):
return phi(f,x)
def z(f,y):
return phi(f,y)
def roll(x):
f1=f(x)
y1=y(f1,x)
f2=f(y1)
z1=z(f2,y1)
xx=(x*z1-y1**2)/(x+z1-2*y1)
return xx
x=1.5
e=0.000001
def main(x,e):
ans=[]
ans.append(roll(x))
ans.append(roll(ans[0]))
while abs(ans[-1]-ans[-2])>e:
ans.append(roll(ans[-1]))
return ans[-1]
print main(x,e)
解得x=1.32471795743,解答完毕