牛顿法及基于牛顿算法下的Steffensen加速法求解非线性方程组方法例题及答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 非线性方程组求解
1.分别用牛顿法,及基于牛顿算法下的Steffensen 加速法。
(1) 求ln(sin )x x +的根。
初值0x 分别取0.1,1,1.5,2,4进行计算。
(2) 求sin =0x 的根。
初值0x 分别取1,1.4,1.6,1.8,3进行计算。
分析其中遇到的现象与问题。
(1)牛顿法
牛顿法实质上是一种线性化方法,其基本思想是将非线性方程()0f x =逐步归结为某种线性方程来求解。
将已知方程()0f x =在近似值k x 附近展开,有()()()()'0k k k f x f x f x f x x ≈+-=,构造迭代公式,则1k x +的计算公式为:
()
()
1'
,0,1,,k k k k f x x x k f x +=-
= (1-1)
根据Taylor 级数的几何意义我们可以从几何上形象的看牛顿迭代法的求解()0f x =的过程,第一次迭代()()'1000/x x f x f x =-,其中()()'00/f x f x 的几何意义很明显,就是0x 到1x 的线段长度(这可以从直角三角形的知识得到)。
第二次迭代()()'2111/x x f x f x =-,其中()()'11/f x f x 的几何意义很明显,就是1x 到2x 的线段长度。
同理可以进行第三次迭代第四次迭代,可以明显的看出x 的取值在不断逼近真实解*x 。
如图1-1所示:
图1-1
○
1求ln(sin )=0x x +的根时,迭代公式为()
1ln(sin )sin 1cos k k x x x x x x x
+++=++,
0示。
计算结果见附录1表F.1-1所示。
初值取1.5,2,4进行计算时结果不收敛。
表 1-1 牛顿法计算结果
○
2求sin =0x 的根时,迭代公式为1
cos k k x x x
+=+
,初值0x 分别取1、1.4、1.6、1.8、3计算时结果收敛,误差小于510-时,近似解如表1-2所示。
计算结果见附录1表F.1-2所示。
表 1-2 牛顿法计算结果
总结:通过f(x)=ln(x +sin x )和f(x)= sin x 构建的迭代式计算的结果出现病态,数值算法不稳定。
利用f(x)=ln(x +sin x )构建的迭代式,需要计算对数值,会增加运算次数,计算时会产生较大舍入误差,并且当x +sin
x<0时,计算结果不收敛,是不稳定的算法。
在计算sin x =0的根时,如果利用f(x)= sin x 构造的迭代式算法是病态的,计算结果收敛,但收敛点不唯一,选择不同的初值会有不同的结果。
(2)基于牛顿算法的Steffensen 加速法
○1求ln(sin )=0x x +的根时,迭代公式为21(ln(sin ))
((ln(sin )))()2k k k k k k k k k y f x x z f f x x y x x x z y x +⎧
⎪
=+⎪⎪=+⎨⎪⎪-=-
⎪-+⎩
,
初值0x
3所示。
计算结果见附录1表F.1-3所示。
表 1-3 Steffensen 法计算结果
○2求sin =0x 的根时,迭代公式为21
(sin )((sin ))()2k k k k k k k k k y f x z f f x y x x x z y x +==⎧⎪-⎨=-⎪-+⎩
,,初值0x 分别取1、1.4、1.6、3计算时结果收敛,误差小于510-时,近似解如表1-
4所示。
计算结果见附录1表F.1-4所示。
初值取1.8时计算结果不收敛。
表
1-4 Steffensen 法计算结果
总结:根据观察,Steffensen 法收敛速度比较快,初值对于Steffensen 法的收敛性和收敛速度影响不大。
从以上的分析中可以看出,对于牛顿法,初值的选择很重要,合理的初值可以加快迭代收敛,初值不合理时计算结果不收敛。
附录
附录1
MATLAB代码
function [Xi,x0,C]=NWxs(a,Er,F_x)
%F_x牛顿迭代函数
C=0;% 迭代次数
Xi=(0);
while(sign(F_x(a))==0)%如果a的函数值为0停止迭代,迭代次数为0
x0=a;%a为初值
Xi(1)=a;
C=0;
return;
end
while(sign(F_x(a))~=0&&abs(F_x(a)-a)>=Er) %Er为误差限
Xi(C+1)=a;%将a赋值
a=F_x(a);%迭代
C=C+1;
Xi(C+1)=a;%赋值
x0=a;%x0为近似解
NWxs(a,Er,F_x);%调用迭代函数进行迭代
end
end
% 史蒂芬森加速迭代法
function [Xi,x0,C]=Stf(a,Er,F_x)
C=0;%迭代次数
Xi=(0);
while(sign(F_x(a))==0)%如果a的函数值为0停止迭代,迭代次数为0
x0=a;
Xi(1)=a;
C=0;
return;
end
while(sign(F_x(a))~=0)%
Xi(C+1)=a;%将a作为第一个初值
Y_k=F_x(Xi(C+1));%不动点迭代求第二个初值
Z_k=F_x(Y_k);%不动点迭代求第三个初值
a=Xi(C+1)-( Y_k-Xi(C+1)).^2./(Z_k-2*Y_k+Xi(C+1));%用史蒂芬森加速方法迭代 C=C+1;
Xi(C+1)=a;
if(abs(Xi(C+1)-Xi(C))>=Er)%误差判断
Stf(a,Er,F_x);%调用迭代函数进行迭代
else
x0=a;%将a赋值给x0
return;
end
end
表F1-1 牛顿法迭代
表F1-2 牛顿法迭代
表F1-3 Steffensen迭代
表F1-4 Steffensen迭代。