一般迭代法及Python实现

本文介绍非线性方程求解的一般迭代法和Steffensen加速收敛方法。阐述了一般迭代法的求解步骤与几何解释,Steffensen法是对其改良。通过案例对比,用Python实现求解方程根,结果显示Steffensen法迭代速度更快,达到相同精度所需迭代次数远少于一般迭代法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 原理

2 一般迭代法求解

2.1 一般迭代法求解步骤

2.2 一般迭代法的几何解释

3 Steffensen加速收敛方法介绍

3.1 Steffensen加速收敛方法实现步骤

3.2 Steffensen加速收敛方法的迭代公式

3.3  Steffensen加速收敛方法几何解释

4 案例&Python实现


1 原理

设方程为f(x)=0,为求解它的实根,将其改成等价的形式: 

x=\varphi (x)

也就是说x*是方程f(x)=0的一个根,当且仅当x*=\varphi (x*)。取方程根的初值x0进行迭代,迭代公式如下:

x_{n+1}=\varphi (x_n)

如果通过上述公式得到的序列{ {x_n}}收敛,即\lim_{n\rightarrow \infty }x_n=x*,则x*为方程f(x)=0的根。由于x*=\varphi (x*),所以常称x*为迭代函数\varphi (x*)的一个不动点。

2 一般迭代法求解

2.1 一般迭代法求解步骤

① 构造迭代函数,迭代函数必须是收敛的(可用压缩映像原理判断是否收敛)。迭代函数的选择没有固定的方法,具有一定的经验性,而迭代函数选择是否恰当,对迭代过程的收敛性有很大影响。
② 根据迭代函数得到迭代公式;
③ 确定迭代初值,根据经验确定接近真实解的初值;
④ 确定迭代终止条件。根据精度要求确定迭代停止条件,也就是跳出循环的判断条件。

2.2 一般迭代法的几何解释

\varphi '(x)>0,即迭代函数单调递增为例来描述迭代过程:

  • 以横坐标为x_0,在迭代函数\varphi (x)上取一点(x_0,\varphi(x_0) );
  • 以纵坐标为y_1=\varphi (x_0),在直线y=x上取一点(x_1,y_1),其中x_1=y_1=\varphi (x_0);
  • 以横坐标为x_1, 在迭代函数\varphi (x)上取一点(x_1,\varphi (x_1));
  • 以纵坐标为y_2=\varphi (x_1),在直线y=x上取一点(x_2,y_2),其中x_2=y_2=\varphi (x_1);
  • ......
  • 如此循环,x_n逐渐逼近真实解x*

3 Steffensen加速收敛方法介绍

Steffensen加速收敛方法是对一般迭代法的改良,可以提高算法的运行效率。

3.1 Steffensen加速收敛方法实现步骤

Steffensen加速收敛法的实现步骤和一般迭代法一样,只是两者的迭代公式不同而已。

3.2 Steffensen加速收敛方法的迭代公式

Steffensen迭代格式为:

\left\{\begin{matrix} y_n=\varphi (x_n)\\ z_n=\varphi (y_n) \\ x_{n+1}=x_n-\frac{(y_n-x_n)^2}{z_n-2y_n+x_n} \end{matrix}\right.n=0,1,2......

这种方式求得的x_{n+1}更接近于真实解x*,所以可以加快迭代速度。可以证明得到:以Steffensen迭代格式确定的序列{ x_n}最少以平方收敛于x*

3.3  Steffensen加速收敛方法几何解释

迭代过程如下:

  • \varphi (x)曲线上点P(x_n,y_n)为迭代起始点;
  • \varphi (x)的曲线上取一点Q(y_n,z_n),连接PQ两个点;
  • 这两个点的连线和直线y=x的交点R即为(x_{n+1},x_{n+1}),这个交点的横坐标更接近于真实解x*
  • \varphi (x)再取一点(x_{n+1},y_{n+1})为迭代起始点
  • ......
  • 如此循环,交点R的横坐标会无限接近于真实解x*

4 案例&Python实现

求解方程f(x)=x^3-x-1=0在区间[1,2]的根。

误差要求\varepsilon =10^{-9}

分别采用一般迭代法和Steffensen加速收敛法计算方程的根,并比较两者的迭代速度。

方程可变形为:

x=\sqrt[3]{x+1}=\varphi (x)

所以可得迭代函数为:

\varphi (x)=\sqrt[3]{x+1}

已知迭代函数就能得到迭代公式。

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加速收敛法只需要两次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dfreedom.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值