Розробка програми чисельного розв’язання звичайних диференційних рівнянь (ЗДР) методом Ейлера
Міністерство освіти і науки, молоді та спорту України
Національний технічний університет України
“Київський політехнічний інститут”
Кафедра автоматизації
енергосистем
З В І Т
Про виконання завдання
Заняття № 6
По курсу “Обчислювальна техніка та алгоритмічні мови”
Розробка програми
чисельного розвязання звичайних диференційних рівнянь (ЗДР)
методом Ейлера
Виконав: студент 1-го курсу
ФЕА, гр. ЕС-42
Злобін А. І.
Перевірив: Настенко Д. В.
Київ 2015
Розробка програми
чисельного розвязання звичайних диференційних рівнянь (ЗДР)
методом Ейлера
Мета роботи: Закріплення знань із застосування чисельних методів розвязання ЗДР і використання для цього методів Ейлера, розробка відповідного алгоритму і програми на мові Pascal, застосування її для розвязання заданого диференційного рівняння.
1. Теоретичні відомості
Диференційним називається рівняння, яке звязує незалежну змінну , функцію і її похідні :
(1)
Порядок рівняння визначається найвищою похідною у його складі. Якщо функція є функцією однієї змінної, то диференційне рівняння називається звичайним .
У роботі розглядаємо звичайні диференційні рівняння першого порядку:
(2)
або , якщо його можна розвязати відносно похідної.
Розвязком, або інтегралом диференційного рівняння називається будь-яка функція , обертає його на тотожність.
Загальним розвязком диференційного рівняння першого порядку називається функція:
, (3)
яка залежить від однієї довільної постійної величини і задовольняє таким умовам:
- Вона є розвязком диференційного рівняння при будь-якому конкретному значенні ;
- При будь-якій початковій умові функція повинна дорівнювати заданому , тобто можна знайти таке значення , при якому функція буде задовольняти заданій початковій умові.
Графічно, загальному розвязку ЗДР відповідає сімейство кривих, що описується рівнянням (10.3) при різних значеннях (інтегральні криві).
Частковим розвязком називається функція , яку отримаємо із загального розвязку при вибраному відповідно до заданих початкових умов , значенні . Йому відповідає одна із інтегральних кривих, яка проходить через задану точку початкових умов ().
Розвязати (проінтегрувати) диференційне рівняння означає визначити його частковий розвязок, що відповідає заданим початковим умовам. Розвязок отримаємо у вигляді функції , яка при розвязанні ЗДР чисельними методами подається у табличній формі, тобто як система точок .
Чисельні методи розвязання ЗДР застосовуються тоді, коли коефіцієнти і функції в рівнянні занадто складні або задані у табличній формі, що унеможливлює розвязання таких рівнянь класичними аналітичними методами.
Індивідуальне завдання №9:
Диференційне рівняння
= 0, = 1, b = 0,5
Точний розвязок рівняння
Програмна реалізація:
Program EILER;
uses crt,graph;
function P(x:real;y:real):real;
begin
P:=(cos(x)*(cos(x)-sin(x))+sin(x)*(sin(x)+cos(x)));
end;
function R(x1:real):real;
begin
R:=sin(x1)+cos(x1);
end;
Var
A,x,y,hx:real;
mx,my:real;
px,py,px1,py1:word;
w,h,x0,y0,dx,dy:integer;
grD,grM:integer;
s,s1:string;
x10, y10, b,F1,h1,w1:real;
n, i, k:word;
t:text;
x1: array [0..1000] of real;
E:array [1..3,0..1000] of real;
Label M;
Begin
clrscr;
writeln('x0,y0:');
readln(x10,y10);
writeln('b:');
readln(b);
writeln('Vvedit n');
readln(n);
h1:=(b-x10)/n;
x1[0]:=x10;
for i:= 1 to 3 do E[i,0]:=y10;
for k:=1 to n do
begin
x1[k]:=x1[k-1]+h1;
w1:=0;
for i:=1 to 3 do
begin
If w1=0 then goto M;
A:=x1[k-1]+h1/(2*w1);
if A=1 then A:=1.1;
F1:=P(A,E[i,k-1]+h1*P(x1[k-1],E[i,k-1])/(2*w1));
M: E[i,k]:=E[i,k-1]+h1*((1-w1)*P(x1[k-1],E[i,k-1])+w1*F1);
w1:=w1+0.5;
end;
end;
write('xp=');
for k:=0 to n do write(' ',x1[k]:1:3);
writeln;
writeln('Method Eilera:');write('y1=');for k:=0 to n do write(' ',E[1,k]:1:3); writeln;
writeln('Pohibka1=',100*abs(E[1,n]-R(x1[n]))/R(x1[n]):1:3,'%');
writeln('Vipravlen metod Eilera:');write('y2=');for k:=0 to n do write(' ',E[2,k]:1:3);
writeln('Pohibka2=',100*abs(E[2,n]-R(x1[n]))/R(x1[n]):1:3,'%');
writeln('Modifikovan metod Eilera:');write('y3=');for k:=0 to n do write(' ',E[3,k]:1:3);writeln;
writeln('Pohibka3=',100*abs(E[3,n]-R(x1[n]))/R(x1[n]):1:3,'%');
assign(t,'D:/text.txt');
reset(t);
rewrite(t);
write(t,'xp=');
for k:=0 to n do write(t,' ',x1[k]:1:3);
writeln(t);
writeln(t,'Method Eilera:');write(t,'y1=');for k:=0 to n do write(t,' ',E[1,k]:1:3); writeln(t);
writeln(t,'Vipravlen metod Eilera:');write(t,'y2=');for k:=0 to n do write(t,' ',E[2,k]:1:3); writeln(t);
writeln(t,'Modifikovan metod Eilera:');write(t,'y3=');for k:=0 to n do write(t,' ',E[3,k]:1:3);writeln(t);
close(t);
readkey;
clrscr;
grD:=detect;
initgraph(grD,GrM,'');
y0:=getmaxY div 2 + 180;
w:=580;
h:=y0-20;
if x1[0]<=0 then mx:=580/(x1[n]-x1[0])
else mx:=580/x1[n];
my:=(y0-220)/1;
dx:=round(mx/2);
dy:=round(my/10);
if x1[0]>=0 then X0:=30 else x0:=30-round(x1[0]*mx);
SetBkColor(black);
setlinestyle(1,0,0);
Setcolor(blue);
for i:=1 to 20 do
begin
line(10,y0-i*dy,630,y0-i*dy);
line(10,y0+i*dy,630,y0+i*dy);
line(x0+i*dx,0,x0+i*dx,480);
line(x0-i*dx,0,x0-i*dx,480);
if i<10 then
begin
str(i,s);
outtextXY(x0-25,y0-i*dy,'0.'+s);
end
else
begin
str(i div 10,s);
str(i-10,s1);
outtextXY(x0-25,y0-i*dy,s+'.'+s1);
end;
str(i,s);
outtextXY(x0-30,y0+i*dy-10,'-0.'+s);
str(i div 2,s1);
if odd(i) then s1:=s1+'.5'
else s1:=s1+'.0';
outtextXY(x0+i*dx,y0+10,s1);
str(i div 2,s1);
if odd(i) then s1:='-'+s1+'.5'
else s1:='-'+s1+'.0';
outtextXY(x0-i*dx,y0+10,s1);
end;
outtextXY(x0+5,y0+10,'0');
outtextXY(getmaxX-10,y0-10,'X');
outtextXY(x0+10,5, 'Y');
SetColor(11);
setlinestyle(1,0,0);
line(0,y0,640,y0);
line(x0,480,x0,0);
x:=x1[0];
hx:=0.0001;
while x<=x1[n] do
begin
px:=x0+round(x*mx);
py:=y0-round(R(x)*my);
Putpixel(px,py,red);
x:=x+hx;
end;
setlinestyle(0,0,0);
for i:=0 to n do begin
px:=x0+round(x1[i]*mx);
py:=y0-round(E[1,i]*my);
Putpixel (px,py,green);
if i>0 then begin setcolor(green);line(px1,py1,px,py); end;
px1:=px;
py1:=py;
end;
for i:=0 to n do begin
px:=x0+round(x1[i]*mx);
py:=y0-round(E[2,i]*my);
Putpixel (px,py,14);
if i>0 then begin setcolor(14);line(px1,py1,px,py); end;
px1:=px;
py1:=py;
end;
for i:=0 to n do begin
px:=x0+round(x1[i]*mx);
py:=y0-round(E[3,i]*my);
Putpixel (px,py,11);
if i>0 then begin setcolor(11);line(px1,py1,px,py); end;
px1:=px;
py1:=py;
end;
setcolor(15);
BAR(450,300,595,380);
setfillstyle(0,15);
floodfill(500,350,15);
setcolor(red);
line(460,315,485,315);
outtextxy(490,312,'Rozvazok');
setcolor(green);
line(460,330,485,330);
outtextxy(490,328,'Metod Eilera');
setcolor(14);
line(460,345,485,345);
outtextxy(490,343,'Viprav Eilera');
setcolor(11);
line(460,360,485,360);
outtextxy(490,357,'Modif Eilera');
readkey;
closegraph;
end.
Блок-схема:
М:
і
так
Вибір модифікації
метода
Вхід
i=1,3
k=1,n
i=1,3
w=0?
x,E,
n
Вихід
Реалізація формули (9)
Розробка програми чисельного розв’язання звичайних диференційних рівнянь (ЗДР) методом Ейлера