Приветствую Вас, Гость
Главная » Статьи » Программирование в Delphi

Решение уравнений методом дихотомии

Решение уравнений методом дихотомии

Немного теории.

Алгоритм решения уравнений по этому методу:

 

На форме располагаются:

Edit1, Edit2, Edit3 - ввод a, b, e
Edit4 - корень, Edit5 - значение функции
RadioButton1 - выбор функции, в его строках нужно написать текстовое обозначение функций.
Button1 - запуск программы
П
ри отсутствии корней на данном отрезке - выводится текст в Edit4, Edit5 (Нет решений).

Код модуля представлен ниже:

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ExtCtrls;

 

type

 

  TForm1 = class(TForm)

    Button1: TButton;

    Label1: TLabel;

    Edit1: TEdit;

    Edit2: TEdit;

    Label2: TLabel;

    Edit4: TEdit;

    Label3: TLabel;

    RadioGroup1: TRadioGroup;

    Label4: TLabel;

    Edit3: TEdit;

    Edit5: TEdit;

    Label5: TLabel;

    function F(X : Double):Double;

    procedure SearchRootDichotomy(a:Double; b:Double; e: Double; var HasRoot : Boolean; var x : Double; var fx : Double);

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

uses Math; // подключаем модуль для разных функций

 

// Вычисление функции в зависимости от индекса

function TForm1.F(X : Double):Double;

begin

  Result := cos(x - ln(x));

 

  case RadioGroup1.ItemIndex of     // Вычисляем функцию в зависимости от индекса

  0: Result := cos(x - ln(x));       // 1-я функция

  1: Result := sin(x - ln(x));       // 2-я функция

  2: Result := x - ln(x);            // 3-я функция

  end;

 

end;

 

 // процедура нахождения корня в зависимости от a, b, e. Возвращает результат операции, значение корня, значение функции

 

procedure TForm1.SearchRootDichotomy(a:Double; b:Double; e: Double; var HasRoot : Boolean; var x : Double; var fx : Double);

var

    f1 : Double;

    f2 : Double;

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 b := x;

 

        until  not (Abs(fx)>e);      // выполняем до тех пор пока модуль F(x) не станет меньше или равен e

    end;

end;

 

 

procedure TForm1.Button1Click(Sender: TObject);

  var a1, b1, e1, x1, fx1: Double;

  HasRoot1: boolean;

 

begin

  if RadioGroup1.ItemIndex = -1 then

    begin

    ShowMessage('Выберите функцию');

    exit;

    end;

 

  try

    a1 := StrToFloat(Edit1.Text);     // Проверяем введенные значения

    b1 := StrToFloat(Edit2.Text);

    e1 := StrToFloat(Edit3.Text);

  except

    ShowMessage('Введите допустимые числа');

    exit;

  end;

 

  SearchRootDichotomy(a1, b1, e1, HasRoot1, x1, fx1);

    if HasRoot1 then begin        // Если есть решения

    Edit4.Text := Format('%10.6f', [x1]);

    Edit5.Text := Format('%10.6f', [fx1])

    end

    else

    begin                      // Если нет решения

    Edit4.Text := 'Нет решения';

    Edit5.Text := 'Нет решения';

    end;

end;

 

end.


Категория: Программирование в Delphi | Добавил: mihalych_2013 (02.01.2014)
Просмотров: 2220 | Комментарии: 2 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: