matlab 使用各种迭代法解分线性方程x^3+2*x^2+10*x-20=0

% -----------------------------------------------------------------------------------------------
% Written by QQ137712826
% -----------------------------------------------------------------------------------------------
% 计算实习题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次

你可能感兴趣的:(MATLAB)