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

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.4658585861次迭代结果的误差为:0.034141414142次steffensen迭代结果为:1.4655712532次迭代结果的误差为:0.00028733312843次steffensen迭代结果为:1.4655712323次迭代结果的误差为: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.93494423791次迭代结果的误差为:0.56505576212次steffensen迭代结果为:1.0050328992次迭代结果的误差为:0.070088660773次steffensen迭代结果为:1.075462693次迭代结果的误差为:0.070429791734次steffensen迭代结果为:1.1454923834次迭代结果的误差为:0.070029692775次steffensen迭代结果为:1.2134374525次迭代结果的误差为:0.067945068816次steffensen迭代结果为:1.2757707476次迭代结果的误差为:0.062333295387次steffensen迭代结果为:1.3259775097次迭代结果的误差为:0.050206761918次steffensen迭代结果为:1.3557440048次迭代结果的误差为:0.029766494849次steffensen迭代结果为:1.3645818169次迭代结果的误差为:0.00883781218610次steffensen迭代结果为:1.3652268310次迭代结果的误差为:0.000645013670211次steffensen迭代结果为:1.36523001311次迭代结果的误差为:0.00000318335553212次steffensen迭代结果为:1.36523001312次迭代结果的误差为:7.707394792e-11
 
该方程的steffensen迭代法的最小迭代次数为:    12

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

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值