Программа
{ Решение дифура 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 DifAyl(X,Y,Step:real):real;
{ Вычисление значения исходной функции }
Begin
DifAyl:=Y+Step*(Derivative(X,Y)); { Определение значения функции }
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:=DifAyl(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:=DifAyl(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.05);
ReadKey;
CloseGraph { Закрытие графического режима }
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию