开发者

Matlab Newbie Binary Search Troubleshoot

I am a newbie to Matlab/programming in general. I wish to write a program/script that uses recursive binary search to approximate the root of $2x - 3sin(x)+5=0$, such that the iteration terminates once the truncation error is definitely $< 0.5 \times 10 ^{-5}$ and print out the number of iterations as well as the estimate of the root.

Here is my attempt that seems to have broken my computer...

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

%Define variables

low = input('Enter lower bo开发者_如何学Gound 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)

I haven't even added in the number-of-iterations counting bit (which I am not quite sure how to do) and already I am stuck.

Thanks for any help.


Once you set high=mid or low=mid, is mid and f_mid recalculated? It looks like you will fail if f_low>0 and f_high<0. This is a valid condition, but you are choosing the wrong one to reset in this case. Also, your termination check is on the function value, not the difference between low and high. This may be what you want, or maybe you want to check both ways. For very flat functions you may not be able to get the function value that small.


You don't need f_mid, and is in fact misleading you. You just need to calculate the value at each step, and see which direction to go.

Plus, you are just changing low and high, but you do not evaluate again f_low or f_high. Matlab is not an algebra system (there are modules for symbolic computation, but that's a different story), so you did not define f_low and f_high to change with the change of low and high: you have to reevaluate them in your final loop.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