【源码】史蒂芬森加速迭代方法的matlab实现

    科技2022-09-04  190

    【源码】史蒂芬森加速迭代方法的matlab实现

    本篇是在课程学习中自己编程实现的史蒂芬森加速迭代法计算非线性方程或者超越方程近似根的算法,写一下,后边便于复习和期末课程设计引用。艾特金加速法本质上和史蒂芬森加速方法是相同的,因此实现史蒂芬森加速法即可,对代码稍加修改即可实现艾特金加速法。

    % 史蒂芬森加速迭代法求根的matlab算法 function [X_k,x0,counter]=steffensen(a,err,f_x) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %输入参数a为迭代初值 % %输入参数err为误差精度 % %输入参数f_x为不动点迭代函数,即满足x=f_x(x)的函数 % %输出参数X_k为迭代序列 % %输出参数x0为满足精度要求的根 % %输出参数counter为迭代的次数 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% counter=0;%计数器初始化 X_k=(0);%序列初始化 while(sign(f_x(a))==0)%如果a的函数值为0停止迭代输出x0为a的值,迭代次数为0 x0=a; X_k(1)=a; counter=0; return; end while(sign(f_x(a))~=0)%a的函数不为零进行迭代 X_k(counter+1)=a;%将a赋给序列第一个值并作为第一个初值 Y_k=f_x(X_k(counter+1));%不动点迭代求第二个初值 Z_k=f_x(Y_k);%不动点迭代求第三个初值 a=X_k(counter+1)-( Y_k-X_k(counter+1)).^2./(Z_k-2*Y_k+X_k(counter+1));%用史蒂芬森加速方法加速迭代 counter=counter+1;%每迭代一次计数器加一 X_k(counter+1)=a;%将当前值赋值给序列 if(abs(X_k(counter+1)-X_k(counter))>=err)%精度判断 steffensen(a,err,f_x);%不满足精度时递归调用迭代函数本身进行迭代 else x0=a;%将满足误差精度要求得a赋值给x0 return; end end end

    引用实列 计算 f(x)=x^3-x-1=0在1.5附近的根,误差不大于0.0001

    等价变形得到x=x^3-1 不动点迭代函数f_x=x^3-1 调用函数f=@(x)x^3-1 [X_k,x0,counter]=steffensen(1.5,0.0001,f)

    结果

    特别说明:

    即使迭代法不收敛,用斯蒂芬森加速法仍可能收敛。本实例的不动点迭代函数若采用常规的迭代法,得到的是不收敛序列,但此处采用加速法,可以得到收敛序列。 至于原来已收敛的迭代法,由定理可知它可达到2阶收敛。更进一步还可知若为p阶收敛,则斯蒂芬森加速法为p+1阶收敛。

    转载请注明出处!

    Processed: 0.009, SQL: 9