unit uRunge;
interface
Uses ComCtrls;
Type

TQu = record
x1,x2,x3,x4 : Double;
t : Double;
end;

TVect = array of TQu;

TRunge = class
private
X0 : TQu;
m1,m2,c1,c2,k1,k2: Double;
w1,w2,r1,r2,g: Double;
public
h,T,q,Wq : Double;
Values : TVect;
Size: Integer;
procedure Step(mode :Boolean; t,q :Double);
constructor Create(m1 : Double; m2 : Double; c1 : Double;c2 : Double;k1 : Double;k2 : Double;x01 : Double;x02 : Double;x03 : Double;x04 : Double;h : Double;T : Double;q : Double;wq : Double);
procedure Run(mode :Boolean);
end;

implementation

procedure TRunge.Step(mode :Boolean; t,q :Double);
var
k: array [1..4,1..4] of Double;
begin
FillChar(k,16,0);
if mode then
begin
k[1,1] := h * X0.x2;
k[1,2] := h * (-r1 * (X0.x2 - X0.x4) - w1*w1 * (X0.x1 - X0.x3));
k[1,3] := h * X0.x4;
k[1,4] := h * (g * (r1 * (X0.x2 - X0.x4) + w1*w1 * (X0.x1 - X0.x3)) -
r2 * (X0.x4 - q * wq * cos(wq * t)) - w2*w2 * (X0.x3 - q * sin(wq * t)));

k[2,1] := h * (X0.x2 + 0.5 * k[1][2]);
k[2,2] := h * (-r1 * (X0.x2 + 0.5 * k[1][2] - X0.x4 - 0.5 * k[1][4]) -
w1*w1 * (X0.x1 + 0.5 * k[1][1] - X0.x3 - 0.5 * k[1][3]));
k[2,3] := h * (X0.x4 + 0.5 * k[1][4]);
k[2,4] := h * (g * (r1 * (X0.x2 + 0.5 * k[1][2] - X0.x4 - 0.5 * k[1][4]) +
w1*w1 * (X0.x1 + 0.5 * k[1][1] - X0.x3 - 0.5 * k[1][3])) -
r2 * (X0.x4 + 0.5 * k[1][4]) - w2*w2 * (X0.x3 + 0.5 * k[1][3]));

k[3,1] := h * (X0.x2 + 0.5 * k[2][2]);
k[3,2] := h * (-r1 * (X0.x2 + 0.5 * k[2][2] - X0.x4 - 0.5 * k[2][4]) -
w1*w1 * (X0.x1 + 0.5 * k[2][1] - X0.x3 - 0.5 * k[2][3]));
k[3,3] := h * (X0.x4 + 0.5 * k[2][4]);
k[3,4] := h * (g * (r1 * (X0.x2 + 0.5 * k[2][2] - X0.x4 - 0.5 * k[2][4]) +
w1*w1 * (X0.x1 + 0.5 * k[2][1] - X0.x3 - 0.5 * k[2][3])) -
r2 * (X0.x4 + 0.5 * k[2][4]) - w2*w2 * (X0.x3 + 0.5 * k[2][3]));

k[4,1] := h * (X0.x2 + k[3][2]);
k[4,2] := h * (-r1 * (X0.x2 + k[3][2] - X0.x4 - k[3][4]) -
w1*w1 * (X0.x1 + k[3][1] - X0.x3 - k[3][3]));
k[4,3] := h * (X0.x4 + k[3][4]);
k[4,4] := h * (g * (r1 * (X0.x2 + k[3][2] - X0.x4 - k[3][4]) +
w1*w1 * (X0.x1 + k[3][1] - X0.x3 - k[3][3])) -
r2 * (X0.x4 + k[3][4]) - w2*w2 * (X0.x3 + k[3][3]));
end
else
begin
k[1][1] := h * X0.x2;
k[1][2] := h * (-r1 * (X0.x2 - X0.x4) - w1*w1 * (X0.x1 - X0.x3));
k[1][3] := h * X0.x4;
k[1][4] := h * (g * (r1 * (X0.x2 - X0.x4) + w1*w1 * (X0.x1 - X0.x3)) -
r2 * X0.x4 - w2*w2 * X0.x3);

