数值分析实验报告 - 清华大学 - 非线性方程的解法

更新时间:2024-02-02 21:18:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

非线性方程的解法

实验1.算法设计与比较

问题提出:非线性方程组的求解方法很多,基本的思想是线性化。不同的方法效果如何,要靠计算的实践来分析、比较。 实验内容:考虑算法 (1)牛顿法 (2)拟牛顿法

分别编写它们的matlab程序。 实验要求:

(1)用上述方法,分别计算两个例子。在达到精度相同的前提下,比较迭代次数、浮点运算次数和CPU时间等。

1.1程序清单

为使用flops统计浮点运算次数,使用MATLAB5.3版本 ?.m原函数f1 function y=f(x)

y(1)=12*x(1)-x(2)^2-4*x(3)-7; y(2)=x(1)^2+10*x(2)-x(3)-8; y(3)=x(2)^3+10*x(3)-8; end

?1.m原函数f1的雅克比矩阵 function y=ff(x)

y(1,:)=[12,-2*x(2),-4]; y(2,:)=[2*x(1),10,-1]; y(3,:)=[0,3*x(2)^2,10]; end

?.m原函数f2 function y=f2(x)

y(1)=3*x(1)-cos(x(2)*x(3)) -1/2;

y(2)=x(1)^2-81*(x(2)+0.1)^2+sin(x(3))+1.06; y(3)=exp(-x(1)*x(2))+20*x(3)+1/3*(10*pi-3); end

?2.m原函数f2的雅克比矩阵 function y=ff2(x)

y(1,:)=[3,x(3)*sin(x(2)*x(3)),x(2)*sin(x(2)*x(3))];

y(2,:)=[2*x(1),-2*81*(x(2)+0.1),cos(x(3))];

y(3,:)=[-x(2)*exp(-x(1)*x(2)),-x(1)*exp(-x(1)*x(2)),20]; end

%牛顿法(以第一个方程组为例) clear;

x0=[0,0,0]'; n=10; tol=1e-6; x(:,1)=x0; i=1;u=[1,1,1]'; tic;

