参考《数值计算方法》中的例题
实现代码:
%非线性方程及非线性方程组的解法
%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