Обыкновенные дифференциальные уравнения возникают во многих задачах естественных наук. Чаще всего встречается задача Коши: отыскать некоторую функцию y(x), удовлетворяющую дифференциальному уравнению

dny- dxn =  f(x,y)

и некоторым начальным условиям: y(x0) = y0,y(1)(x 0) = y0(1)⋅⋅⋅y(n1)(x 0) = y0(n1). Например, в общей физике наибольший интерес представляют дифференциальные уравнения второго порядка. Схема решения задачи Коши в MATLAB следующая:

  1. Приведение уравнения n-го порядка к n уравнениям первого порядка. Это необходимо для задания вектора правых частей дифференциального уравнения. Размерность вектора равна порядку старшей производной;
  2. Написание функции, задающей вектор правых частей системы дифференциальных уравнений первого порядка. Следует обратить внимание, что простое использование вектора вызовет ошибку во всех решателях;
  3. Вызов решателя с нужными аргументами – вектором начальных условий и функцией правых частей системы уравнений.

Дальнейшая работа с полученными данными возможна обычными средствами MATLAB. Краткий синтаксис вызова решателя следующий: [x,y]=ode(function,x0,y0). Слева от знака равенства указаны выходные данные функции, которые будут вычислены обращением к решателю ode, y0 вектор начальных условий, x0 – вектор значений независимой переменной. Расширенный синтаксис вызова решателей позволяет установить дополнительные опции, например абсолютную (по умолчанию 106) и относительную (по умолчанию 103)погрешности, шаг интегрирования и др. Удобный способ задания всех таких опций предоставляет структура odeset. Вызов odeset без аргументов приведет к выводу всех полей этой структуры и их значений по умолчанию. Предварительное определение такой структуры командой вида opt=odeset(’name’,value) позволяет в дальнейшем при вызове решателя в качестве одного из аргументов указать opt.

PIC

Рис. 84. Траектория тела, брошенного под углом к горизонту. Угол в данном примере равен 45

 

Рассмотрим в качестве примера решение уравнения движения для тела, брошенного под углом к горизонту с некоторой скоростью. Если пренебрегать сопротивлением воздуха, то решение этой задачи прекрасно знает любой школьник – траекторией движения тела будет парабола. Для решения нам потребуется два дифференциальных уравнения второго порядка – по одному для каждой координаты:

d2x --2-=  0; dt
 2 d-y-= − 9.8. dt2

В качестве начальных значений выберем начальные координаты? равными нулю, а первые производные этих координат – равными 10. Для формирования вектора правых частей дифференциального уравнения нам потребуется определить две новых функции (в обычном понимании) – по порядку уравнения. Введем обозначения: y1 = y и y2 = y1. В новых функциях вторая производная от координаты будет представлена как первая производная от вспомогательной функции y1 и уравнение второго порядка для координаты y будет сведено к системе двух уравнений первого порядка:

dy1 ----= y2; dt


dy2-= − 9.8. dt

По своему физическому смыслу y2 – это скорость тела вдоль вертикальной оси. Вектор начальных условий для системы дифференциальных уравнений тогда будет иметь вид y0=[0;10]. Для корректного решения вектор должен быть столбцом, поэтому элементы вектора отделены не пробелом, а точкой с запятой. Первое значение – начальная координата, второе – начальная (вертикальная) скорость. Функцию первый аргумент решателя сформируем с помощью оператора @ yt=@(t,y)[y(2);-10]. В круглых скобках указаны выходные параметры функции, а вектор-столбец есть вектор коэффициентов правых частей системы дифференциальных уравнений. В качестве решателя используем ode45, реализующий метод Рунге-Кутты 4 порядка – [to,yo]=ode45(yt,ts,y0). Выходными значениями [to,yo] являются вектор значений времени to и массив, содержащий координаты и скорости вдоль вертикали. Аналогичным образом преобразуется уравнение для горизонтальной координаты. Поскольку выходные массивы xo и yo содержат два вектор-столбца, то из них предварительно выделены столбцы, соответствующие координатам. В конце построен график зависимости одной координаты от другой – траектория тела.


Пример 40.
Простейший сценарий решения задачи Коши для баллистического движения
1 %исходныйкод сценария
2 y0=[0;10]
3 x0=[0;10]
4 ts=0:0.1.2;
5 yt=@(t,y)[y(2);10]
6 xt=@(t,x)[x(2);0]
7 [to,yo]=ode45(yt,ts,y0)
8 [to,xo]=ode45(xt,ts,x0)
9 x=xo(:,1)
10 y=yo(:,1)
11 plot(x,y)
12 grid on
13 set(gca,FontName, Verdana, FontSize,14)
14 title(Траектория тела,брошенногоподугломкгоризонту)
15 xlabel(x)
16 ylabel(y)

 

PIC

Рис. 85. График решения уравнения затухающих колебаний из примера 41

 

В качестве дополнительного примера можно рассмотреть решение уравнения затухающих колебаний: y′′ + 2βy + ω2y = 0 (пусть 2β = 5, а ω2 = 10). Снова определяя вспомогательные функции в виде y1 = y и y2 = y1, получим вектор для правых частей двух дифференциальных уравнений в виде [y(2);-2*y(2)-10*y(1)]. Пример 41 строит зависимость координаты затухающих колебаний от времени.


Пример 41.
Простейший сценарий решения задачи Коши для уравнения затухающих колебаний
1 %исходный кодсценария
2 y0=[0;10];
3 ts=0:0.1.5;
4 yt=@(t,y)[y(2);2y(2)10y(1)];
5 [to,yo]=ode45(yt,ts,y0);
6 plot(ts,yo(:,1))
7 grid on
8 set(gca,FontName, Verdana, FontSize,14)
9 title(Решение уравнениязатухающихколебаний)
10 xlabel(время)
11 ylabel(смещениеизположениеравновесия)

В MATLAB присутствует несколько решателей (solver) обыкновенных дифференциальных уравнений. Формат вызова практически всех решателей одинаков, аргументы также имеют одинаковый смысл. Для начала численных экспериментов с дифференциальными уравнениями рекомендуют использовать решатель ode45 и, только если этой функцией построить решение не удается, следует выбрать более подходящий для задачи решатель. Также если ode45 обеспечивает слишком высокую точность, а скорость работы, наоборот, низкую, то есть смысл выбрать другой решатель – ode23. Выбор решателя, обеспечивающего приемлемую точность за приемлемое время вычислений, определяется характером поведения искомой функции на интервале интегрирования. Ни один из решателей не является встроенной функцией, и это значит, что можно посмотреть и использовать его код для модификации стандартных решателей под конкретные задачи.