Программа


{ Решение дифура y'=f(x,y)
  при известных начальных условиях
  x0, y0=f(x0) методом Эйлера
  с выводом графика }
USES Crt,Graph;                   { Подключение модулей }
CONST PathToDriver='';            { Путь к графическому драйверу }
VAR Exit:boolean;                 { Флаг выхода из программы }
    GraphDriver:Integer;          { Графический драйвер }
    GraphMode:Integer;            { Графический режим }
Function Derivative(X,Y:real):real;  { Производная }
  Begin
    Derivative:=2*X
  End;
Function DifRunKutt(X,Y,Step:real):real;
                                 { Вычисление значения исходной функции }
  Begin
    DifRunKutt:=Y+Step*(Derivative(X,Y)+4*Derivative(X+Step/2,Y)+
                Derivative(X+Step,Y))/6   { Определение значения функции }
  End;
PROCEDURE OutGraph (X0,Y0,Right,Step:real); { Процедура вывода графика }
  Var ScaleX,ScaleY:real; { Масштабы по осям X и Y }
      MaxY,MinY:real;     { Максимальное и минимальное значения координаты Y }
      i:integer;          { Счетчик }
      BufY:real;  { Буферная переменная для сохранения значения координаты Y }
      OXy,OYx:real; { Y-координата оси OX, X-соордината оси OY }
  Begin
    SetColor(White);  { Установка белого цвета }
    Rectangle(0,0,GetMaxX,GetMaxY); { Прорисовка рамки }
    ScaleX:=(Right-X0)/(GetMaxX*8)*10; {Вычисление масштаба по оси X }
    if ScaleX=0 then ScaleX:=1;
                { Если масштаб по оси X равен 0, то переопределение масштаба }
{ Поиск максимального и минимального значений функции на выводимом промежутке: }
    MaxY:=Y0;       { Начальное определение максимума }
    MinY:=MaxY;     { Начальное определение минимума }
    BufY:=Y0;       { Начальное определение промежуточного значения Y }
    for i:=1 to Round((Right-X0)/Step) do
      begin   { Цикл просмотра значений функции на выводимом промежутке }
        BufY:=DifRunKutt(X0+i*Step,BufY,Step);  { Вычисление функции в текущей точке }
        if BufY>MaxY { Если значение функции перевосходит максимальное }
          then MaxY:=BufY { то переопределение макс. значения функции }
          else if BufY<MinY then { Иначе, если значение функции меньше
          минимального, то переопределение минимального значения функции }
                               MinY:=BufY
      end;
    ScaleY:=(MaxY-MinY)/(GetMaxY*8)*10;  { Вычисление масштаба по  оси Y }
    if ScaleY=0 then ScaleY:=1;
                { Если масштаб по оси Y равен 0, то переопределение масштаба }
    MoveTo(Round(GetMaxX/10),Round(GetMaxY*9/10-(Y0-MinY)/ScaleY));
                            { Помещение указателя в первую точку графика }
    PutPixel(Round(GetMaxX/10),Round(GetMaxY*9/10-(Y0-MinY)/ScaleY),
             White);                   { Прорисовка первой точки графика }
    BufY:=Y0;       { Начальное определение промежуточного значения Y }
    for i:=1 to Round((Right-X0)/Step) do { Цикл прорисовки графика }
      begin
        BufY:=DifRunKutt(X0+i*Step,BufY,Step);
        LineTo(Round((0.1+i*Step/(Right-X0)*0.8)*GetMaxX),
               Round(GetMaxY*9/10-(BufY-MinY)/ScaleY));
                         { Прорисовка линии от предыдущей точки к текущей }
      end;
    OXy:=GetMaxY*9/10+MinY/ScaleY;   { Вычисление Y-координаты оси OX }
    { Если Y-координата оси OX выходит за границу вывода, то переопределение
      Y-координаты и определение типа линии: }
    if OXy>GetMaxY*19/20
      then begin
             OXy:=GetMaxY*19/20; { Преопределение Y-координаты }
             SetLineStyle(DashedLn,0,NormWidth)  { Определение типа линии }
           end
      else if OXy<GetMaxY/20
             then begin
                    OXy:=GetMaxY/20; { Преопределение Y-координаты }
                    SetLineStyle(DashedLn,0,NormWidth)
                                                    { Определение типа линии }
                  end
             else SetLineStyle(SolidLn,0,NormWidth);{ Определение типа линии }
    Line(Round(GetMaxX/20),Round(OXy),Round(GetMaxX*19/20),Round(OXy));
                                                   { Прорисовка оси OX }
    { Прорисовка стрелки на оси OX: }
    SetLineStyle(SolidLn,0,NormWidth);  { Определение типа линии }
    Line(Round(GetMaxX*19/20),Round(OXy),
         Round(GetMaxX*18.5/20),Round(OXy+GetMaxY/90));
    Line(Round(GetMaxX*19/20),Round(OXy),
         Round(GetMaxX*18.5/20),Round(OXy-GetMaxY/90));
    OYx:=GetMaxX/10-X0/ScaleX;  { Вычисление X-координаты оси OY }
    { Если X-координата оси OY выходит за границу вывода, то переопределение }
    { X-координаты и определение типа линии: }
    if OYx>GetMaxX*19/20
      then begin
             OYx:=GetMaxX*19/20; { Преопределение Y-координаты }
             SetLineStyle(DashedLn,0,NormWidth) { Определение типа линии }
           end
      else if OYx<GetMaxX/20
             then begin
                    OYx:=GetMaxX/20; { Преопределение Y-координаты }
                    SetLineStyle(DashedLn,0,NormWidth)
                                                    { Определение типа линии }
                  end
        else SetLineStyle(SolidLn,0,NormWidth);{ Определение типа линии }
    Line(Round(OYx),Round(GetMaxY/20),Round(OYx),Round(GetMaxY*19/20));
                                                         { Прорисовка оси OY }
    { Прорисовка стрелки на оси OY: }
    SetLineStyle(SolidLn,0,NormWidth);  { Определение типа линии }
    Line(Round(OYx),Round(GetMaxY/20),
         Round(OYx+GetMaxX/120),Round(GetMaxY/20+GetMaxY*9/160));
    Line(Round(OYx),Round(GetMaxY/20),
         Round(OYx-GetMaxX/120),Round(GetMaxY/20+GetMaxY*9/160))
  End;
BEGIN
  Exit:=FALSE;          { Сброс флага выхода }
  GraphDriver:=Detect;  { Автоматическое оперделение драйвера }
  GraphMode:=0;         { Задание графического режима }
  InitGraph(GraphDriver,GraphMode,PathToDriver); { Инициалиэация графики }
  OutGraph(-2,4,1,0.005);
  ReadKey;
  CloseGraph           { Закрытие графического режима }
END.

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию