matlab 简单迭代法 steffensen加速方法 数值计算方法 求非线性方程解

该方法的证明与讨论请参考丁丽娟的《数值计算方法》P265-P273

%非线性方程及非线性方程组的解法
%simple iteration method 简单迭代法
%author LijiaYi(foddcus) FaFu university 2022.3 
%email:foddcus@163.com
%输入:单未知数的多次方程组 如x^3-4x-3=0输入[1,0,-4,-3],
%errorA:误差允许范围 ,numF、numE:设定区间的点,max:最大迭代次数
%输出:关于解的表格,第一列为迭代次数,第二列为当前迭代解,第三列为当前带入迭代解的值
%注意,区间内默认只有一个零点
%%
clear all
input_c=[1,0,10,-20]
errorA=0.1*10^-5;
numF=1;
numE=2;
maxN=20;
stef=0;%用于简单迭代法加速的steffensen方法的开关,为1时使用该方法
%function output=simpleIM(input,errorA,numF,numE,maxN)
syms f(x);%定义函数
 syms f_1(x)
if string(class(input_c))=='double'%对其进行判断,double属性和syms定义的输入建立不同的方程。
    [~,Mnum]=size(input_c)

    y=input_c(1,1)*x^(Mnum-1);%构造函数
    for i= 2:Mnum
        y=input_c(1,i)*x^(Mnum-i)+y;
    end
    f(x)=y;
elseif string(class(input_c))=='sym'
    f(x)=input_c;
end


if f(numF)*f(numE)>0
    error('not satisfy requirement')
end
%检查其中是否有唯一实根,看单调性
f_1(x)=diff(f(x));
x=numF:(numE-numF)/100:numE;
rangY=double(f_1(x));
logicY=max(max(rangY))*min(min(rangY));
if logicY<0
    error('non-monotonic');
end
clear x
syms x
syms Xm(x)
syms stefF(x)

%迭代方式
Xm(x)=-input_c(1,end);
sub=0;
for i= 1:Mnum-1
    sub=input_c(1,i)*x^(Mnum-i)+sub;
end
Xm(x)=Xm(x)/(sub/x);
stefF(x)=x-((Xm(x)-x)^2)/(Xm(Xm(x))-2*Xm(x)+x);
%%
Xn=(numF+numE)/2;
output(1,1:3)=[0,Xn,double(f(Xn))];
for i=1:maxN
    if stef==0
    Xn=Xm(Xn);
    end
    if stef==1
    Xn=stefF(Xn);%steffensen方法
    end
    output(i+1,1:3)=[i,Xn,f(Xn)];
    if abs(output(i,2)-Xn)<errorA
        break
    end
end
   
    
    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值