在找到每个根之前进行了多少次递归?另外,哪些是根?
这是我的代码:
e=0.000001;
f1=@(x) 14.*x.*exp(x-2)-12.*exp(x-2)-7.*x.^3+20.*x.^2-26.*x+12;
a=0;
c=3;
while abs(c-a)>e
b=(c+a)/2;
if f1(a)*f1(b)<0
c=b;
else
a=b;
end
disp(b);
end
在找到每个根之前进行了多少次递归?另外,哪些是根?
这是我的代码:
e=0.000001;
f1=@(x) 14.*x.*exp(x-2)-12.*exp(x-2)-7.*x.^3+20.*x.^2-26.*x+12;
a=0;
c=3;
while abs(c-a)>e
b=(c+a)/2;
if f1(a)*f1(b)<0
c=b;
else
a=b;
end
disp(b);
end
二分法的工作原理是取某个初始区间的端点[a,b]
并找出区间的哪一半必须包含根(它评估中点,并确定哪一半有符号变化)。然后二等分在已识别的一半上重复该过程。
二分法仅收敛于一个可能的根,如果您的函数内部有多个根[a,b]
,则通常很难预测它将收敛到哪个特定根。(注意:由于二分法是一个完全确定的算法,如果你给它相同的初始间隔,它总是会收敛到完全相同的根。)迭代只是细化你找到的根的近似值,它们不会找到多个根。
要直接回答您的问题,二分法不会在内部发现函数的所有三个根[0,3]
。它只会找到一个根,这由二分代码的最终迭代来识别。二等分迭代输出的所有值都简单地显示了算法朝着它最终找到的一个根所取得的进展(并且这些值应该是收敛于最终值的序列)。
二分法的算法是这样的,它只能在定义的区间之间找到一个根。在您的问题中,无法找到所有三个根,但是如果您定义不同的间隔来找出各个根,您可能会成功。您可以通过具有完整理论背景和示例的 Matlab 中的二分法示例程序。