{                    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.


