Показать сообщение отдельно
  #1  
Старый 09.04.2012, 20:51
Thiago Thiago вне форума
Прохожий
 
Регистрация: 09.04.2012
Сообщения: 1
Репутация: 10
По умолчанию не получается график лямбда от x для ур-ния ван дер поля

Собственно построить биффуркационную диаграмму(т.е. зависимость параметра l(так обозначил лямбду) от х). Сам дельфи осваивать начал недавно, программа получилась кривая, так что не судите строго. Решил ур. ВдП методом рунге кутта, дальше насколько понял - надо сделать 3 цикла - по l,в нем по времени, в этом еще по иксу. В программе еще 2 графика - фазовый портрет и временная реализация, но главное построить этот. Помогите, если кто может
Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, StdCtrls, Buttons;
 
type
  TForm1 = class(TForm)
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    LabeledEdit3: TLabeledEdit;
    Chart1: TChart;
    Chart2: TChart;
    Chart3: TChart;
    Series1: TPointSeries;
    Series2: TPointSeries;
    Series3: TPointSeries;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure Chart1DblClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  l,w:double;
 
implementation
 
{$R *.dfm}
 
 
function dx(x,y:double):double;
begin
result:=y;
end;
 
function dy(x,y:double):double;
begin
result:=(l-x*x)*y-w*w*x;
end;
 
procedure runge(var x,y:double);
const
dh=0.05;
var
k1,k2,k3,k4,
l1,l2,l3,l4,
q1,q2,q3,q4:double;
begin
k1:=dx(x,y);
l1:=dy(x,y);
 
 
k2:=dx(x+dh*k1/2,y+dh*q1/2);
l2:=dy(x+dh*k1/2,y+dh*q1/2);
 
 
k3:=dx(x+dh*k2/2,y+dh*q2/2);
l3:=dy(x+dh*k2/2,y+dh*q2/2);
 
 
k4:=dx(x+dh*k3,y+dh*q3);
l4:=dy(x+dh*k3,y+dh*q3);
 
 
x:=x+dh*(k1+2*k2+2*k3+k4)/6;
y:=y+dh*(l1+2*l2+2*l3+l4)/6;
 
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var
t_stop,time,x,y:double;
begin
Chart1.Series[0].Clear;
l:=StrToFloat(LabeledEdit1.Text);
w:=StrToFloat(LabeledEdit2.Text);
 
t_stop:=30000;
 
 While l<5 do
  begin
  x:=0.1;
  y:=0.1;
 
  time:=0;
    While time<t_stop do
      begin
      runge(x,y);
      if time>25000 then
      Chart1.Series[0].AddXY(l,x);
      time:=time+1;
      //Application.ProcessMessages;
      end;
      //Chart1.Series[0].AddXY(l,x);
  l:=l+0.1;
 end;
 
end;
 
 
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
halt;
end;
 
procedure TForm1.Chart1DblClick(Sender: TObject);
var x,z,y,t_stop1,time1: double;
begin
Chart2.Series[0].Clear;
Chart3.Series[0].Clear;
Chart1.Series[0].GetCursorValues(l,x);
z:=0.1;
y:=0.1;
t_stop1:=2000;
time1:=0.1;
 while time1<t_stop1 do
  begin
  runge(x,y);
  Chart2.Series[0].AddXY(y,z);
  Chart3.Series[0].AddXY(time1,x);
  Application.ProcessMessages;
  time1:=time1+0.1;
end;
end;
 
 
end.
Ответить с цитированием