![]() |
![]() |
||||
![]() | |||||
![]() |
![]() АЛГОРИТМЫ Новости Рассылка новостей Форум AlgoPascal Редактор блок-схем Статьи О сайте Контакты |
![]() |
![]() Корень уравнения x = F(x) - модифицированный метод итерацийПроцедура находит корень уравнения модифицированным методом итерации. Условие сходимости в этом методе отличается от условия в методе простой итерации. Процесс сходится к значению x' при условии, что в некоторый момент |F(x)-x'| |F''(x')| < 2|F'(x')-1|. Следующее приближение определяется по формулам:
Чтобы избежать зацикливания функция прекращает работу после n итераций. Переменная HasRoot = True если необходимая точность e достигнута менее чем за n итераций, параметр m показывает, сколько раз поправка превосходила предыдущую. Если разность F(xi )-xi имела одно и тоже значение дважды подряд, то HasRoot = False. Так же HasRoot = False, если необходимая точность за n итераций недостигнута. Если нашли ошибку в алгоритме - сообщите! Реализации алгоритма на различных языках:![]() ![]() ![]() Блоксхемы:![]() ![]() Реализация алгоритма на AlgoPascal:unit FEqXModifiedIterationUnit; declaration function F(X:Real):Real; interface FEqXModifiedIteration; implementation (* Корень уравнения x=F(x) - модифицированный метод итераций. procedure FEqXModifiedIteration( n:integer; e:real; xn:real; var HasRoot:boolean, x:real) Функция находит корень уравнения x=F(x) методом модифицированной итерации с относительной погрешностью e. В качестве начального приближения берется x0. функция прекращает работу после n итераций. ременная HasRoot=True если необходимая точность e достигнута менее чем за n итераций, и HasRoot=False, если необходимая точность за n итераций недостигнута. *) procedure FEqXModifiedIteration( const n : Integer; const e : Real; const a : real; out HasRoot:Boolean; out x : Real); var J : Integer; g : Real; b : Real; c : Real; d : Real; h : Real; begin HasRoot:=True; x:=a; g:=F(x); b:=g-a; d:=b; c:=b; if AbsReal((F(g)-g)/g)>=e then begin j:=1; HasRoot:=False; while j<=n do begin x:=g; c:=F(x)-g; if AbsReal(c)<AbsReal(g)*e then begin HasRoot:=True; j:=n+1; end else begin h:=b/c; b:=c; if AbsReal(h-1)<e then begin j:=n+1; end else begin d:=d/(h-1); g:=g+d; end; end; j:=j+1; end; end; end; end. |
![]() |
|
|
![]() |