Главная » Статьи » Программирование в Delphi |
Решение уравнений методом дихотомии Немного теории. Алгоритм решения уравнений по этому методу:
На форме располагаются: Edit1, Edit2, Edit3 - ввод a, b, e Код модуля представлен ниже: 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. | |
Просмотров: 2283 | Комментарии: 2 | |
Всего комментариев: 0 | |