Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
unit Runge;
interface
type
Vector=array [1..4] of Extended;
Function q(time:Extended) : Extended;
Function Dq(time:Extended) : Extended;
Procedure Deriv(time:Extended; x:Vector; var Dx:Vector);
procedure RK(t,h:Extended; Y:Vector; var DY:Vector);
var
m1,m2,c1,c2,k1,k2:Extended;
tk,t,h, q0,omega_q:Extended;
omega1,omega2:Extended;
ksi1,ksi2:Extended;
eta1,eta2:Extended;
gamma:Extended;
implementation
uses Perturb;
var
KK1,KK2,KK3,KK4:Vector;
Function q(time:Extended) : Extended;
begin
Result:=QQ[Trunc(time/h)];
end;
Function Dq(time:Extended) : Extended;
begin
Result:=QQ[Trunc(time/h)+1];
end;
Procedure Deriv(time:Extended; x:Vector; var Dx:Vector);
begin
Dx[1] := x[2];
Dx[2] :=-eta1*(x[2]-x[4])-sqr(omega1)*(x[1]-x[3]);
Dx[3] := x[4];
Dx[4] := gamma*(eta1*(x[2]-x[4])+sqr(omega1)*(x[1]-x[3]))-
eta2*(x[4]-Dq(time))-sqr(omega2)*(x[3]-q(time));
end;
procedure RK(t,h:Extended; Y:Vector; var DY:Vector);
var
tY:Vector;
i:integer;
begin
for i:=1 to 4 do
tY[i]:=Y[i];
Deriv(t,tY,KK1);
for i:=1 to 4 do
tY[i]:=Y[i]+h/2*KK1[i];
Deriv(t+h/2,tY,KK2);
for i:=1 to 4 do
tY[i]:=Y[i]+h/2*KK2[i];
Deriv(t+h/2,tY,KK3);
for i:=1 to 4 do
tY[i]:=Y[i]+h*KK3[i];
Deriv(t+h,tY,KK4);
DY[1]:=Y[1]+h/6*(KK1[1]+2*KK2[1]+2*KK3[1]+KK4[1]);
DY[2]:=Y[2]+h/6*(KK1[2]+2*KK2[2]+2*KK3[2]+KK4[2]);
DY[3]:=Y[3]+h/6*(KK1[3]+2*KK2[3]+2*KK3[3]+KK4[3]);
DY[4]:=Y[4]+h/6*(KK1[4]+2*KK2[4]+2*KK3[4]+KK4[4]);
end;
end.
interface
type
Vector=array [1..4] of Extended;
Function q(time:Extended) : Extended;
Function Dq(time:Extended) : Extended;
Procedure Deriv(time:Extended; x:Vector; var Dx:Vector);
procedure RK(t,h:Extended; Y:Vector; var DY:Vector);
var
m1,m2,c1,c2,k1,k2:Extended;
tk,t,h, q0,omega_q:Extended;
omega1,omega2:Extended;
ksi1,ksi2:Extended;
eta1,eta2:Extended;
gamma:Extended;
implementation
uses Perturb;
var
KK1,KK2,KK3,KK4:Vector;
Function q(time:Extended) : Extended;
begin
Result:=QQ[Trunc(time/h)];
end;
Function Dq(time:Extended) : Extended;
begin
Result:=QQ[Trunc(time/h)+1];
end;
Procedure Deriv(time:Extended; x:Vector; var Dx:Vector);
begin
Dx[1] := x[2];
Dx[2] :=-eta1*(x[2]-x[4])-sqr(omega1)*(x[1]-x[3]);
Dx[3] := x[4];
Dx[4] := gamma*(eta1*(x[2]-x[4])+sqr(omega1)*(x[1]-x[3]))-
eta2*(x[4]-Dq(time))-sqr(omega2)*(x[3]-q(time));
end;
procedure RK(t,h:Extended; Y:Vector; var DY:Vector);
var
tY:Vector;
i:integer;
begin
for i:=1 to 4 do
tY[i]:=Y[i];
Deriv(t,tY,KK1);
for i:=1 to 4 do
tY[i]:=Y[i]+h/2*KK1[i];
Deriv(t+h/2,tY,KK2);
for i:=1 to 4 do
tY[i]:=Y[i]+h/2*KK2[i];
Deriv(t+h/2,tY,KK3);
for i:=1 to 4 do
tY[i]:=Y[i]+h*KK3[i];
Deriv(t+h,tY,KK4);
DY[1]:=Y[1]+h/6*(KK1[1]+2*KK2[1]+2*KK3[1]+KK4[1]);
DY[2]:=Y[2]+h/6*(KK1[2]+2*KK2[2]+2*KK3[2]+KK4[2]);
DY[3]:=Y[3]+h/6*(KK1[3]+2*KK2[3]+2*KK3[3]+KK4[3]);
DY[4]:=Y[4]+h/6*(KK1[4]+2*KK2[4]+2*KK3[4]+KK4[4]);
end;
end.