3 Схема алгоритма
calc
Нет
Да
tp=
tp+hp
Нет
Да
ymax:=abs(y[2])
Ris
y[1];
y[2]; d[1]; d[2]; t;n;
да
Нет
Да
Рисунок 2 – Схема алгоритма программы для решения обыкновенного дифференциального уравнения
4 Паскаль-программа
Program DIFUR;
Uses Crt,graph;
type mas = array[1..10] of real;
Var
p:pointer;
size:word;
Smax,Vmax,Timax,T1,T2,T3,T4,T5,C1,C2,C3,C4,C5,d1,d2,d3,d4,d5:string[40];
GraphDriver, GraphMode:integer;
ErrorCode:integer;
rez:text;
a: char;
d,y,y1:mas;
m,b,c,F,h,hp,t,tp,tmax,hmax,ymax,yymax,nx,ny,nmax,yst:real;
n:integer;
nd,j:byte;
{===================================================}
Procedure podklgraph;
begin
GraphDriver := Detect;
InitGraph(GraphDriver, GraphMode, 'e:\tp7\bin');
ErrorCode := GraphResult;
if ErrorCode <> grOK then
begin
Writeln('Graphics error: ', GraphErrorMsg(ErrorCode));
Halt(1);
end;
end;
Procedure Prav(var y,d:mas);
begin
d[1]:=(F-b*y[1]-c*SQRT(y[2]))/m;
d[2]:=y[1];
end;
{================================================}
Procedure Rynge;
var
j:byte;
yy,k:array[1..10] of real;
begin
Prav(y,d);
For j:=1 to nd do
begin
yy[j]:=y[j];
k[j]:=h*d[j];
y1[j]:=yy[j]+0.5*k[j];
y[j]:=y[j]+k[j]/6;
end;
t:=t+0.5*h;
Prav(y1,d);
For j:=1 to nd do
begin
k[j]:=h*d[j];
y1[j]:=yy[j] + 0.5*k[j];
y[j]:=y[j] + k[j]/3;
end;
Prav(y1,d);
For j:=1 to nd do
begin
k[j]:=h*d[j];
y1[j]:=yy[j] + k[j];
y[j]:=y[j] + k[j]/3;
end;
t:=t+0.5*h;
Prav(y1,d);
For j:=1 to nd do
begin
k[j]:=h*d[j];
y[j]:=y[j] + k[j]/6;
end;
end;
{================================================}
Procedure Start;
begin
clrscr;
Writeln;
Writeln('Rechenie differencialnogo yravnenia metodom Runge-Kutta');
Writeln(' Rachet vupolnil:student gruppi 101071 Ivan Byivid');
Writeln('Isxodnie dannie');
Write('m=');
Readln(m);
Write('b=');
Readln(b);
Write('c=');
Readln(c);
Write('F=');
Readln(F);
Write('tmax=');
readln(tmax);
y[1]:=0; y[2]:=0;
d[1]:=0; d[2]:=0;
nd:=2; t:=0; tp:=0; ymax:=0; yymax:=0;
yst:=F/c;
hp:=tmax/20; h:=tmax/500;
nmax:=tmax/h; nx:=500/nmax;
ClrScr;
Assign(REZ,'out.txt');
Rewrite(REZ);
Writeln(REZ,'Rechenie differencialnogo yravnenia metodom Runge-Kutta');
Writeln(REZ,' Rachet vupolnil:Ivan Byivid gr.101071');
Writeln(rez,'Isxodnie dannie');
Write(rez,' m = ',m:7:3);
Writeln(rez,' b = ',b:7:3);
Write(rez,' c = ',c:7:3);
Writeln(rez,' F = ',F:7:3);
Writeln(rez,' Shag scheta h = ',h:7:3);
Writeln(rez,' Shag pechati hp = ',hp:7:3);
Writeln(rez,' Vrema scheta tmax = ',tmax:7:3);
Writeln(REZ);
writeln(rez,'---------------------------------------------------');
writeln(rez,' Tablica reshenia differencialnogo yravnenia ');
writeln(rez,'---------------------------------------------------');
writeln(rez,' t | y | y` | y " | ');
writeln(rez,'---------------------------------------------------');
end;
{=================================================}
Procedure Calc;
begin
While t <= tmax + h do
begin
If t>=tp then
begin
Writeln(rez,' ', t:6:2,' ', y[2]:7:3,' ', y[1]:7:3,' ',d[1]:7:3,' ');
tp:=tp+hp;
end;
Rynge;
If ymax < abs(y[2]) then ymax:=abs(y[2]);
if yymax<abs(y[1]) then yymax:=abs(y[1]);
if yymax>ymax then
hmax:=yymax
else
hmax:=ymax;
end;
ny:=128/hmax;
Writeln(REZ,'---------------------------------------------------');
end;
{================================================}
Procedure cvet(x,z:word);
begin
SetColor(x);
SetBkColor(z);
NormVideo;
end;
Procedure Setkagraphica;
begin
cvet(3,0);
For n:=0 to 10 do
begin
Line(50+n*50,20,50+n*50,340);
Line(50,20+n*32,550,20+n*32);
OutTextXY(560,180,'t,cek');
OutTextXY(35,180,'0');
end;
OutTextXY(40,10,'Y,Y`');
str(hmax/4:2:2,C1);
str(2*hmax/4:2:2,C2);
str(3*hmax/4:2:2,C3);
str(4*hmax/4:2:2,C4);
str(5*hmax/4:2:2,C5);
str((-hmax)/4:2:2,d1);
str(2*(-hmax)/4:2:2,d2);
str(3*(-hmax)/4:2:2,d3);
str(4*(-hmax)/4:2:2,d4);
str(5*(-hmax)/4:2:2,d5);
str(tmax/5:2:1,T1);
str(2*tmax/5:2:1,T2);
str(3*tmax/5:2:1,T3);
str(4*tmax/5:2:1,T4);
str(5*tmax/5:2:1,T5);
cvet(6,3);
OutTextXY(9,148,C1);
OutTextXY(9,116,C2);
OutTextXY(9,84,C3);
OutTextXY(9,52,C4);
OutTextXY(9,20,C5);
OutTextXY(9,212,d1);
OutTextXY(9,244,d2);
OutTextXY(9,276,d3);
OutTextXY(9,308,d4);
OutTextXY(9,340,d5);
OutTextXY(138,190,T1);
OutTextXY(238,190,T2);
OutTextXY(338,190,T3);
OutTextXY(438,190,T4);
OutTextXY(538,190,T5);
end;
{================================================}
Procedure Ostanov;
begin
a:=ReadKey;
end;
{============================================}
Procedure Ris;
begin
y[1]:=0; y[2]:=0; d[1]:=0; d[2]:=0;
t:=0; n:=0;
podklgraph;
Setkagraphica;
cvet(6,15);
While t <= tmax+h/2 do
begin
PutPixel(40+n,180-round(ny*y[2]),4);
PutPixel(40+n,180-round(ny*y[1]),4);
PutPixel(40+n,180-round(ny*yst),4);
Rynge;
n:=n+round(nx);
If n >= 550 then Ostanov;
end;
OutTextXY(560,180-round(ny*y[2]),'Y');
OutTextXY(560,180-round(ny*y[1]),'Y`');
OutTextXY(570,180-round(ny*yst),'Yst');
Str(tmax:5:2,Timax);
Str(ymax:7:3,Smax);
Str(yymax:7:3,Vmax);
OutTextXY(100,380,'Ymax ='); OutTextXY(155,380,Smax);
OutTextXY(250,380,'Y`max ='); OutTextXY(305,380,Vmax);
OutTextXY(400,380,'Tmax ='); OutTextXY(455,380,Timax);
Ostanov;
close(rez);
end;
{================================================}
begin
Start;
Calc;
podklgraph;
Ris;
CloseGraph;
end.
