Aitkin加速算法求解线性收敛的方程的根的Python实现

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,解答完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值