АЛГОРИТМЫ

Новости

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

Форум

AlgoPascal

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

Статьи

О сайте

Контакты



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

Корень уравнения F(x) = 0 методом дихотомии

Процедура находит корень уравнения F(x) = 0, где F(x) - непрерывная на отрезке [a,b] функция, удовлетворяющая условию F(a)F(b) < 0. Для нахождения корня отрезок [a,b] делится пополам и выбирается тот полуинтервал, на концах которого знаки F(x) разные. Затем процесс деления повторяется до тех пор, пока длина интервала не станет меньше e.

Если начальное условие F(a)F(b) < 0 не выполнено, то процедура прекращает работу и переменной HasRoot присваивается значение False. Если корень найден, то HasRoot становится равным True, и корень находится в переменной x.

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



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

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

Блоксхемы:

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


Реализация алгоритма на AlgoPascal:

unit SearchRootDichotomyUnit;

declaration
    function F(X:Real):Real;

interface
    SearchRootDichotomy;
implementation
(*
Корень уравнения метод половинного деления.

procedure SearchRootDichotomy(e:real,a,b:real; var HasRoot:boolean, x:real)

Процедура находит корень уравнения F(x)=0, где F(x) -
непрерывная на отрезке [a,b] функция, удовлетворяющая условию
F(a)F(b)<0.

Для нахождения корня отрезок [a,b] делится пополам и выбирается
тот полуинтервал на концах которого знаки F(x) разные. Затем
процесс деления повторяется до тех пор, пока длина интервала
не станет меньше e.

Если начальное условие F(a)F(b) < 0 не выполнено, то процедура
прекращает работу и переменной HasRoot присваивается значение
False. Если корень найден, то HasRoot=True, и корень находится
в переменной x.
*)
procedure SearchRootDichotomy(
            a   :   Real;
            b   :   Real;
    const   e   :   Real;
    out     HasRoot:Boolean;
    out     x   :   Real);
var
    f1  :   Real;
    f2  :   Real;
    fx  :   Real;
begin
    f1:=F(a);
    f2:=F(b);
    if f1*f2>0 then
    begin
        HasRoot:=False;
    end
    else
    begin
        HasRoot:=True;
        repeat
            x:=(a+b)/2;
            fx:=F(x);
            if f1*fx>0 then
            begin
                a:=x;
                f1:=fx;
            end
            else
            begin
                b:=x;
                f2:=fx;
            end;
        until not(AbsReal(a-b)>e);
        x:=(a+b)/2;
    end;
end;



end.

 


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