Численный расчет дифференциальных уравнений
Міністерство освіти України
ДАЛПУ
Кафедра автоматизації
технологічних процесів і приладобудування
КУРСОВА РОБОТА
з курсу “Математичне моделювання на ЕОМ”
на тему “Розв’язок диференціального рівняння
виду а>п>у(п)+а>п-1>у(п-1)+…+а>1>у1+а>0>у=кх при заданих
початкових умовах з автоматичним вибором кроку
методом Ейлера”
Виконала студентка групи БА-4-97
Богданова Ольга Олександрівна
Холоденко Вероніка Миколаївна
Перевірила Заргун Валентина Василівна
1998
Блок-схема алгоритма
Блок-схема алгоритма
начало
у/=f(x,y)
y(x>0>)=y>0 >
x>0>, x>0>+a
h, h/2
k:=0
x>k+1/2>:=x>k>+h/2
y>k+1/2>:=y>k>+f(x>k, >y>k>)h/2
> >α>k>:=> >f(x>k+1/2,> y>k+1/2>)
x>k+1>:=x>k>+h
y>k+1>:=y>k>+α>k>h
>нет> k:=n
> да>
> >
x>0>, y>0>,
x1, y1…
x>n>,> >y>n>
> > конец
> >
ПОСТАНОВКА ЗАДАЧИ И МЕТОД РЕШЕНИЯ
Решить дифференциальное уравнение у/=f(x,y) численным методом - это значит для заданной последовательности аргументов х>0>, х>1>…, х>n> и числа у>0>, не определяя функцию у=F(x), найти такие значения у>1>, у>2>,…, у>n>, что у>i>=F(x>i>)(i=1,2,…, n) и F(x>0>)=y>0>.
Таким образом, численные методы позволяют вместо нахождения функции
У=F(x) получить таблицу значений этой функции для заданной последовательности аргументов. Величина h=x>k>-x>k>>-1> называется шагом интегрирования.
Метод Эйлера относиться к численным методам, дающим решение в виде таблицы приближенных значений искомой функции у(х). Он является сравнительно грубым и применяется в основном для ориентировочных расчетов. Однако идеи, положенные в основу метода Эйлера, являются исходными для ряда других методов.
Рассмотрим дифференциальное уравнение первого порядка
y/=f(x,y) (1)
с начальным условием
x=x>0>, y(x>0>)=y>0 > (2)
Требуется найти решение уравнения (1) на отрезке [а,b].
Разобьем отрезок [a, b] на n равных частей и получим последовательность х>0>, х>1>, х>2>,…, х>n>, где x>i>=x>0>+ih (i=0,1,…, n), а h=(b-a)/n-шаг интегрирования.
В методе Эйлера приближенные значения у(х>i>)»y>i> вычисляются последовательно по формулам у>i>+hf(x>i>, y>i>) (i=0,1,2…).
При этом искомая интегральная кривая у=у(х), проходящая через точку М>0>(х>0>, у>0>), заменяется ломаной М>0>М>1>М>2>… с вершинами М>i>(x>i>, y>i>) (i=0,1,2,…); каждое звено М>i>M>i+1> этой ломаной, называемой ломаной Эйлера, имеет направление, совпадающее с направлением той интегральной кривой уравнения (1), которая проходит через точку М>i>.
Если правая часть уравнения (1) в некотором прямоугольнике R{|x-x>0>|£a, |y-y>0>|£b}удовлетворяет условиям:
|f(x, y>1>)-
f(x, y>2>)|
£
N|y>1>-y>2>|
(N=const),
|df/dx|=|df/dx+f(df/dy)| £ M (M=const),
то имеет место следующая оценка погрешности:
|y(x>n>)-y>n>| £ hM/2N[(1+hN)n-1], (3)
где у(х>n>)-значение точного решения уравнения(1) при х=х>n>, а у>n>- приближенное значение, полученное на n-ом шаге.
Формула (3) имеет в основном теоретическое применение. На практике иногда оказывается более удобным двойной просчет: сначала расчет ведется с шагом h, затем шаг дробят и повторный расчет ведется с шагом h/2. Погрешность более точного значения у>n>* оценивается формулой
|y>n>-y(x>n>)|»|y>n>*-y>n>|.
Метод Эйлера легко распространяется на системы дифференциальных уравнений и на дифференциальные уравнения высших порядков. Последние должны быть предварительно приведены к системе дифференциальных уравнений первого порядка.
Модифицированный метод Эйлера более точен.
Рассмотрим дифференциальное уравнение (1) y/=f(x,y)
с начальным условием y(x>0>)=y>0>. Разобьем наш участок интегрирования на n
равных частей. На малом участке [x>0>,x>0>+h]
>у >интегральную кривую заменим прямой
> >N>k>/ >y=y(x) > линией. Получаем точку М>к>(х>к>,у>к>).
> >
М>к> М>к>/
y>k+1 >
y>k>
х>к> х>к1>>/2> x>k+h=>x>k1> х
Через М>к >проводим касательную: у=у>к>=f(x>k>,y>k>)(x-x>k>).
Делим отрезок (х>к>,х>к1>) пополам:
x>Nk>/=x>k>+h/2=x>k+1/2>
> > y>Nk>/=y>k>+f(x>k>,y>k>)h/2=y>k>+y>k+1/2>
Получаем точку N>k>/. В этой точке строим следующую касательную:
y(x>k+1/2>)=f(x>k+1/2>, y>k+1/2>)=α>k>
Из точки М>к> проводим прямую с угловым коэффициентом α>к> и определяем точку пересечения этой прямой с прямой Х>к1>. Получаем точку М>к>/. В качестве у>к+1> принимаем ординату точки М>к>/. Тогда:
у>к+1>=у>к>+α>к>h
x>k+1>=x>k>+h
(4) α>k>=f(x>k+h/2>, y>k>+f(x>k>,Y>k>)h/2)
y>k>=y>k-1>+f(x>k-1>,y>k-1>)h
(4)-рекурентные формулы метода Эйлера.
Сначала вычисляют вспомогательные значения искомой функции у>к+1>>/>>2> в точках х>к+1>>/2>, затем находят значение правой части уравнения (1) в средней точке y/>k>>+1>>/2>=f(x>k+1/2>, y>k+1/2>) и определяют у>к+1>.
Для оценки погрешности в точке х>к> проводят вычисления у>к> с шагом h, затем с шагом 2h и берут 1/3 разницы этих значений:
| у>к>*-у(х>к>)|=1/3(y>k>*-y>k>),
где у(х)-точное решение дифференциального уравнения.
Таким образом, методом Эйлера можно решать уравнения любых порядков. Например, чтобы решить уравнение второго порядка y//=f(y/,y,x) c начальными условиями y/(x>0>)=y/>0>, y(x>0>)=y>0>, выполняется замена:
y/=z
z/=f(x,y,z)
Тем самым преобразуются начальные условия: y(x>0>)=y>0>, z(x>0>)=z>0>, z>0>=y/>0>.
РЕШЕНИЕ КОНТРОЛЬНОГО ПРИМЕРА
Приведем расчет дифференциального уравнения первого, второго и третьего порядка методом Эйлера
1. Пусть дано дифференциальное уравнение первого порядка:
y/=2x-y
Требуется найти решение на отрезке [0,1] c шагом h=(1-0)/5=0,2
Начальные условия: у>0>=1;
Пользуясь рекурентными формулами (4), находим:
1). x>1>=0,2; х>1>>/2>=0,1; y(x>1>)=y(x>0>)+α>0>h; y(x>1/2>)=y(x>0>)+f(x>0>,y>0>)h/2;
f(x>0>,y>0>)=2*0-1=-1
y(x>1/2>)=1-1*0,1=0,9
α>0>=2*0,1-0,9=-0,7
y>1>=1-0,1*0,2=0,86
2). y(x>2>)=y(x>1>)+α>1>h; x>2>=0,2+0,2=0,4; x>1+1/2>=x>1>+h/2=0,2+0,1=0,3
y(x>1+1/2>)=y(x>1>)+f(x>1>,y(x>1>))h/2
f(x>1>,y>1>)=2*0,2-0,86=-0,46
y(x>1+1/2>)=0,86-0,46*0,1=0,814
α>1>=2*0,3-0,814=-0,214
y>2>=0,86-0,214*0,2=0,8172
3). x>3>=0,4+0,2=0,6; x>2+1/2>=x>2>+h/2=0,4+0,1=0,5
f(x>2>,y>2>)=2*0,4-0,8172=-0,0172
y>2+1/2>=0,8172-0,0172*0,1=0,81548
α>2>=2*0,5-0,81548=0,18452
y>3>=0,8172+0,18452*0,2=0,854104
4).x>4>=0,8; x>3+1/2>=x>3>+h/2=0,6+0,1=0,7
f(x>3>,y>3>)=2*0,6-0,854104=0,345896
y>3+1/2>=0,854104+0,345896*0,1=0,8886936
α>3>=2*0,7-0,89=0,5113064
y>4>=0,854104+0,5113064*0,2=0,95636528
5).x>5>=1; x>4+1/2>=0,8+0,1=0,9
f(x>4>,y>4>)=2*0,8-0,956=0,64363472
y>4+1/2>=0,956+0,643*0,1=1,020728752;
α>4>=2*0,9-1,02=0,779271248
y>5>=0,956+0,7792*0,2=1,11221953
2. Дано уравнение второго порядка:
y//=2x-y+y/
Находим решение на том же отрезке [0,1] c шагом h=0,2;
Замена: y/=z
z/=2x-y+z
Начальные условия: у>0>=1
z>0>=1
1).x>1>=0,2; x>1/2>=0,1
y(z>1>)=y(z>0>)+α>0>h z(x>1>,y>1>)=z(x>0>,y>0>)+β>0>h
y(z>1/2>)=y(z>0>)+f(z>0>,y>0>)h/2 z(x>1/2>,y>1/2>)=z(x>0>,y>0>)+f(x>0>,y>0>,z>0>)h/2
f(z>0>,y>0>)=f>10>=1 f(x>0>,y>0>,z>0>)=f>20>=2*0-1+1=0
y>1/2>=1+1*0,1=1,1 z>1/2>=1+0*0,1=1
α>0>=z>0>=1 β>0>=2*0,1-1,1+1=0,1
y>1>=1+0,2*1=1,2 z>1>=1+0,2*0,1=1,02
2).x>2>+0,4; x>1+1/2>=0,3
f>11>=z>1>=1,02 f>21>=2*0,2-1,2+1,02=0,22
y>1+1/2>=1,2+1,02*0,1=1,1 z>1+1/2>=1,02+0,22*0,1=1,042
α>1>=z>1+1/2>=1,042 β>1>=2*0,3-1,302+1,042=0,34
y>2>=1,2+1,042*0,2=1,4084 z>2>=1.02+0,34*0,2=1,088
3).x>3>=0,6; x>2+1/2>=0,5
f>12>=z>2>=1,088 f>22>=2*0,4-1,4084+1,088=0,4796
y>2+1/2>=1,4084+1,088*0,1=1,5172 z>2+1/2>=1,088+0,4796*0,1=1,13596
α>2>=z>2+1/2>=1,13596 β>2>=2*0,5-1,5172+1,13596=0,61876
y>3>=1,4084+1,136*0,2=1,635592 z>3>=1,088+0,61876*0,2=1,211752
4).x>4>=0,8; x>3+1/2>=0,7
f>13>=z>3>=1,211752 f>23>=2*0,6-1,636+1,212=0,77616
y>3+1/2>=1,636+1,212*0,1=1,7567672 z>3+1/2>=1,212+0,776*0,1=1,289368
α>3>=z>3+1/2>=1,289368 β>3>=2*0,7-1,7568+1,289=0,9326008
y>4>=1,6+1,289*0,2=1,8934656 z>4>=1,212+0,93*0,2=1,39827216
5).x>5>=1; y>4+1/2>=0,9
f>14>=z>4>=1,39827216 f>24>=2*0,8-1,893+1,398=1,10480656
y>4+1/2>=1,893+1,398*0,1=2,0332928 z>4+1/2>=1,398+1,105*0,1=1,508752816
α>4>=z>4+1/2>=1,508752816 β>4>=2*0,9-2,03+1,5=1,27546
y>5>=1,893+1,5*0,2=2,195216163 z>5>=1,398+1,275*0,2=1,65336416
3. Чтобы решить уравнение третьего порядка
y///=2x-y-y/+y//
на отрезке [0,1], с шагом h=0,2 и начальными условиями
y>0>//=1
y>0>/=1
y>0>=1
необходимо сделать 3 замены: y/=a y>0>/=a>0>=1
y//=a/=b y>0>//=b>0>=1
b/=2x-y-a+b
1).x>1>=0,2; x>1/2>=0,1
y(a>1>)=y(a>0>)+a>0>h y(a>1/2>)=y(a>0>)+f>10>h/2
a(b>1>)=a(b>0>)+β>0>h a(b>1/2>)=a(b>0>)+f>20>h/2
b(x>1>,y>1>,a>1>)=b(x>0>,y>0>,a>0>)+γ>0>h b(x>1/2>,y>1/2>,a>1/2>)=b(x>0>,y>0>,a>0>)+f>30>h/2
f>10>=f(a>0>,y(a>0>))=1 y>1/2>=1+1*0,1=1,1
f>20>=f(b>0>,a(b>0>))=1 a>1/2>=1+1*0,1=1,1
f>30>=f(x>0>,y>0>,a>0>,b>0>)=-1 b>1/2>=1-1*0,1=0,9
α>0>=a>1/2>=1,1 y(a>1>)=1+1,1*0,2=1,22
β>0>=b>1/2>=0,9 a(b>1>)=1+0,9*0,2=1,18
γ>0>=2*0,1-1,1-1,1+0,9=-1,1 b(x>1>,y>1>,a>1>)=1-1,1*0,2=0,78
2).x>2>=0,4; x>1+1/2>=x>1>+h/2=0,3
f>11>=a>1>=1,18 y>1+1/2>=1,22+1,18*0,1=1.338
f>21>=b>1>=0,78 a>1+1/2>=1,18+0,78*0,1=1,258
f>31>=2*0,2-1,22-1,18+0,78=-1,22 b>1+1/2>=-1,22*0,1+0,78=0,658
α>1>=a>1+1/2>=1,258 y>2>=1,22+1,258*0,2=1,4716
β>1>=b>1+1/2>=0,658 a>2>=1,18+0,658*0,2=1,3116
γ>1>=2*0,3-1,338-1,258+0,658=-1,338 b>2>=0,78-1,338*0,2=0,5124
3).x>3>=0,6; x>2+1/2>=0,5
f>12>=a>2>=1,3116 y>2+1/2>=1,47+1,3*0,1=1,60276
f>22>=b>2>=0,5124 a>2+1/2>=1,3116+0,5*0,1=1.36284
f>32>=2*0,4-1,47-1,31+0,512=-1,4708 b>2+1/2>=0,4-1,4*0,1=0,36542
α>2>=1,36284 y>3>=1,4716+1,3116*0,2=1,744168
β>2>=0,36542 a>3>=1,3116+0,3654*0,2=1,384664
γ>2>=2*0,5-1,6-1,36+0,365=-1,60018 b>3>= 0,51-1,60018*0,2=0,192364
4).x>4>=0,8; x>3+1/2>=0,7
f>13>=1,384664 y>3+1/2>=1,74+1,38*0,1=1,8826364
f>23>=0,192364 a>3+1/2>=1,38+0,19*0,1=1,4039204
f>33>=2*0,6-1,7-1,38+0,19=-1,736488 b>3+1/2>=0,19-1,7*0,1=0,0187152
α>3>=1,4039204 y>4>=1,74+1,4*0,2=2,0249477
β>3>=0,0187152 a>4>=1,38+0,9187*0,2=1,388403
γ>3>=2*0,7-1,88-1,4+0,0187=-1,8678416 b>4>=0,192-1,87*0,2=-0,1812235
5).x>4>=1; x>4+1/2>=0,9
f>14>=1,388403 y>4+1/2>=2,02+1,388*0,1=2,16379478
> > f>24>=-0,1812235 a>4+1/2>=1,4-0.181*0,1=1,370306608
f>34>=2*0,8-2,02-1,388-0,18=-1,9945834 b>4+1/2>=-0,18-1,99*0,1=-0,38066266
α>4>=1,3703 y>5>=2,02+1,37*0,2=2,2990038
β>4>=-0,38066 a>5>=1,388-0,38*0,2=1,3122669
γ>4>=2*0,9-2,16-1,37-0,38=-2,114764056 b>5>=-0,181-2,1*0,2=-0,6041734
Программа на Turbo Pascal
uses crt,pram,kurs1_1;
var
yx,xy,l,v,p,ff,ay,by,x:array [0..10] of real;
y,a,b:array[0..10,0..1] of real;
i,n,o:integer;
c,d,h,k:real;
label
lap1;
begin
screen1;
clrscr;
writeln('введите наивысший порядок производной не больше трех ');
readln(n);
if n=0 then begin
writeln('это прямолинейная зависимость и решается без метода Эйлера ');
goto lap1;end;
writeln('введите коэффициенты {a0,a1}');
for i:=0 to n do
readln(l[i]);
if (n=1) and (l[1]=0) or (n=2) and (l[2]=0) or (n=3) and (l[3]=0) then begin
writeln('деление на ноль');
goto lap1;
end;
writeln('введите коэффициент при x');
readln(k);
writeln('введите отрезок ');
readln(c,d);
o:=5;
h:=abs(d-c)/o;
writeln('шаг=',h:1:1);
writeln('задайте начальные условия y(x)= ');
for i:=0 to n-1 do
readln(v[i]);
if n=3 then begin
yx[0]:=v[0];
ay[0]:=v[1];
by[0]:=v[2];
p[0]:=(k*c-l[0]*v[0]-l[1]*v[1]-l[2]*v[2])/l[3];
x[0]:=c;
gotoxy(32,1);
write(' ');
gotoxy(32,2);
write(' x y a b ');
gotoxy(32,3);
write(' ',c:7:7,' ',yx[0]:7:7,' ',ay[0]:7:7,' ',by[0]:7:7,' ');
for i:=0 to o-1 do begin
x[i]:=x[i]+h/2;
y[i,1]:=yx[i]+(h/2)*ay[i];
a[i,1]:=ay[i]+(h/2)*by[i];
b[i,1]:=by[i]+(h/2)*p[i];
ff[i]:=(k*x[i]-l[0]*y[i,1]-l[1]*a[i,1]-l[2]*b[i,1])/l[3];
xy[i]:=x[i]+h/2;
yx[i+1]:=yx[i]+h*a[i,1];
ay[i+1]:=ay[i]+h*b[i,1];
by[i+1]:=by[i]+h*ff[i];
x[i+1]:=x[i]+h/2;
p[i+1]:=(k*xy[i]-l[0]*yx[i+1]-l[1]*ay[i+1]-l[2]*by[i+1])/l[3];
end;
for i:=0 to o-1 do begin
gotoxy(32,4+i);
write(' ',xy[i]:7:7,' ',yx[i+1]:7:7,' ',ay[i+1]:7:7,' ',by[i+1]:7:7,' ');
end;
gotoxy(32,4+o);
write(' ');
end;
if n=2 then begin
x[0]:=c;
yx[0]:=v[0];
ay[0]:=v[1];
p[0]:=(k*c-l[0]*yx[0]-l[1]*v[1])/l[2];
gotoxy(32,1);
write(' ');
gotoxy(32,2);
write(' x y a ');
gotoxy(32,3);
write(' ',c:7:7,' ',yx[0]:7:7,' ',ay[0]:7:7,' ');
for i:=0 to o-1 do begin
x[i]:=x[i]+h/2;
y[i,1]:=yx[i]+(h/2)*ay[i];
a[i,1]:=ay[i]+(h/2)*p[i];
ff[i]:=(k*x[i]-l[0]*y[i,1]-l[1]*a[i,1])/l[2];
xy[i]:=x[i]+h/2;
yx[i+1]:=yx[i]+h*a[i,1];
ay[i+1]:=ay[i]+h*ff[i];
x[i+1]:=x[i]+h/2;
p[i+1]:=(k*xy[i]-l[0]*yx[i+1]-l[1]*ay[i+1])/l[2];
end;
for i:=0 to o-1 do begin
gotoxy(32,4+i);
write(' ',xy[i]:7:7,' ',yx[i+1]:7:7,' ',ay[I+1]:7:7,' ');
end;
gotoxy(32,4+o);
write(' ');
end;
if n=1 then begin
x[0]:=c;
yx[0]:=v[0];
p[0]:=(k*x[0]-l[0]*yx[0])/l[1];
for i:=0 to o-1 do begin
x[i]:=x[i]+h/2;
y[i,1]:=yx[i]+(h/2)*p[i];
xy[i]:=x[i]+h/2;
ff[i]:=(k*x[i]-l[0]*y[i,1])/l[1];
yx[i+1]:=yx[i]+h*ff[i];
x[i+1]:=x[i]+h/2;
p[i+1]:=(k*xy[i]-l[0]*yx[i+1])/l[1];
end;
gotoxy(32,1);
write(' ');
gotoxy(32,2);
write(' x y ');
gotoxy(32,3);
write(' ',c:7:7,' ',yx[0]:7:7,' ');
for i:=0 to o-1 do begin
gotoxy(32,4+i);
write(' ',xy[i]:7:7,' ',yx[i+1]:7:7,' ');
end;
gotoxy(32,o+4);
write(' ');
end;
lap1:readln;
pramo;
delay(10000);
clrscr;
end.
ЗАПУСК ПРОГРАММЫ НА ВЫПОЛНЕНИЕ
Программа находится в файле kursova1.pas, и имеет 2 модуля, в которых содержатся заставки. Модули находятся в файлах pram.tpu и kurs1_1.tpu.
Для запуска файла kursova1.pas в Turbo Pascal необходимо нажать F9. Появится первая заставка, далее нажать enter и ввести все необходимые начальные условия: порядок производной, коэффициенты при членах рада, отрезок и начальные значения у(х>0>). На экране выводится шаг вычисления и таблица с ответами. После нажатия enter выводится вторая заставка, после чего мы возвращаемся к тексту программы.
ОПИСАНИЕ ПРОГРАММЫ
1 – ввод данных, используемых в программе
2 – использование метки, очистка экрана, ввод требований, решение
дифференциального уравнения в зависимости от ввода начальных
условий
3 – присвоение начальных условий для дифференциального уравнения
третьего порядка
4 – вывод таблицы со значениями
5 – ввод формул метода Эйлера для уравнения третьего порядка
6 – присвоение начальных условий для решения дифференциального
уравнения второго порядка
7 – вывод таблицы для уравнения второго порядка
8 – формулы метода Эйлера для уравнения второго порядка
9 – начальные условия для дифференциального уравнения первого порядка
10 – формулы метода Эйлера для решения уравнения первого порядка
11 – вывод таблицы
12 – обращение к метке, задержка для просмотра результатов, очистка
экрана, конец программы.