matlab 牛顿法(Newton)与弦截法的迭代实现 解非线性方程

原理参考丁丽娟的《数值计算方法》P273-277

%非线性方程及非线性方程组的解法
%Newton 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
syms input_c(x)
input_c=sin(x)-x;
%input_c=[1,0,10,-20]
errorA=0.1*10^-5;
numF=0;
numE=1;
maxN=20;
stef=0; %用于加速的steffensen方法的开关,为1时使用该方法
method=3;%1为牛顿法默认公式,2、3,为适合有多重根的另外两种计算公式
%如果是模式2,还需要得知多重根的个数
%一般使用method2或3就与steffensen方法可能会产生冲突

%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
    disp('可能有多重根')
end
%检查其中多重根个数,看单调性,若为多重根自动转模式3
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
    method=3
end

%%

syms Xm(x)
syms stefF(x)


if method==1
    Xm(x)=x-f(x)/f_1(x);%经典牛顿法,适用于唯一根,否则迭代速度太慢
elseif method==2
    rValue=input('多重根的值')
    Xm(x)=x-rValue*f(x)/f_1(x);%已知多重根数量迭代公式
elseif method==3
    Xm(x)=x-f(x)*f_1(x)/((f_1(x))^2-f(x)*diff(f_1(x)));%未知多重根数量
end
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);
    elseif 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

输出解释:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值