matlab 实现对分区间法 解非线性方程

参考《数值计算方法》中的例题

 实现代码:

%非线性方程及非线性方程组的解法
%oppositeDividing method for intervals 对分区间法
%author LijiaYi(foddcus) FaFu university 2022.3 
%email:foddcus@163.com
%输入:单未知数的多次方程组 如x^3-4x-3=0输入[1,0,-4,-3],errorA:误差允许范围 ,numF、numE:设定区间的点
%输出:其中某个解

%注意,区间内默认只有一个零点
%%
clear all
input=[1,0,10,-20]
errorA=0.5*10^-4;
numF=1;
numE=2;
%function output=OppositeDividingMFI(input,errorA,numF,numE)

[~,Mnum]=size(input)
syms f(x);%定义函数
syms f_1(x)
y=input(1,1)*x^(Mnum-1)%构造函数
for i= 2:Mnum
    y=input(1,i)*x^(Mnum-i)+y
end
f(x)=y;
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

%计算对分区间所需要的次数
Num_need_min=ceil(((log(numE-numF)-log(errorA))/log(2))-1);
if f(numF)>0%这里转换一下,numF表示f(numF)小于零的值
    b=numF
    numF=numE
    numE=b
    clear b
end

for round=1:Num_need_min
    numM=(numF+numE)/2;
    output(round,1:5)=[round,numF,numE,numM,double(f(numM))];
    if f(numM)>0
        numE=numM;
        
    else
        numF=numM;
    end
    if numM==0
        break
    end
end
if output(1,2)>output(1,3)%调整表格顺序
    k=output(:,2);
    output(:,2)=output(:,3);
    output(:,3)=k;
    clear k
end     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值