АЛГОРИТМЫ

Новости

Рассылка новостей

Форум

AlgoPascal

Редактор блок-схем

Статьи

О сайте

Контакты



Содержание - Уравнения общего вида и полиномиальные - Модифицированный метод итераций

Корень уравнения x = F(x) - модифицированный метод итераций

Процедура находит корень уравнения модифицированным методом итерации. Условие сходимости в этом методе отличается от условия в методе простой итерации. Процесс сходится к значению x' при условии, что в некоторый момент |F(x)-x'| |F''(x')| < 2|F'(x')-1|. Следующее приближение определяется по формулам:

  • x = a; xi+1  = x+d
  • d = F(x)-x; d = di-1 /(hi-1 )
  • h = (F(xi-1 )-xi-1 )/(F(x)-x)

Чтобы избежать зацикливания функция прекращает работу после n итераций. Переменная HasRoot = True если необходимая точность e достигнута менее чем за n итераций, параметр m показывает, сколько раз поправка превосходила предыдущую. Если разность F(x)-x имела одно и тоже значение дважды подряд, то HasRoot = False. Так же HasRoot = False, если необходимая точность за n итераций недостигнута.

Если нашли ошибку в алгоритме - сообщите!



Реализации алгоритма на различных языках:

Реализация алгоритма на C++
Реализация алгоритма на Delphi
Реализация алгоритма на Visual Basic 6

Блоксхемы:

Посмотреть блок-схему алгоритма
Скачать блок-схему алгоритма


Реализация алгоритма на 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.

 


Бочканов Сергей, Быстрицкий Владимир
Copyright © 1999-2004
При поддержке проекта MANUAL.RU