function f(x:real):real; begin f:=sin(x); end; const MaxSteps=200; var a0,b0,a,b,eps,fa,fb,t,ft:real; step,sa,sb:integer; begin writeln('Нахождение корней функции методом половинного деления:'); a0:=3; {writeln(' Input a0: ');readln(a0);} b0:=4; {writeln(' Input b0: ');readln(b0);} eps:=0.0000001; {writeln(' Input eps: ');readln(eps);} fa:=f(a0); fb:=f(b0); if (fa*fb>0) then begin writeln(' На заданном промежутке корней нет.'); halt; end; a:=a0; b:=b0; step:=0; t:=a; ft:=fa; while (abs(b-a)>eps) and (step<MaxSteps) do begin inc(step); t:=(a+b)/2; ft:=f(t); if (fa*ft>0) then begin fa:=ft; a:=t; end else b:=t; writeln('step:',step:4,' t=',t,' f(t)=',ft); end; if (step>MaxSteps) then writeln('Отсутствие сходимости. Уточните промежуток.') else writeln('Найден корень с заданной точностью.'); end.
среда, 28 апреля 2010 г.
Нахождение корня функции.
Здесь описан метод половинного деления (дитохомии?). Суть проста. Есть функция f(x), есть интервал [a,b], есть условие, что на концах промежутка функция имеет разный знак: f(a)*f(b)<0. Требуется найти с заданной точностью eps корень этой функции. Поступаем так: выбираем середину отрезка [a,b]. Если в середине функция имеет тот же знак что и слева, то принимаем середину за новую левую границу, в противном случае - за правую. Повторяем до тех пор, пока отрезок не станет меньше eps. В данном примере в качестве функции берем синус, а отрезок - [3,4]. Таким образом мы должны найти число пи.
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий