Примеры численного решения ОДУ



 

1. Получить численное решение уравнения , при , . Построить график решения.

Решение. Переменной а присваиваем значение необходимого дифференциального уравнения

> a:=diff(y(x),x$2)+13*diff(y(x),x)+10=0;

    Для получения численного решения также используется функция dsolve. Для того, чтобы указать на то, что требуется численное решение, необходимо дописать дополнительный параметр numeric. По умолчанию в системе Maple используется в этом случае метод Рунге-Кутта 4–5 порядка. Для указания на конкретный метод дописывается параметр следующего вида: method=<метод>. О методах, используемых в Maple можно узнать из справки системы.

    Затем переменной присваиваем результат функции. Параметр range используется для определения интервала интегрирования уравнения.

> re:=dsolve({a,y(0)=10,D(y)(0)=4},y(x),numeric, range=0..1);

    Результат, возвращаемый функцией dsolve с таким набором параметров – процедура с одним параметром, вычисляющая список значений (функции и производных) в точке, определяемой вносимым в параметр значением.

   Для построения графика решения используется функция odeplot,которая позволяет построить график как значений функции, так и производных до порядка уравнения. После решения следующим параметром может указываться необязательный параметр – список переменных, по которым будет построен график. odeplot входит в состав пакета plots. Пакеты в Maple подключаются функцией with(<параметр>[,<функция>]), где параметром является пакет, а далее (не обязательно) можно писать список функций этого пакета, которые необходимо подключить к программе. Если список опустить, будут подключены все функции

> odeplot(re,[x,y(x)],color=blue);

    Для получения графика производной в данном случае следует указать следующий список переменных: [x,D(y)(x)]. Можно также воспользоваться формой производной с использованием diff. Если в списке указать три параметра, то по ним будет построен трехмерный график. Если список будет опущен в описании, система сама выберет систему координат.


Лабораторная работа №1
Решение ОДУ различными методами

 

Задача: решить уравнение следующего вида: , где  и  при .

1. Решение методом неопределенных коэффициентов

    Для начала отменим все определения и зададим функции p(x) и q(x), используя оператор функциональной зависимости.

> restart;

q:=x->cos(x);

p:=x->-tan(x);

   Обозначим переменными ur[1] и ur[2] заданное уравнение и его однородную форму. Через xp и yp обозначим условие , то есть . Функция lhs(<уравнение>) возвращает левую часть уравнения. rhs – правую.

> ur[1]:=D(y)(x)+p(x)*y(x)=q(x);

ur[2]:=lhs(ur[1])=0;

xp:=0;

yp:=2;

   Получим общее однородное решение уравнения, возьмем его правую часть. Заменим в ней постоянную _С1 произвольной переменной С, зависящей от x и присвоим полученное выражение переменной igr. Один из способов производить замену – это использование функции eval с двумя параметрами, где первый – выражение, а второй – список равенств, в соответствии с которыми будет произведена замена.

> rhs(dsolve(ur[2],y(x)));

igr:=eval(%,[_C1=C(x)]);

Затем возьмем производную полученного общего решения, для того, чтобы, заменив  и  в полном уравнении, определить С(х). Обозначим производную переменной igr1.

> igr1:=diff(%,x);

   Произведем замену. Для нахождения С(х) решим дополнительное дифференциальное уравнение по С(х) с граничными условием

> eval(ur[2],[y(x)=igr,D(y)(x)=igr1]);

dsolve({lhs(%)=rhs(ur[1]),C(xp)=yp},C(x));

   Таким образом мы получили функцию С(х). Подставив ее в общее решение, мы получим полное решение уравнения:

> 'y(x)'=eval(igr,[C(x)=rhs(%)]);

 

 

2. Решение методом замены

    Отличием от предыдущего решения будет использование функции declare пакета PDEtools, которая заменит все представления производной апострофами, соответствующими порядку производной.

> restart;

PDEtools[declare](y(x),u(x),v(x),prime=x):

q:=x->cos(x);

p:=x->-tan(x);

xp:=0;

yp:=2;

    Обозначим переменной ur[1] заданное уравнение.       

> ur[1]:=D(y)(x)+p(x)*y(x)=q(x);

Преобразуем уравнение к виду с производной. Произведем замену . С помощью функции collect (collect(<выражение>,<переменная>)) соберем коэффициенты при . Полученное уравнение обозначим переменной urav:

> convert(ur[1],diff);

eval(%,[y(x)=u(x)*v(x)]);

urav:=collect(%,v(x));

    Функции  и  мы можем выбирать произвольным образом. Легко заметить, что уравнение заметно упрощается, если . Это условие обозначим как ur[1], а оставшееся выражение – ur[2].

> ur[1]:=lhs(eval(urav,[v(x)=1]))=0;

ur[2]:=lhs(urav)-lhs(ur[1])*v(x)=rhs(urav);

    Решим уравнение для . Функции произвольные, поэтому  константу в решении примем равной единице.

> u(x):=eval(rhs(dsolve(ur[1],u(x))),[_C1=1]);

    Решим уравнение для . Константу заменим переменной C:

> v(x):=eval(rhs(dsolve(ur[2],v(x))),[_C1=C]);

    Умножив полученные результаты, получим общее неоднородное решение заданного уравнения:

> y(x):=u(x)*v(x);

    Подставим граничные условия и получим значение C:

> C:=solve(eval(y(x),[x=xp])=yp,C);

    Подставив С, получим частное неоднородное решение:

> 'y(x)'=eval(y(x));

Теперь воспользуемся функцией plot из пакета plots, чтобы построить график решения.

Ø plot(y(x),x=xp-1..xp+1);

 

График аналитического решения.

 

3. Решение встроенными средствами Maple.

    Отменим все определения.

> restart;
xp:=0;

yp:=2;

Воспользуемся операторной формой записи уравнения с граничными условиями. Применим dsolve:

> dsolve([D(y)(x)+p(x)*y(x)=q(x),y(xp)=yp],y(x));

4. Решение численными методами.

    Воспользуемся для этого параметрами numeric и range (см. Примеры численного решения ОДУ). Полученную процедуру обозначим как re1.

>re1:=dsolve({D(y)(x)+p(x)*y(x)=q(x),y(xp)=yp},y(x),numeric, range=xp-1..xp+1);

Построим график решения.
> with(plots):

odeplot(re1);

    Численное решение, судя по графику, соответствует точному решению.

 


Дата добавления: 2018-05-12; просмотров: 1078; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!