Розробка програми чисельного розв’язання звичайних диференційних рівнянь (ЗДР) методом Ейлера

Міністерство освіти і науки, молоді та спорту України

Національний технічний університет України

“Київський політехнічний інститут”

Кафедра автоматизації

енергосистем

З В І Т

Про виконання завдання

Заняття № 6

По курсу “Обчислювальна техніка та алгоритмічні мови”

Розробка програми

чисельного розв’язання звичайних диференційних рівнянь (ЗДР)

методом Ейлера

Виконав: студент 1-го курсу

ФЕА, гр. ЕС-42

Злобін А. І.

Перевірив: Настенко Д. В.

Київ 2015

Розробка програми

чисельного розв’язання звичайних диференційних рівнянь (ЗДР)

методом Ейлера

Мета роботи: Закріплення знань із застосування чисельних методів розв’язання ЗДР і використання для цього методів Ейлера, розробка відповідного алгоритму і програми на мові Pascal, застосування її для розв’язання заданого диференційного рівняння.

1. Теоретичні відомості

Диференційним називається рівняння, яке зв’язує незалежну змінну , функцію і її похідні :

(1)

Порядок рівняння визначається найвищою похідною у його складі. Якщо функція є функцією однієї змінної, то диференційне рівняння називається звичайним .

У роботі розглядаємо звичайні диференційні рівняння першого порядку:

(2)

або , якщо його можна розв’язати відносно похідної.

Розв’язком, або інтегралом диференційного рівняння називається будь-яка функція , обертає його на тотожність.

Загальним розв’язком диференційного рівняння першого порядку називається функція:

, (3)

яка залежить від однієї довільної постійної величини і задовольняє таким умовам:

  1. Вона є розв’язком диференційного рівняння при будь-якому конкретному значенні ;
  2. При будь-якій початковій умові функція повинна дорівнювати заданому , тобто можна знайти таке значення , при якому функція буде задовольняти заданій початковій умові.

Графічно, загальному розв’язку ЗДР відповідає сімейство кривих, що описується рівнянням (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)

Розробка програми чисельного розв’язання звичайних диференційних рівнянь (ЗДР) методом Ейлера