Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Labaratornaya_3.doc-1061178363.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
109 Кб
Скачать
☆

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]