while (norm(u)>tol*norm(x(:,i))&(i

x(:,i+1)=x(:,i)+u; i=i+1; end; x(:,i) iter=i-1 t=toc

%拟牛顿法(以第一个方程组为例) clear;

x0=[0,0,0]'; n=10; tol=1e-6; x(:,1)=x0; i=1;p=[1,1,1]'; A=ff1(x(:,1)); tic;

while (norm(p)>tol*norm(x(:,i))&(i

q=f1(x(:,i+1))'-f1(x(:,i))';

A=A+(q-A*p)*p'/norm(p,2)^2; i=i+1; end; iter=i-1 t=toc x(:,i)

1.2运行结果

1.2.1第一个方程组

精确解为x*=(0.886020214719037, 0.796444775323146, 0.749479574122230)T 取最大迭代次数n=5000,相对误差限Tol=1e-6 (1)取x(0)??1,1,1?

牛顿迭代法迭代3次收敛,浮点运算次数为440,每次迭代平均浮点运算次数为147,CPU耗时t =0(s)

迭代次数 0 1 2 3 x*

拟牛顿法迭代4次收敛,浮点运算次数为1048,每次迭代平均浮点运算次数为262,CPU耗时t =0(s)

迭代次数 0 1 2 3 4 x* x1 1.000000000000000 0.886581469648562 0.886012820578930 0.886020173225063 0.886020215739641 0.886020214719037 ??x1 1.000000000000000 0.886581469648562 0.886020207056065 0.886020214719036 0.886020214719037 x2 1.000000000000000 0.798722044728434 0.796444929380194 0.796444775323146 0.796444775323146 x3 1.000000000000000 0.760383386581470 0.749480786097917 0.749479574122231 0.749479574122230 x2 1.000000000000000 0.798722044728434 0.796415777464922 0.796444594300867 0.796444779771230 0.796444775323146 x3 1.000000000000000 0.760383386581470 0.749413750927095 0.749478267295928 0.749479605954251 0.749479574122230 0,0? (2)取x(0)??0,牛顿迭代法迭代4次收敛,浮点运算次数为510,每次迭代平均浮点运算次数为128,CPU耗时t =1.600e-002(s)

迭代次数 0 1 2 3 4 x*

拟牛顿法迭代6次收敛,浮点运算次数为1493,每次迭代平均浮点运算次数为248,CPU耗时t =1.50e-002(s)

x1 0.000000000000000 0.850000000000000 0.886053816655038 0.886020214550129 0.886020214719036 0.886020214719037 x2 0.000000000000000 0.880000000000000 0.796740417782716 0.796444777513182 0.796444775323146 0.796444775323146 x3 0.000000000000000 0.800000000000000 0.751195666140720 0.749479594594174 0.749479574122225 0.749479574122230 迭代次数 0 1 2 3 4 5 6 x* x1 0.000000000000000 0.850000000000000 0.890153694459040 0.886666214017658 0.886009490038127 0.886020413089211 0.886020212895515 0.886020214719037 ?x2 0.000000000000000 0.880000000000000 0.804081233514847 0.795823804102330 0.796476720638057 0.796444926812187 0.796444756939429 0.796444775323146 x3 0.000000000000000 0.800000000000000 0.734564349770454 0.747585224672758 0.749491921471134 0.749479353065626 0.749479577099879 0.749479574122230 50? (3)取x(0)??50,50,牛顿迭代法迭代15次收敛,浮点运算次数为2118,每次迭代平均浮点运算次数为141,CPU耗时t =1.600e-002(s)

迭代次数 0 1 2 … 14 15 x*

拟牛顿法迭代338次收敛,浮点运算次数为88454,每次迭代平均浮点运算次数为262,CPU耗时t =3.100e-002(s)

迭代次数 0 1 2 … 1065 1066 1067 x* 1.2.2第二个方程组

精确解为x*=(0.886020214719037, 0.796444775323146, 0.749479574122230)T 取最大迭代次数n=5000,相对误差限Tol=1e-6

x1 50.0000000000000 20.1786100825975 2.37248674065214 … 0.886023201193838 0.886024422071366 0.886020132970681 0.886020214719037 x2 50.0000000000000 33.5407091996582 22.6385342226224 … 0.796445085496925 0.796445212332179 0.796444766829214 0.796444775323146 x3 50.0000000000000 -154.731899743662 -93.0439929077786 … 0.749488543598372 0.749492210345091 0.749479328600925 0.749479574122230 x1 x2 x3 100.000000000000 100.000000000000 100.000000000000 43.1059856791228 66.9061803535467 -717.741060639964 12.4269645317486 44.8624716706633 -346.148174381065 … … … 0.886020214714595 0.796444775375611 0.749479574635894 0.886020214719036 0.796444775323145 0.749479574122225 0.886020214719037 0.796444775323146 0.749479574122230 0,0? (1)取x(0)??0,牛顿迭代法迭代5次收敛,浮点运算次数为776,每次迭代平均浮点运算次数为155.2,CPU耗时t =0(s)

迭代次数 0 1 2 … 4 5 x*

拟牛顿法迭代6次收敛,浮点运算次数为1635,每次迭代平均浮点运算次数为273,CPU耗时t =0(s)

迭代次数 0 1 2 … 5 6 x* x1 0.000000000000000 0.500000000000000 0.499986968212287 … 0.499999999986751 0.500000000000001 0.886020214719037 ??x1 0.000000000000000 0.500000000000000 0.500015689636314 … 0.500000000009699 0.499999999999999 x2 0.000000000000000 -0.016888813308537 0.001720035536380 … 0.000000001063428 0.000000000000000 x3 0.000000000000000 -0.523598775598298 -0.523553630648901 … -0.523598775570483 -0.523598775598298 x2 0.000000000000000 -0.016888813308537 -0.001453664021159 … -0.000000001393660 0.000000000000043 0.796444775323146 x3 0.000000000000000 -0.523598775598298 -0.524022747110592 … -0.523598775635859 -0.523598775598297 0.749479574122230 8,8? (2)取x(0)??8,牛顿迭代法迭代9次收敛,浮点运算次数为1519,每次迭代平均浮点运算次数为169,CPU耗时t =0(s)

拟牛顿法迭代21次收敛,浮点运算次数为5924,每次迭代平均浮点运算次数为282,CPU耗时t =1.600e-002(s)

10,10?),在计算中会出现奇异或接近奇异(3)对于离精确解更远的初值(如x(0)??10,的矩阵,计算结果误差很大或计算根本无法进行下去。

?1.3简要分析

(1)牛顿迭代法的收敛阶数高于拟牛顿法。牛顿法收敛速度快,迭代次数少,拟牛顿法收敛速度慢,迭代步数多,这一特点在初始解远离精确解时尤为明显。

(2)随着函数的复杂性增加,使用差商近似导数可以使拟牛顿法每一步的计算量相对减小,在本实验中的两个方程组中这一特点没并没有充分显现。但也可以观察到,第二个方程组较第一个更复杂,同时,拟牛顿法每一步迭代的浮点运算次数与牛顿法之比,随函数复杂性的增加而减小。

(2)牛顿迭代法需要满足系数方程一阶可导的要求才可使用,拟牛顿法不要求可导。 (3)两种方法都说明,初值取得越接近精确解,计算的迭代次数越小。

(2)随着函数的复杂性增加,使用差商近似导数可以使拟牛顿法每一步的计算量相对减小,在本实验中的两个方程组中这一特点没并没有充分显现。但也可以观察到,第二个方程组较第一个更复杂,同时,拟牛顿法每一步迭代的浮点运算次数与牛顿法之比,随函数复杂性的增加而减小。

(2)牛顿迭代法需要满足系数方程一阶可导的要求才可使用,拟牛顿法不要求可导。 (3)两种方法都说明,初值取得越接近精确解,计算的迭代次数越小。

本文来源:https://www.bwwdw.com/article/gtvw.html

Top