Показать сообщение отдельно

  #9  
Старый 27.09.2009, 12:11
Dosia
Участник форума
Регистрация: 05.06.2009
Сообщений: 127
С нами: 8912059

Репутация: 249
По умолчанию

По итерациям что то вроде того:

Код:
program Iteraz;
uses graph,crt;
var
a,b,x1,x,f1,f2,e:real;
i,n:integer;

function ArcSin ( X : Real ): Real;
begin
if X = 1.0 then { чтобы не было деления на 0 }
ArcSin := Pi / 2.0
else
ArcSin := ArcTan ( X / Sqrt ( 1 - X * X ) );
end;

function f(tmpX:real):real;
begin
f:=sqrt(1*tmpX*tmpX)-ArcSin(tmpX);
end;

begin
a:=0;
b:=0.99;
x1:=a;
f1:=f(x1);
e:=0.001;
n:=round((b-a)/e);
writeln('Metod iterazii');
for i:=1 to n do begin
x:=x1+(b-a)/n;
f2:=f(x);
if f1*f2<=0 then begin
writeln('Done. X = ',(X+x1)/2:6:4);
writeln('Kolichectvo iterazii = ',i);
end;
x1:=x;f1:=f2;
end;

readkey;
end.
Метод итераций.
При решении нелинейного уравнения методом итераций воспользуемся записью уравнения в виде x=f(x). Задаются начальное значение аргумента x0 и точность e. Первое приближение решения x1 находим из выражения x1=f(x0), второе - x2=f(x1) и т.д. В общем случае i+1 приближение найдем по формуле xi+1 =f(xi). Указанную процедуру повторяем пока |f(xi)-xi| >eУсловие сходимости метода итераций |f'(x)<1| . Структограмма метода итераций:



Не знаю корректно ли работает программа, но я в свое время её сдал ;D

Если подставить в качестве верхнего предела 1, то будет переполнение.

По сути все верно, так как если изменить интервал, то программа вообще не найдет решения.

Другой вариант:

Код:
program ITERAT;
uses crt;

const max_iter=100;   {максимальное количество итераций}

var
 i :integer;
 x,x0,eps,M:real;

function ArcSin ( X : Real ): Real;
begin
if X = 1.0 then { чтобы не было деления на 0 }
ArcSin := Pi / 2.0
else
ArcSin := ArcTan ( X / Sqrt ( 1 - X * X ) );
end;


function F(tmpX:real):real; {функция}
 begin
   f:=sqrt(1*tmpX*tmpX)-ArcSin(tmpX);
 end;

begin {основная программа}
clrscr;
x:=0;
x0:=0.99;
eps:=0.001;

 i:=0;
 repeat
   M:=-(F(x+eps)-F(x-eps))/(2*eps); {коэффициент для улучшения сходимости}
   x0:=x;
   x:=x0+F(x0)/M; {сердце метода итераций}
   inc(i);
 until (abs(x-x0)<=eps)or(i>max_iter);

 if (abs(x-x0)<=eps) then writeln('Otvet: X= ',x:6:4,' naiden za ',i,' shagov')
 else writeln('Otvet ne naiden! Za ',max_iter:0,' shagov.');

readkey;
end.
Программа взята отсюда и немного подредактирована.

Последний раз редактировалось Dosia; 27.09.2009 в 13:08..
 
Ответить с цитированием