Matlab Newbie Binary Search Устранение неполадок - PullRequest
0 голосов
/ 06 августа 2011

Я новичок в Matlab / программировании в целом. Я хочу написать программу / скрипт, который использует рекурсивный бинарный поиск для аппроксимации корня $ 2x - 3sin (x) + 5 = 0 $, так что итерация завершается, когда ошибка усечения определенно $ <0.5 \ times 10 ^ { -5} $ и распечатать количество итераций, а также оценку корня. </p>

Вот моя попытка, которая, кажется, сломала мой компьютер ...

%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 ]

1 голос
/ 06 августа 2011

Как только вы установили высокий = средний или низкий = средний, вычисляются ли средние значения и f_mid?Похоже, вы потерпите неудачу, если f_low> 0 и f_high <0.Это допустимое условие, но вы выбираете неправильное для сброса в этом случае.Кроме того, ваша проверка завершения находится на значении функции, а не на разнице между низким и высоким.Это может быть то, что вы хотите, или, может быть, вы хотите проверить оба пути.Для <em>очень плоских функций вы не сможете получить значение функции столь маленькое.

0 голосов
/ 06 августа 2011

Вам не нужно f_mid, и фактически вас вводит в заблуждение. Вам просто нужно рассчитать значение на каждом шаге и посмотреть, в каком направлении идти.

Плюс, вы просто меняете низкие и высокие, но вы не оцениваете снова f_low или f_high. Matlab не является системой алгебры (есть модули для символьных вычислений, но это другая история), поэтому вы не определили f_low и f_high для изменения со сменой низко и высоко: вы должны пересмотреть их в своем последний цикл

...