Matlab
% ----------------------------------------------------------------------------------------------- % Written by QQ742971636 % ----------------------------------------------------------------------------------------------- % 计算实习题1 使用各种迭代法解分线性方程x^3+2*x^2+10*x-20=0. % ------------------------------------------------------------------------------------------------ clc,clear leonardo_x=1.368808107; %勒让德得到的解 initx=1.0; %迭代值的初始值 % ----------------------------------------------------------------------------------------------- % 分析第 1 种迭代法是否收敛x=20/(x^2+2*x+10) % ------------------------------------------------------------------------------------------------ syms x fai=20/(x^2+2*x+10); %x=fai(x) y=diff(fai); %计算导函数 y1 = subs(y,x,1.368808107); %求在x0处的导数值 y1=abs(y1); %绝对值 fprintf('第 1 种方法,x=20/(x^2+2*x+10),|fai`(x*)| =%.10f\r\n',double(y1)); if(y1<1) %有y=|fai`(x*)|<1收敛 x=initx; %赋解的初值 n=0; %迭代次数 while(abs(x-leonardo_x)>1e-9) %一直计算到勒让德解的精度 x=20/(x^2+2*x+10); %迭代公式计算 n=n+1; %迭代次数增加一次 end fprintf(" 该方法|fai`(x*)| <1,收敛,最后解是 %.10f,迭代了%d次\r\n",x,n); else %有y=|fai`(x*)|>1不收敛 fprintf(" 该方法|fai`(x*)| 大于1,不收敛\r\n"); end % ----------------------------------------------------------------------------------------------- % 第 1 种方法收敛,使用Steffensen法加速收敛速度 % ------------------------------------------------------------------------------------------------ x=initx; %赋解的初值 n=0; %迭代次数 while(abs(x-leonardo_x)>1e-9) %一直计算到勒让德解的精度 y=20/(x^2+2*x+10); %迭代公式计算 z=20/(y^2+2*y+10); %迭代公式计算 x=x-(y-x)^2/(z-2*y+x); %迭代公式计算 n=n+1; %迭代次数增加一次 end fprintf(" 使用Steffensen法加速,最后解是 %.10f,迭代了%d次\r\n",x,n); fprintf("\r\n"); % ----------------------------------------------------------------------------------------------- % 分析第 2 种迭代法是否收敛 x=(20-2*x^2-x^3)/10.0 % ------------------------------------------------------------------------------------------------ syms x fai=(20-2*x^2-x^3)/10.0; %x=fai(x) y=diff(fai); %计算导函数 y1 = subs(y,x,1.368808107); %求在x0处的导数值 y1=abs(y1); %绝对值 fprintf('第 2 种方法,x=(20-2*x^2-x^3)/10.0,|fai`(x*)| =%.10f\r\n',double(y1)); if(y1<1) %有y=|fai`(x*)|<1收敛 x=initx; %赋解的初值 n=0; %迭代次数 while(abs(x-leonardo_x)>1e-9) %一直计算到勒让德解的精度 x=(20-2*x^2-x^3)/10.0; %迭代公式计算 n=n+1; %迭代次数增加一次 end fprintf(" 该方法收敛,最后解是 %.10f,迭代了%d次\r\n",x,n); else %有y=|fai`(x*)|>1不收敛 fprintf(" 该方法|fai`(x*)| >1,不收敛\r\n"); end fprintf("\r\n"); % ----------------------------------------------------------------------------------------------- % 分析Newton迭代法是否收敛 % ------------------------------------------------------------------------------------------------ syms x y1=x^3+2*x^2+10*x-20; %迭代公式一部分 y2=diff(y1); %计算导函数 fai=x-y1/y2; %x=fai(x) y=diff(fai); %计算导函数 y3 = subs(y,x,1.368808107); %求在x0处的导数值 y3=abs(y3); %绝对值 fprintf('第 3 种方法,Newton法,|fai`(x*)| =%.10f\r\n',double(y3)); if(y3<1) %有y=|fai`(x*)|<1收敛 xk=initx; %赋解的初值 n=0; %迭代次数 while(abs(xk-leonardo_x)>1e-9) %一直计算到勒让德解的精度 xk=double(subs(fai,x,xk)); %迭代公式计算 n=n+1; %迭代次数增加一次 end fprintf(" 该方法|fai`(x*)| <1,收敛,最后解是 %.10f,迭代了%d次\r\n",xk,n); else %有y=|fai`(x*)|>1不收敛 fprintf(" 该方法|fai`(x*)| 大于1,不收敛\r\n"); end
结果
第 1 种方法,x=20/(x^2+2*x+10),|fai`(x*)| =0.4438283287 该方法|fai`(x*)| <1,收敛,最后解是 1.3688081065,迭代了24次 使用Steffensen法加速,最后解是 1.3688081078,迭代了3次 第 2 种方法,x=(20-2*x^2-x^3)/10.0,|fai`(x*)| =1.1096139329 该方法|fai`(x*)| >1,不收敛 第 3 种方法,Newton法,|fai`(x*)| =0.0000000005 该方法|fai`(x*)| <1,收敛,最后解是 1.3688081078,迭代了4次
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!