0

一般来说,我是 Matlab/编程的新手。我希望编写一个程序/脚本,它使用递归二进制搜索来近似 $2x - 3sin(x)+5=0$ 的根,这样一旦截断错误肯定是 $< 0.5 \times 10 ^{ -5}$ 并打印出迭代次数以及根的估计值。

这是我的尝试,似乎破坏了我的计算机...

%Approximating the root of f(x) = 2*x  - 3*sin(x) + 5 by binary search

%Define variables

low = input('Enter lower bound of range: ');

high = input('Enter upper bound of range: ');

mid = (low + high)/2;


%Define f_low & f_high

f_low = 2*low  - 3*sin(low) + 5;

f_high = 2*high  - 3*sin(high) + 5;

f_mid = 2*mid  - 3*sin(mid) + 5;


%Check that the entered range contains the key

while (f_low * f_high) > 0 || low > high

     disp('Invalid range')

     low = input('Enter lower bound of range: ');

     high = input('Enter upper bound of range: ');

end



%The new range

while abs(f_mid) > 0.5*10^(-5)



    if f_mid < 0

     low = mid;



    elseif f_mid > 0

      high = mid;

    end   



end



fprintf('mid = %.4f \n', mid)

我什至没有添加迭代次数计数位(我不太确定该怎么做)并且我已经被卡住了。

谢谢你的帮助。

4

2 回答 2

1

设置 high=mid 或 low=mid 后,是否会重新计算 mid 和 f_mid?如果 f_low>0 和 f_high<0,看起来你会失败。这是一个有效条件,但在这种情况下您选择了错误的条件来重置。此外,您的终止检查是针对函数值,而不是低和高之间的差异。这可能是您想要的,或者您可能想同时检查两种方式。对于非常平坦的函数,您可能无法获得那么小的函数值。

于 2011-08-06T14:48:27.710 回答
0

你不需要f_mid,实际上是在误导你。你只需要计算每一步的值,然后看看往哪个方向走。

另外,您只是在更改低和高,但您不会再次评估f_lowf_high。Matlab 不是代数系统(有用于符号计算的模块,但那是另一回事),因此您没有定义f_lowf_high随着低和高的变化而改变:您必须在最终循环中重新评估它们。

于 2011-08-06T14:48:04.170 回答