k[2][1] := h * (X0.x2 + 0.5 * k[1][2]);
k[2][2] := h * (-r1 * (X0.x2 + 0.5 * k[1][2] - X0.x4 - 0.5 * k[1][4]) -
w1*w1 * (X0.x1 + 0.5 * k[1][1] - X0.x3 - 0.5 * k[1][3]));
k[2][3] := h * (X0.x4 + 0.5 * k[1][4]);
k[2][4] := h * (g * (r1 * (X0.x2 + 0.5 * k[1][2] - X0.x4 - 0.5 * k[1][4]) +
w1*w1 * (X0.x1 + 0.5 * k[1][1] - X0.x3 - 0.5 * k[1][3])) -
r2 * (X0.x4 + 0.5 * k[1][4]) - w2*w2 * (X0.x3 + 0.5 * k[1][3]));

k[3][1] := h * (X0.x2 + 0.5 * k[2][2]);
k[3][2] := h * (-r1 * (X0.x2 + 0.5 * k[2][2] - X0.x4 - 0.5 * k[2][4]) -
w1*w1 * (X0.x1 + 0.5 * k[2][1] - X0.x3 - 0.5 * k[2][3]));
k[3][3] := h * (X0.x4 + 0.5 * k[2][4]);
k[3][4] := h * (g * (r1 * (X0.x2 + 0.5 * k[2][2] - X0.x4 - 0.5 * k[2][4]) +
w1*w1 * (X0.x1 + 0.5 * k[2][1] - X0.x3 - 0.5 * k[2][3])) -
r2 * (X0.x4 + 0.5 * k[2][4]) - w2*w2 * (X0.x3 + 0.5 * k[2][3]));

k[4][1] := h * (X0.x2 + k[3][2]);
k[4][2] := h * (-r1 * (X0.x2 + k[3][2] - X0.x4 - k[3][4]) -
w1*w1 * (X0.x1 + k[3][1] - X0.x3 - k[3][3]));
k[4][3] := h * (X0.x4 + k[3][4]);
k[4][4] := h * (g * (r1 * (X0.x2 + k[3][2] - X0.x4 - k[3][4]) +
w1*w1 * (X0.x1 + k[3][1] - X0.x3 - k[3][3])) -
r2 * (X0.x4 + k[3][4]) - w2*w2 * (X0.x3 + k[3][3]));
end;
X0.x1 := X0.x1 + ( k[1,1] + 2*k[2,1] + 2*k[3,1] + k[4,1] ) / 6;
X0.x2 := X0.x2 + ( k[1,2] + 2*k[2,2] + 2*k[3,2] + k[4,2] ) / 6;
X0.x3 := X0.x3 + ( k[1,3] + 2*k[2,3] + 2*k[3,3] + k[4,3] ) / 6;
X0.x4 := X0.x4 + ( k[1,4] + 2*k[2,4] + 2*k[3,4] + k[4,4] ) / 6;
X0.t := t;
Size := Size + 1;
SetLength(Values,Size);
Values[Size-1] := X0;
end;

constructor TRunge.Create(m1 : Double; m2 : Double; c1 : Double;c2 : Double;k1 : Double;k2 : Double;x01 : Double;x02 : Double;x03 : Double;x04 : Double;h : Double;T : Double;q : Double;wq : Double);
begin
self.m1 := m1;
self.m2 := m2;
self.c1 := c1;
self.c2 := c2;
self.k1 := k1;
self.k2 := k2;
self.X0.x1 := x01;
self.X0.x2 := x02;
self.X0.x3 := x03;
self.X0.x4 := x04;
self.h := h;
self.T := T;
self.q := q;
self.Wq := wq;
Self.w1 := sqrt(c1/m1);
Self.w2 := sqrt(c2/m2);
Self.r1 := k1/m1;
Self.r2 := k2/m2;
Self.g := m1/m2;
Size := 0;
end;

procedure TRunge.Run(mode :Boolean);
var
tt,q: Double;
begin
tt := 0;
q := self.q;
while tt<=self.T do
begin
Step(mode,tt,q);
q := self.q * sin(wq*tt);
tt := tt + h;
end;
end;

end.
Соседние файлы в папке Конечные_Системы(4,5)