Matlab新手二进制搜索疑难解答

时间:2011-08-06 13:29:00

标签: numerical-methods matlab

我是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)

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

设置高=中或低=中,是中期和f_mid重新计算?如果f_low&gt; 0和f_high&lt; 0,您似乎会失败。这是一个有效的条件,但在这种情况下,您选择了错误的重置。此外,您的终止检查是在功能值上,而不是低和高之间的差异。这可能是你想要的,或者你想要检查两种方式。对于非常平面函数,您可能无法获得小的函数值。

答案 1 :(得分:0)

您不需要f_mid,实际上误导了您。您只需计算每一步的值,并查看要走的方向。

另外,您只是在改变低和高,但您不再评估f_lowf_high。 Matlab不是一个代数系统(有符号计算的模块,但这是一个不同的故事),所以你没有定义f_lowf_high来改变低和高的变化:你必须在最后一个循环中重新评估它们。