unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs ,unit2,
StdCtrls, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
TV = class(TMyGaad )
x:real;
y:real;
yMas:array[1..100] of real;
xMas:array[1..100] of real;
h:real;
public
procedure qwe(x0,y0,h0:real;ind1:integer); Override;
procedure Myqwe(x0,y0,h0:real;ind1:integer);
procedure Yyy();
function f(x0,y0:real):real;
end;
var
Form1: TForm1;
My:TV;
PT:TMyGaad;
implementation
{ TForm1 }
procedure Tv.Yyy();
var
k1,k2,k3,k4:real;
begin
k1 := -(h * y);
k2 := -(h * (y + k1 / 2));
k3 := -(h * ( y + k2 / 2));
k4 := -(h * ( y + k3));
y := y + 1 / 6 * (k1 + 2 * k2 + 2 * k3 + k4);
end;
function Tv.f(x0,y0:real):real;
begin
f:=-y0;
end;
//Метод Рунге кута
procedure Tv.qwe (x0,y0,h0:real;ind1:integer);
var
ind2:integer;
begin
x:=x0;
y:=y0;
h:=h0;
FOR ind2:=1 to ind1 DO
BEGIN
yMas[ind2]:= y;
xMas[ind2]:= x;
Yyy();
x:=x+h;
END;
end;
//Метод Адамса
procedure Tv.Myqwe (x0,y0,h0:real;ind1:integer);
var
ind2:integer;
f1,f2,f3:real;
begin
h:=h0;
FOR ind2:=5 to ind1 DO
BEGIN
y:=yMas[ind2-1]+h*((55*f(xMas[ind2-1],yMas[ind2-1]))-(59*f(xMas[ind2-2],yMas[ind2-2]))+(37*f(xMas[ind2-3],yMas[ind2-3]))-(9*f(xMas[ind2-4],yMas[ind2-4])) )/24;
x:=x+h;
yMas[ind2]:=y;
xMas[ind2]:=x;
END;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ind1:integer;
h0,x0,y0:real;
begin
x0:=StrToInt(Edit1.Text);
y0:=StrToInt(Edit2.Text);
h0:=StrToFloat(Edit3.Text);
ind1:=StrToInt(Edit4.Text);
My:=Tv.Create;
My.qwe(x0,y0,h0,4);
My.Myqwe(x0,y0,h0,ind1);
x0:=My.x;
y0:=My.y;
My.Free;
Edit1.Text:=FloatToStr(x0);
Edit2.Text:=FloatToStr(y0);
end;
initialization
{$I unit1.lrs}
end.
Проблема с методом Адамса в delphi(лазарус)
Дано x y начяльные, шаг и количество шагов
Есть рабочий метод Рунгекута
надо получить значения для 4 точек.
Рунгекута вроде правильно работает, хотя я в математике не бум бум, но Адамса карявит сразу же((
И решить методом Адамса.
Подставил формулу которую дал препод:Yk+1=Yk+h(55f(k)-59f(k-1)+37f(k-2)-9f(k-3))/24
Но значения неподходят
Вот код
Код: