该方法的证明与讨论请参考丁丽娟的《数值计算方法》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