Материал: Matlab. Практический подход. Самоучитель

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Самоучитель Matlab

На заметку

Общее решение уравнения y′ = y2 −2 x2 имеет вид y(x) =

 

3

2

 

 

+Cx3)x

 

(1

x ,

где константа C определяется исходя из начальных условий. В частности, для

начального значения y(1) = 1 получаем решение y(x) = 1 .

x

Для решения этой задачи используем следующую последовательность команд:

>>f=@(x,y)(y.^2-2./x.^2);

>>[x,y]=ode45(f,1:0.1:10,1);

>>plot(x,y,'r-','LineWidth',2)

>>hold on

>>plot(x,1./x,'b:','LineWidth',2)

>>grid on

На рис. 6.6 приведен документ с командным кодом, представленным выше.

Рис. 6.6. Решение дифференциального уравнения с помощью функции ode45()

Инструкцией

f=@(x,y)(y.^2-2./x.^2)

задается

функция

f (x,y) = y2 −2

x2 , определяющая правую часть решаемого уравнения

y′ = f (x,y). Указатель на эту функцию передается первым аргументом

функции ode45() в команде [x,y]=ode45(f,1:0.1:10,1). Вторым аргументом функции ode45() передается список значений аргумента x , для которых вычисляются значения функции y . Третий аргумент функции ode45() определяет начальное значение функции.

На заметку

Точка начального значения по аргументу определяется по первому элементу списка – второго аргумента функции ode45().

В качестве результата функцией возвращается список узловых точек и вычисленных значений функции в этих точках. Таким образом, в результате выполнения команды [x,y]=ode45(f,1:0.1:10,1) в переменную x за-

246

Глава 6. Интегрирование и дифференциальные уравнения

писываются узловые точки (определяются вторым аргументом функции ode45()), а в переменную y записываются значения функции, вычисленные в узловых точках. Эти переменные можно использовать для создания графика, что собственно и делается с помощью команды plot(x,y,'r-', 'LineWidth',2). Кривая для вычисленной в результате решения дифференциального уравнения зависимости отображается сплошной линией красного цвета толщины 2. Для сравнения командой plot(x,1./x, 'b:','LineWidth',2) пунктирной кривой синего цвета отображается точная аналитическая зависимость для решения рассмотренной задачи. На рис. 6.7 показаны графики, построенные на основе точного решения дифференциального уравнения и вычисленного с помощью функции ode45().

Рис. 6.7. Результат решения дифференциального уравнения в числовом виде

Как видим, на интервале значений аргумента от 1 до 10 совпадение более чем приемлемое. Правда, в данном случае зависимость монотонная. Если изменить начальное значение для функции, можно получить не такое тривиальное решение. На рис. 6.8 представлен документ (продолжение предыдущего), в котором решается то же самое уравнение, но с начальным условием y(1) = −0.5 .

Все практически так же, как в предыдущем случае, только внесены соответствующие изменения в начальном условии и для сравнения создается

247

Самоучитель Matlab

Рис. 6.8. Решение уравнения с новым начальным условием

3 2

график функции y(x) = (1 + x3)x x , которая является решением соответствующей задачи. График приведен на рис. 6.9.

Рис. 6.9. Еще одно решение дифференциального уравнения

Как и в предыдущем случае, совпадение результатов хорошее.

На заметку

Описанный выше способ передачи аргументов функции ode45() характерен и для других функций, используемых для решения дифференциальных уравнений. Кроме описанных аргументов, могут использоваться также и дополнительные опции.

248

Глава 6. Интегрирование и дифференциальные уравнения

Решение системы дифференциальных уравнений

Ну что Вы теперь на это скажете, мой дорогой психолог?

К/ф "Приключения Шерлока Холмса и доктора Ватсона. Знакомство"

Системы дифференциальных уравнений решаются практически так же, как и отдельные дифференциальные уравнения, с той лишь поправкой, что придется иметь дело с векторными функциями (списком функций). В качестве примера рассмотрим систему дифференциальных уравнений x′(t) = y(t) + 2 exp(t) и y′(t) = x(t) +t2 с начальными значениями

x(0) = −2 и y(0) = −1. Сразу отметим, что точное решение имеет вид x(t) = t exp(t) −t2 −2 и y(t) = (t −1)exp(t) −2t . Для решения этой системы предварительно определяем в редакторе m-файлов следующую векторную функцию:

function f=DESyst(t,y) f=[y(2)+2*exp(t);y(1)+t.^2]; end

Это функция, которая определяет

правую

часть

уравнений системы.

 

 

 

 

 

 

y + 2 exp(t)

. Программный

 

 

 

2

 

А именно, речь идет о функции f (t,x,y) =

x +t

 

 

 

 

 

 

 

 

 

 

 

 

 

код функции в окне редактора m-файлов представлен на рис. 6.10.

Рис. 6.10. Код векторной функции

Что касается определения функции DESyst(), то у нее два аргумента – независимая переменная t (значение переменной t ) и переменная y, которая, как предполагается, содержит два значения – для функции x(t) и для функции y(t) (в момент времени t ). Ссылка на значение функции x(t) выглядит как y(1), а ссылка на значение функции y(t) выглядит как y(2). Именно эти ссылки использованы при вычислении результата функции DESyst(). Возвращаемое значение является списком (вектор-столбец). Значения

249

Самоучитель Matlab

элементов вычисляются в соответствии с уравнениями (правыми частями уравнений), формирующими систему.

После того, как определена функция DESyst(), решение системы уравнений может быть найдено с помощью такой последовательности команд:

>>[t,y]=ode45('DESyst',0:0.01:2,[-2;-1]);

>>plot(t,y,'LineWidth',2)

>>grid on

>>hold on

>>plot(t,t.*exp(t)-t.^2-2,'r:')

>>plot(t,(t-1).*exp(t)-2*t,'k--')

>>title('Решение системы дифференциальных уравнений')

Интерес здесь представляет команда [t,y]=ode45('DESy st',0:0.01:2,[-2;-1]). Она по форме мало отличается от тех, что использовались ранее для решения отдельного дифференциального уравнения. Но поскольку первый аргумент (ссылка 'DESyst') передает векторфункцию, то в переменную y также записывается несколько функций: первый столбец этой переменной определяет зависимость x(t), а второй столбец определяет зависимость y(t). Соответствующие узловые точки (значения независимой переменной t ) записываются в переменную t. Прочие команды предназначены для иллюстрации полученного решения в графическом виде. На рис. 6.11 показано командное окно с использованными инструкциями.

Рис. 6.11. Решение системы дифференциальных уравнений

На заметку

Командой plot(t,y,'LineWidth',2) отображаются сразу две кривые, для функций x(t) и y(t). Соответствующие данные "спрятаны" в переменной y. Кроме этого, командами plot(t,t.*exp(t)-t.^2-2,'r:') и plot(t,(t-1).*exp(t)-2*t,'k--') строятся кривые для точных решений. На рис. 6.12 числовое и аналитическое решения неразличимы.

250

Источник: https://studfile.net/preview/16433384/