Steffensen迭代法matlab程序(《数值分析原理》)

  • Post author:
  • Post category:其他




Steffensen迭代法(数值分析)



1、Steffensen迭代法的提出

Steffensen迭代法是不动点迭代法加速收敛的一种方法,常用于线性收敛迭代法的加速。该方式用三个迭代值组合而成,表示公式如下图所示:(具体推导详见《数值分析原理》)

在这里插入图片描述



2、Steffensen迭代法的特点

(1)Steffensen迭代至少为二阶收敛;

(2)Steffensen迭代不仅能加速收敛,而且也能将发散的迭代改进为收敛的迭代;

(3)Steffensen加速技术一般不对高阶收敛的迭代法进行加速,因为此时的效果不明显。



3、Steffensen迭代法的Matlab程序举例

在如下的例子中没有使用函数文件的形式,而是直接采用命令文件的形式,将文件命名为Steffensen.m 。下面的两个例子都是《数值分析原理》中常见的Steffensen迭代法求根的题目。

例1:用Steffensen迭代法求f(x)=1+1/x² 在x=1.5附近的根,要求|x-x*|<10^(-5)。

digits(10) %控制迭代的运算精度,精度太大迭代速度变慢

% 定义函数方程
syms x %定义自变量
f(x)=1+1/(x^(2)); %函数方程
x=1.5;
epslion=10^(-5);
N=20; %N为迭代次数

error=1;
k=0;
for i=1:N
    while abs(error)>epslion && k<N
        y=x;
        x=vpa(x-((f(x)-x)^(2))/(f(f(x))-2*f(x)+x));
        error=vpa(y-x);
        if abs(error)>=epslion
            k=k+1;
            fprintf('第%d次steffensen迭代结果为:%d\n',k)
            disp(x)
            fprintf('第%d次迭代结果的误差为:%d\n',k)
            disp(abs(error))
            break
        end
        if error<epslion
            k=k+1;
            fprintf('第%d次steffensen迭代结果为:%d\n',k)
            disp(x)
            fprintf('第%d次迭代结果的误差为:%d\n',k)
            disp(abs(error))
            fprintf('该方程的steffensen迭代法的最小迭代次数为:')
            disp(k)
            break
        end
    end
end

程序执行如下:

>> Steffensen
第1次steffensen迭代结果为:1.465858586
 
第1次迭代结果的误差为:0.03414141414
 
第2次steffensen迭代结果为:1.465571253
 
第2次迭代结果的误差为:0.0002873331284
 
第3次steffensen迭代结果为:1.465571232
 
第3次迭代结果的误差为:0.00000002085340216
 
该方程的steffensen迭代法的最小迭代次数为:     3

例2:用Steffensen迭代加速方法求方程x³+4x²-10=0在[1,2]上的近似值,要求|x-x*|<10^(-9).

根据迭代原理可知f(x)=x-x³-4x²+10,程序如下:

digits(10) %控制迭代的运算精度,精度太大迭代速度变慢

% 定义函数方程
syms x %定义自变量
f(x)=x-x^(3)-4*x^(2)+10; %函数方程
x=1.5;
epslion=10^(-9);
N=20; %N为迭代次数

error=1;
k=0;
for i=1:N
    while abs(error)>epslion && k<N
        y=x;
        x=vpa(x-((f(x)-x)^(2))/(f(f(x))-2*f(x)+x));
        error=vpa(y-x);
        if abs(error)>=epslion
            k=k+1;
            fprintf('第%d次steffensen迭代结果为:%d\n',k)
            disp(x)
            fprintf('第%d次迭代结果的误差为:%d\n',k)
            disp(abs(error))
            break
        end
        if error<epslion
            k=k+1;
            fprintf('第%d次steffensen迭代结果为:%d\n',k)
            disp(x)
            fprintf('第%d次迭代结果的误差为:%d\n',k)
            disp(abs(error))
            fprintf('该方程的steffensen迭代法的最小迭代次数为:')
            disp(k)
            break
        end
    end
end

执行结果如下:

>> Steffensen
第1次steffensen迭代结果为:0.9349442379
 
第1次迭代结果的误差为:0.5650557621
 
第2次steffensen迭代结果为:1.005032899
 
第2次迭代结果的误差为:0.07008866077
 
第3次steffensen迭代结果为:1.07546269
 
第3次迭代结果的误差为:0.07042979173
 
第4次steffensen迭代结果为:1.145492383
 
第4次迭代结果的误差为:0.07002969277
 
第5次steffensen迭代结果为:1.213437452
 
第5次迭代结果的误差为:0.06794506881
 
第6次steffensen迭代结果为:1.275770747
 
第6次迭代结果的误差为:0.06233329538
 
第7次steffensen迭代结果为:1.325977509
 
第7次迭代结果的误差为:0.05020676191
 
第8次steffensen迭代结果为:1.355744004
 
第8次迭代结果的误差为:0.02976649484
 
第9次steffensen迭代结果为:1.364581816
 
第9次迭代结果的误差为:0.008837812186
 
第10次steffensen迭代结果为:1.36522683
 
第10次迭代结果的误差为:0.0006450136702
 
第11次steffensen迭代结果为:1.365230013
 
第11次迭代结果的误差为:0.000003183355532
 
第12次steffensen迭代结果为:1.365230013
 
第12次迭代结果的误差为:7.707394792e-11
 
该方程的steffensen迭代法的最小迭代次数为:    12

(以上内容是本人学习过程中的小小尝试,如有错漏希望大家多多批评指正喔~)



版权声明:本文为azhao100原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。