欢迎光临散文网 会员登陆 & 注册

MATLAB程序设计——牛顿法求解非线性方程

2022-04-30 16:20 作者:鸣凤在竹-白驹食场  | 我要投稿

1 牛顿迭代法

牛顿迭代法实质上是一种线性化方法,其基本思想是将非线性方程f(x)%3D0逐步归结为某种线性方程来求解。

1.1 牛顿法

牛顿迭代法又称切线法,是一种有特色的求根方法。用牛顿迭代法求f(x)%3D0的单根x%5E%7B*%7D的主要步骤:

(1)Newton法的迭代公式

x_%7Bk%2B1%7D%3D%20x_%7Bk%7D-%5Cfrac%7Bf(x_%7Bk%7D)%7D%7Bf'(x_%7Bk%7D)%20%7D%20%EF%BC%8Ck%3D0%2C1%2C2%2C...

(2)以x%5E%7B*%7D附近的某一个值x_0为迭代初值,代入迭代公式,反复迭代,得到序列x_1%2C%20x_2%2C%20x_3%2C...

(3)若序列收敛,则必收敛于精确根x%5E%7B*%7D,即%5Clim_%7Bk%5Cto%5Cinfty%20%7D%20x_k%20%3Dx%5E*

牛顿法有显然的几何意义,方程f(x)%3D0的根x%5E%7B*%7D可解释为曲线与轴交点的横坐标。设x_k是根x%5E%7B*%7D的某个近似值,过曲线y%3Df(x)上横坐标为x_k的点P_k(x_k%2C%20y_k)引切线,并将该切线与x轴交点的横坐标x_%7Bk%2B1%7D作为x%5E%7B*%7D的新的近似值。

牛顿法初值的选择:若f(x)%5Ba%2Cb%5D上连续,存在2阶导数,且满足下列条件:

(1)f(a)f(b)%3C0

(2)f'(x)(a%2Cb)内不变号,且f'(x)%5Cneq%200

(3)f''(x)(a%2Cb)内不变号,且f''(x)%5Cneq%200

(4)%5Cfrac%7B%5Cvert%20f(a)%20%5Cvert%20%7D%7B%5Cvert%20f'(a)%20%5Cvert%20%7D%20%5Cleq%20b-a,且 %5Cfrac%7B%5Cvert%20f(b)%20%5Cvert%20%7D%7B%5Cvert%20f'(b)%20%5Cvert%20%7D%20%5Cleq%20b-a

则对任意的初值x_0%5Cin%20%5Ba%2Cb%5D,牛顿迭代序列收敛于f(x)%3D0%5Ba%2Cb%5D内的唯一根。

牛顿的优缺点:牛顿法是目前求解非线性方程(组)的主要方法,至少二阶局部收敛,收敛速度较快,特别是当迭代初值充分靠近精确解时。对重根收敛速度较慢(线性收敛),对初值的选取很敏感,要求初值相当接近真解,需要求导数。

图1 牛顿法迭代收敛过程的几何意义


1.2 哈利牛顿法

哈利法(Halley)可用于加速牛顿法收敛,哈利迭代公式:

x_%7Bk%2B1%7D%3D%20x_%7Bk%7D-%5Cfrac%7Bf(x_%7Bk%7D)%7D%7Bf'(x_%7Bk%7D)%20%7D%20%5Cleft(1-%5Cfrac%7Bf(x_k)f''(x_k)%7D%7B2(f'(x_k))%5E2%7D%20%5Cright)%5E%7B-1%7D%EF%BC%8Ck%3D0%2C1%2C2%2C...

哈利法在单根情况下可达到三阶收敛。

1.3 简化牛顿法

将牛顿法的迭代公式改为

x_%7Bk%2B1%7D%3Dx_k-%5Clambda%20f(x_k)%EF%BC%8Ck%3D0%2C1%2C2%2C...

为保证收敛,系数%5Clambda%20只需满足0%3C%5Clambda%20%3C%5Cfrac%7B2%7D%7Bf'(x_k)%7D%20即可。如果%5Clambda%20取常数%5Cfrac%7B1%7D%7Bf'(x_0)%7D%20,则称为简化牛顿法,也称平行弦法

简化牛顿法线性收敛。

1.4 牛顿下山法

牛顿法的收敛性依赖初值x_0的选取,如果x_0偏离所求根x%5E*较远,则牛顿法可能发散。牛顿下山法,引入下山因子%5Clambda%20,保证函数值稳定下降的同时,加速收敛速度。

牛顿下山法公式:

x_%7Bk%2B1%7D%3D%20x_%7Bk%7D-%5Clambda%20%5Cfrac%7Bf(x_%7Bk%7D)%7D%7Bf'(x_%7Bk%7D)%20%7D%20%EF%BC%8Ck%3D0%2C1%2C2%2C...

