Пример восьмой. Нахождение корня функции.
Здесь описан метод половинного деления (дитохомии?). Суть проста. Есть функция
f(x), есть интервал [a,b], есть условие, что на концах промежутка функция имеет
разный знак: f(a)*f(b)<0. Требуется найти с заданной точностью eps корень этой
функции. Поступаем так: выбираем середину отрезка [a,b]. Если в середине функция
имеет тот же знак что и слева, то принимаем середину за новую левую границу,
в противном случае - за правую. Повторяем до тех пор, пока отрезок не станет
меньше eps. В данном примере в качестве функции берем синус, а отрезок -
[3,4]. Таким образом мы должны найти число пи.
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.
Нахождение суммы цифр натурального числа.
var s,k,d:integer;
begin
k:=4367;
s := 0;
write(' The sum of dights of ',k);
while k>0 do
begin
d:=k mod 10;
s:=s+d;
k:=k div 10;
end;
writeln(' equals ',s);
end.
 
 
 
 
 
 
|