Консультация № 179769
23.08.2010, 19:16
0.00 руб.
0 1 1
Здравствуйте, необходима помощь в решении задачи на языке делфи:
разработайте шаблон приложения для вычисления с точностью eps корня уравнения f(x)=0 на отрезке [A,B] методами дихотомии для трех различных функций. Рекомендации: разместите на форме компоненты edit для ввода A,B и Eps, компоненты radiobutton для выбора метода решения, компоненты для вывода сообщений

Обсуждение

Неизвестный
24.08.2010, 11:55
общий
это ответ
Здравствуйте, Torres.
Предлагаю нижеуказанный алгоритм решения
На форме: 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.
Форма ответа