下山因子的取法:从%5Clambda%20%3D1开始,逐次减半,即%5Clambda%20%3D1%2C%5Cfrac%7B1%7D%7B2%7D%20%2C%5Cfrac%7B1%7D%7B2%5E2%7D%20%2C%5Cfrac%7B1%7D%7B2%5E3%7D%20%2C...,直到满足下降条件。

1.5 重根情形

x%5E*f(x)%3D0m(m%3E0)重根时,则f(x)可表为f(x)%3D(x-x%5E*)%5Emg(x),其中g(x%5E*)%5Cneq%200,此时用牛顿迭代法求x%5E*仍然收敛,只是收敛速度将大大减慢,牛顿法求方程的重根时仅为线性收敛。

将求重根问题化为求单根问题进行牛顿法求解。对f(x)%3D(x-x%5E*)%5Emg(x),令函数

%5Cmu%20(x)%3D%5Cfrac%7Bf(x)%7D%7Bf'(x)%7D%3D%5Cfrac%7B(x-x%5E*)g(x)%7D%7Bmg(x)%2B(x-x%5E*)g'(x)%7D%20%20

则化为求%5Cmu%20(x)%3D0的单根x%5E*的问题,对它用牛顿法是二阶收敛的。其迭代函数为

%5Cvarphi%20(x)%3Dx-%5Cfrac%7B%5Cmu(x)%20%7D%7B%5Cmu'(x)%7D%20%3Dx-%5Cfrac%7Bf(x)f'(x)%7D%7B%5Bf'(x)%5D%5E2-f(x)f''(x)%7D%20

从而构造出迭代方法

x_%7Bk%2B1%7D%3Dx_k-%5Cfrac%7Bf(x_k)f'(x_k)%7D%7B%5Bf'(x_k)%5D%5E2-f(x_k)f''(x_k)%7D%EF%BC%8C%20k%3D0%2C1%2C2%2C...

2 牛顿迭代法MATLAB算法实现

算法说明:

(1)输入参数的判定和必要的处理,包括可变参数的处理,若某个可变参数不输入,则采用默认值。

(2)由于牛顿法需要计算方程的一阶导数和二阶导数(重根情形),故方程的定义采用符号定义(避免手工计算方程的导数所带来的计算量),在算法solve_diff_fun(equ)中实现符号函数的一阶导数和二阶导数的计算,并转换为匿名函数进行数值运算。

(3)根据参数method选择执行不同的牛顿迭代方法,具体:

    1)“newton”为牛顿法newton();

    2)“simplify”为简化的牛顿法simplify_newton();

    3)“halley”为哈利法(牛顿加速法)newton_halley();

    4)“downhill”为牛顿下山法newton_downhill(),下山法包括了下山因子的存储;

    5)“multi”为重根情形newton_multi_root()。

(4)根据参数display选择是否显示迭代过程信息或仅显示结果信息。

(5)可变输出参数的判定和必要处理。

思考:MATLAB中没有类似于Python的list结构,如何在未知迭代次数的情况下,预分配内存,存储迭代过程变量信息?

3 牛顿迭代法案例测试

例1:求非线性方程在x%5Cin%20%5B-3.5%2C%205%5D区间的近似根

f(x)%3D2e%5E%7B-x%7Dsinx%2B2cosx-0.25%3D0

可视化函数图像:

图2 非线性方程图像


从图中可以看出,在区间内存在四个根,此处仅求在x_0%3D0附近的根,其他根求解自行设计。

验证输入参数:

验证输出参数,仅有一个输出参数,则为结构体,且输出迭代过程:

验证输出参数,有三个输出参数,分别为近似解、方程在近似解处的误差精度和退出标记,1表示收敛到满足精度要求的近似解,且输出最终迭代结果:

例2:求带有重根的非线性方程在x_0%3D0.9附近的近似解

f(x)%3D(x-1)*(sin(x-1)%2B3x)-x%5E3%2B1%3D0

由于简化的牛顿法收敛速度较慢,此处不再可视化简化的牛顿法。

可视化各牛顿法的误差精度下降曲线如图3,可见在存在重根情形下,采用牛顿重根公式,收敛速度极快,其次为牛顿哈利法。由于此处未用到下山因子,故牛顿法和牛顿下山法求解过程一致。

图3 带有重根的牛顿法各迭代方法的精度误差曲线

各方法迭代过程

例3:求非线性方程在x_0%3D1附近的近似解:

f(x)%3D2e%5E%7B-x%7Dsinx%3D0

图4 各牛顿迭代法求解非线性方程误差精度下降曲线

其中下山法由于在第二次迭代时引入了下山因子0.25,故其下降曲线相对于牛顿法而言,保持了下降收敛的性质。


MATLAB程序设计——牛顿法求解非线性方程的评论 (共 条)

分享到微博请遵守国家法律