{ Sharaevskiy G.I. AV-01 } Program laba_3; Uses Crt,Graph; Var t :real; YY : array [0..500] of real; XX : array [0..500] of real; hh : array [0..500] of real; hho : array [0..500] of real; p,c :integer; gd,gm : integer; xold,yold : integer; xnew,ynew : integer; i,r,w,o:integer; gy,gx,g,f:real; z,k :integer; {-----------------------------Y1-------------------------------} Function Y1( h , x ,y : real ): real; Var K0, K1: real; begin K0:=0; K1:=0; K0:=h*(y-2*x); K1:=h*( (y+K0/2)-2*(x+h/2) ); Y1:= y+1/256*(K0+255*K1); end; {-----------------------------X1-------------------------------} Function X1( h , x ,y : real ): real; Var K0, K1: real; begin K0:=0; K1:=0; K0:=h*(2*y-3*x); K1:=h*( 2*(y+K0/2)-3*(x+h/2) ); X1:= y+1/256*(K0+255*K1); end; Procedure yra0; Var i:integer; g,Xt,t:real; z,k :integer; Begin initgraph(gd,gm,''); SetColor(DarkGray); SetLineStyle(0,0,0); z:=0; for K := 1 to 15 do begin Line(50,40+z,550,40+z); z:=z+25; end; z:=0; for K := 1 to 21 do begin Line(50+z,40,50+z,390); z:=z+25; end; setcolor(15); Rectangle(0, 0, GetMaxX, GetMaxY); Rectangle(2, 2, GetMaxX-2, GetMaxY-2); line(300,20,300,420); line(30,240,610,240); outtextxy(297,17,'^'); outtextxy(609,237,'>'); outtextxy(610,253,'X'); outtextxy(316,20,'Y'); outtextxy(310,250,'0'); outtextxy(545,253,'10'); outtextxy(35,253,'-10'); setcolor(15); for i:=1 to 21 do line(i*25+25,240,i*25+25,245); for i:=1 to 15 do line(295,(round(i*25+15)),300,(round(i*25+15))); readln; t:=-4; i:=1; SetColor(6); SetLineStyle(0,0,3); {*} Xt:= (5*(Exp(-t))); MoveTo (300+round(t*25),240-round(Xt*25)); while (t<=10) do begin {*} Xt:= (5*(Exp(-t))); if (t>=0) then begin SetColor(4); SetLineStyle(0,0,3); end; if (t>=4) then begin SetColor(6); SetLineStyle(0,0,3); end; LineTo (300+round(t*25),240-round(Xt*25)); t:=t+0.04; inc(i); end; readln; closegraph; end; {-------------------------------- Ramka ---------------------------------} Procedure Ramka; Var x,y : integer; Begin textcolor(15); for x := 1 to 80 do begin gotoxy(x,1); write('═'); gotoxy(x,24); write('═'); end; for y := 1 to 24 do begin gotoxy(1,y); write('║'); gotoxy(80,y); write('║'); end; gotoxy(1,1); write('╔'); gotoxy(1,24); write('╚'); gotoxy(80,1); write('╗'); gotoxy(80,24); write('╝'); End; {------------------------------yra1-----------------------------------} Procedure yra1; Const b=4; e=0.001; Var h,y,x,a0,a1,a2,Tk, Ho :real; a0y,a1y,a2y,a0x,a1x,a2x:real; g,jx,jy,f :real; i :integer; r :integer; p :integer; v :integer; Begin Clrscr; Ho:=0.004; h:=Ho; t:=0; Tk:=0; g:=0; c:=1; YY[1]:=5; XX[1]:=5; jy:=5; jx:=5; w:=0; o:=0; while t <= b do begin hho[c]:=ho; repeat a0y:=0; a0x:=0; a1y:=0; a1x:=0; a2y:=0; a2x:=0; x:=jx; y:=jy; jx:=0; jy:=0; {====================} t:=Tk+ho; {1y} h:=ho; a1y:=Y1(h,x,y); {1x} h:=ho; a1x:=X1(h,x,y); {====================} t:=Tk+ho/2; {2y} h:=ho/2; a0y:=Y1(h,x,y); {2x} h:=ho/2; a0x:=X1(h,x,y); {====================} t:=Tk+ho; {3y} h:=ho/2; a2y:=Y1(h,x,a0y); {3x} h:=ho/2; a2x:=X1(h,x,a0x); {====================} {4y} if (abs(a1y)<=1) or (abs(a1x)<=1) then begin gx:=abs(a1x-a2x); gy:=abs(a1y-a2y); end; if (abs(a1y)>1) or (abs(a1x)>1) then begin gx:=(abs(a1x-a2x)/abs(a1x)); gy:=(abs(a1y-a2y)/abs(a1y)); end; g:=gy; { writeln('gy=',gy:8:7); writeln('gx=',gx:8:7); } if gx<=gy then g:=gx else g:=gy; w:=w+1; if (g < e) then break else Ho:=ho/2; until (g < e); jy:=a2y-(a1y-a2y); jx:=a2x-(a1x-a2x); yy[c+1]:=jy; xx[c+1]:=jx; hh[c]:=Tk; inc(c); g:=4*g; if g>(e/4) then begin Tk:=Tk+ho; end else begin Tk:=Tk+ho; Ho:=2*Ho; end; g:=0; gy:=0; gx:=0; if ho<=0.0004 then ho:=0.0004; if ho>=1 then ho:=1; o:=o+1; end; writeln(o); writeln(w); readln; Begin initgraph(gd,gm,''); SetColor(DarkGray); SetLineStyle(0,0,0); z:=0; for K := 1 to 17 do begin Line(45,20+z,300,20+z); z:=z+25; end; z:=0; for K := 1 to 11 do begin Line(50+z,20,50+z,420); z:=z+25; end; setcolor(15); Rectangle(0, 0, GetMaxX, GetMaxY); Rectangle(2, 2, GetMaxX-2, GetMaxY-2); line(50,10,50,440); line(30,420,330,420); outtextxy(47,7,'^'); outtextxy(330,417,'>'); outtextxy(330,429,'t'); outtextxy(20,20,'Y,X'); outtextxy(240,430,' 4'); outtextxy(44,430,' 0'); setcolor(15); for i:=1 to 11 do line(i*25+25,420,i*25+25,425); for i:=1 to 17 do line(45,(round(i*25-5)),50,(round(i*25-5))); readln; t:=0; MoveTo (50+round(t*25),420-round( 1 *25.5)); SetColor(6); SetLineStyle(0,0,1); Line(350, 100, 400, 100); MoveTo(410, 95); OutText('Точное решение системы'); t:=0; f:= (5/(exp(t))); MoveTo (50+round(t*50),420-round(f*50)); t:=0; i:=1; while t <= 4 do begin f:= (5/(exp(t))); LineTo (50+round(t*50),420-round(f*50)); t:=t+0.01; inc(i); end; readln; SetColor(4); SetLineStyle(0,0,1); Line(350, 200, 400, 200); MoveTo(410, 195); OutText('Решение 1-го уравн системы'); {1} MoveTo (50+round(hh[1]*50),420-round(xx[1]*50)); t:=0; p:=2; while t <= 4 do begin LineTo (50+round(hh[p]*50),420-round(xx[p]*50)); inc(p); if hh[p]>3.99 then break; end; readln; SetColor(17); SetLineStyle(0,0,1); Line(350, 300, 400, 300); MoveTo(410, 295); OutText('Решение 2-го уравн системы'); {2} MoveTo (50+round(hh[1]*50),420-round(yy[1]*50)); t:=0; p:=2; while t <= 4 do begin LineTo (50+round(hh[p]*50),420-round(yy[p]*50)); inc(p); if hh[p]>3.99 then break; end; End; readln; CloseGraph; End; {------------------------------uyra2-----------------------------------} Procedure yra2Y; var d,h: integer; m,n: real; Begin ramka; textcolor(15); gotoxy(35,1); writeln('Y'); gotoxy(5,2); writeln('|-----|---------|---------|---------|------------|---------|---------|'); gotoxy(5,3); Writeln('| № | Tk | Y(Tk) | Yk |(Y(Tk)-Yk)% | h | |'); gotoxy(5,4); writeln('|-----|---------|---------|---------|------------|---------|---------|'); d:=1; h:=1; for i:=1 to c-1 do begin {№} gotoxy (7,5+d); writeln(i); {H} gotoxy (13,5+d); writeln(hh[i]:5:4); {Y(Xk)} gotoxy (23,5+d); m:=YY[i]; writeln(m:5:4); {Yk} gotoxy (33,5+d); n:=5/(exp(hh[i])); writeln(n:5:4); {Y(Xk)- Yk} gotoxy (45,5+d); writeln((n-m)*100:5:4); {Ho} gotoxy (57,5+d); writeln(hho[i]:5:4); if h=17 then begin d:=0; h:=0; readln; end; inc(d); inc(h); end; if i=c-1 then begin gotoxy (5,5+d); writeln('|-----|---------|---------|---------|------------|---------|---------|'); gotoxy (2,6+d); textcolor(15+blink); writeln(' The end. '); end; readln; end; {------------------------------uyra2X-----------------------------------} Procedure yra2X; var d,h: integer; m,n: real; Begin Clrscr; ramka; textcolor(15); gotoxy(35,1); writeln('X'); gotoxy(5,2); writeln('|-----|---------|---------|---------|------------|---------|---------|'); gotoxy(5,3); Writeln('| № | Tk | X(Tk) | Xk |(X(Tk)-Xk)% | h | |'); gotoxy(5,4); writeln('|-----|---------|---------|---------|------------|---------|---------|'); d:=1; h:=1; for i:=1 to c-1 do begin {№} gotoxy (7,5+d); writeln(i); {H} gotoxy (13,5+d); writeln(hh[i]:5:4); {X(Xk)} gotoxy (23,5+d); m:=XX[i]; writeln(m:5:4); {Xk} gotoxy (33,5+d); n:=5/(exp(hh[i])); writeln(n:5:4); {X(Tk)-Xk} gotoxy (45,5+d); writeln((n-m)*100:5:4); {Ho} gotoxy (57,5+d); writeln(hho[i]:5:4); if h=17 then begin d:=0; h:=0; readln; end; inc(d); inc(h); end; if i=c-1 then begin gotoxy (5,5+d); writeln('|-----|---------|---------|---------|------------|---------|---------|'); gotoxy (2,6+d); textcolor(15+blink); writeln(' The end. '); end; readln; writeln(w-o); readln; end; {------------------------------uyra3--------------------------------------} Procedure yra3; Var i,f:integer; g,x:real; z :integer; Begin initgraph(gd,gm,''); z:=0; SetColor(DarkGray); for i:=1 to 50 do begin Line(50+z,370,50+z,30); z:=z+11; end; z:=0; SetColor(15); for i:=1 to 50 do begin Line(50+z,300,50+z,305); z:=z+11; end; i:=0; z:=0; SetColor(DarkGray); for i:=1 to 20 do begin Line(50,372-z,590,372-z); z:=z+18; end; z:=0; SetColor(15); for i:=1 to 20 do begin Line(45,372-z,50,372-z); z:=z+18; end; setcolor(15); Rectangle(0, 0, GetMaxX, GetMaxY); Rectangle(2, 2, GetMaxX-2, GetMaxY-2); line(50,20,50,420); line(30,300,610,300); outtextxy(47,17,'^'); outtextxy(609,297,'>'); outtextxy(60,310,'0'); outtextxy(47+150+150+150+80,310,'50'); outtextxy(20,30,'15'); outtextxy(20,370,'-4'); z:=0; SetColor(6); SetLineStyle(0,0,3); MoveTo (50,300-(round ((5/(exp(hh[1]))) - (XX[1])))*19); for i := 1 to C-1 do begin lineTo((50+z),300-(round(((5/(exp(hh[i]))) - (XX[i]))*1000))); z:=z+3; end; readln; SetColor(4); SetLineStyle(0,0,3); z:=0; MoveTo (50,300-(round ((5/(exp(hh[1]))) - (YY[1])))*19); for i := 1 to C-1 do begin lineTo((50+z),300-(round(((5/(exp(hh[i]))) - (YY[i]))*1000))); z:=z+3; end; readln; End; {-------------------------The Main---------------------------------------} Begin yra0; yra1; yra2Y; yra2X; yra3; End.