Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с методом Адамса в delphi(лазарус)

49K
15 декабря 2011 года
fedor12
13 / / 01.12.2011
Проблема в следующем.
Дано x y начяльные, шаг и количество шагов
Есть рабочий метод Рунгекута
надо получить значения для 4 точек.
Рунгекута вроде правильно работает, хотя я в математике не бум бум, но Адамса карявит сразу же((
И решить методом Адамса.
Подставил формулу которую дал препод:Yk+1=Yk+h(55f(k)-59f(k-1)+37f(k-2)-9f(k-3))/24
Но значения неподходят
Вот код

Код:
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.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог