Вот код есть. Необходимо решить уравения 3 методами: хорд, Ньютона, делением пополам. Всё сделал кроме Ньютона.Там надо вычислить
начальное приближение, чего вот я не знаю. Помогите кто может доработать. Пожалуйста
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Series, Math,
XPMan;
type
TForm1 = class(TForm)
Met_Del: TRadioButton;
Met_Hord: TRadioButton;
Met_Kasat: TRadioButton;
Make_Grapf: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Chart1: TChart;
Series1: TLineSeries;
Edit3: TEdit;
Label3: TLabel;
Result: TButton;
Edit4: TEdit;
Label4: TLabel;
XPManifest1: TXPManifest;
Memo1: TMemo;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
procedure Make_GrapfClick(Sender: TObject);
procedure Met_DelClick(Sender: TObject);
procedure Met_KasatClick(Sender: TObject);
procedure Met_HordClick(Sender: TObject);
procedure ResultClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
x:real;
implementation
Uses Unit2;
{$R *.dfm}
function Kasat(a:real):real;
begin
kasat:=0.6*exp(3*ln(a))-2.3*a-3;
end;
function KasatP(a:real):real;
begin
kasatP:=0.6*exp(3*ln(a))*ln(3)-2.3;
end;
function KasatPP(a:real):real;
begin
kasatPP:=0.6*exp(3*ln(a))*sqr(ln(3));
end;
function hord(b:real):real;
begin
hord:=0.25*sqr(b)*b+b-1.25;
end;
function del(c:real):real;
begin
del:=sqrt(1-c)-cos(sqrt(1-c));
end;
procedure TForm1.Make_GrapfClick(Sender: TObject);
var x,xn,xk,dx:real;
begin
Series1.Clear;
dx:=StrToFloat(Edit3.Text);
if (Edit1.Text<>'') and (Edit2.Text<>'')then
begin
//Метод деление отрезка пополам
if Met_Del.Checked=true then
begin
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
x:=xn;
repeat
if (x>=0) then
begin
series1.AddXY(x,del(x),'',clRed);
x:=x+dx;
end
until (x>=xk);
end;
//Метод хорд
if Met_Hord.Checked=true then
begin
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
x:=xn;
repeat
series1.AddXY(x,hord(x),'',clRed);
x:=x+dx;
until (x>xk);
end;
//Метод касательных
if Met_Kasat.Checked=true then
begin
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
x:=xn;
repeat
series1.AddXY(x,kasat(x),'',clRed);
x:=x+dx;
until (x>xk);
end;
end
else MessageBox(0,'Введите все параметры!','Внимание!',MB_ICONINFORMATION+MB_OK);
end;
procedure TForm1.Met_DelClick(Sender: TObject);
begin
Edit1.Text:='0';
Edit2.Text:='1';
Edit4.Text:='0';
Edit4.Visible:=false;
Label4.Visible:=false;
end;
procedure TForm1.Met_KasatClick(Sender: TObject);
begin
Edit1.Text:='2';
Edit2.Text:='3';
Edit4.Text:='0';
Edit4.Visible:=true;
Label4.Visible:=true;
end;
procedure TForm1.Met_HordClick(Sender: TObject);
begin
Edit1.Text:='0';
Edit2.Text:='2';
Edit4.Text:='0';
Edit4.Visible:=false;
Label4.Visible:=false;
end;
procedure TForm1.ResultClick(Sender: TObject);
var c, x0, x1, eps, a, b, h:real;
begin
if (Edit1.Text<>'') and (Edit2.Text<>'') and (Edit4.Text<>'')then
begin
//Метод деление отрезка пополам
if Met_Del.Checked=true then
begin
eps:=StrToFloat(Edit3.Text);
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
if (b>1) and (a>1) then MessageBox(0,'Недопустимое значение параметра: под корнем отрицательное число!','Внимание!',MB_ICONINFORMATION+MB_OK)
else
begin
repeat
c:=(a+b)/2;
if del(a)*del(c)<0 then b:=c else {a:=c;}
if del(b)*del(c)<0 then a:=c;
until b-a<=eps;
c:=(a+b)/2;
Memo1.Clear;
Memo1.Lines.Add('Ответ:');
Memo1.Lines.Add('X = '+FloatToStrF(c,ffFixed,6,4));
end;
end;
//Метод хорд
if Met_Hord.Checked=true then
begin
eps:=StrToFloat(Edit3.Text);
c:=StrToFloat(Edit2.Text);
x1:=StrToFloat(Edit1.Text);
repeat
x0:=x1;
x1:=(c*hord(x0)-x0*hord(c))/(hord(x0)-hord(c));
until abs(hord(x1)-hord(x0))<=eps;
Memo1.Clear;
Memo1.Lines.Add('Ответ:');
Memo1.Lines.Add('X = '+FloatToStrF(x1,ffFixed,6,4));
end;
//Метод касательных
if Met_Kasat.Checked=true then
begin
eps:=StrToFloat(Edit3.Text);
x0:=StrToFloat(Edit1.Text);
x1:=StrToFloat(Edit4.Text);
repeat
x0:=x1;
h:=kasat(x1)/kasatP(x1);
x1:=x0-h;
until abs(kasat(x0)-kasat(x1))<eps;
Memo1.Clear;
Memo1.Lines.Add('Ответ:');
Memo1.Lines.Add('X = '+FloatToStrF(x1,ffFixed,6,4));
end;
end
else MessageBox(0,'Введите все параметры!','Внимание!',MB_ICONINFORMATION+MB_OK);
end;
end.