Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1-2 Моделирование / Matlab. Практический подход. Самоучитель

.pdf
Скачиваний:
1033
Добавлен:
31.01.2021
Размер:
12.72 Mб
Скачать

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

Рис. 6.12. Графическое представление системы уравнений

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

Уравнения высоких порядков

Слушайте, что это Вы со мной загадками разговариваете? Честное слово, мне ничего не ясно!

К/ф "Семнадцать мгновений весны"

Общая идея, которая позволяет свести уравнение высокого порядка к системе уравнений первого порядка, состоит в том, что вместо всех производных, кроме самой старшей, вводятся новые функции. В этих новых обозначениях самая старшая производная будет записана как первая производная от некоторой функции. Исходное уравнение при этом дополняется тождествами, определяющими правила введения новых функций. Все эти соотношения содержат производные порядка не более первого. Проиллюстрируем описанный подход на примере решения дифференциального уравнения второго порядка. В частности, решим

251

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

следующую задачу: y′′(x) + 2y′(x) + 2y(x) = 0 с начальными условиями y(0) = 2 и y′(0) = 1 .

На заметку

У этой задачи есть точное решение y(x) = exp(−x)(3 sin(x) + 2 cos(x)) . Его и попытаемся найти.

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

функцию y(x) как y1(x) (то есть положим по определению y1(x) = y(x)),

а также вводим функцию y

(x) = y′(x) . В этих новых обозначениях мо-

 

 

 

2

1

(x) = −2(y (x) + y

(x)) (здесь

жем записать исходное уравнение в виде y

 

 

 

 

2

1

2

 

мы учли, что

y′′(x) = y′(x)). Если дополнить это уравнение тождеством

y′(x) = y

(x)

2

 

 

 

 

, получаем нужную систему дифференциальных уравнений. Ее

1

2

 

 

 

 

 

 

необходимо дополнить начальными условиями. Они в новых обозначениях запишутся так: y1(0) = 2 (следствие условия y(0) = 2 ) и y2(0) = 2 (следствие условия y′(0) = 1 ). На этом математические формальности заканчиваются, и можно приступить непосредственно к поиску решения в Matlab.

Как и в предыдущем случае, начинаем с определения векторной функции, которая определяет систему уравнений. Вот этот код:

function f=LDE(t,y) f=[y(2);-2*(y(1)+y(2))]; end

Здесь все достаточно просто. Результатом функции LDE() возвращается вектор-столбец из двух элементов, каждый из которых задает правую часть соответствующего уравнения. При этом независимая переменная в явном виде не используется. Окно редактора m-файлов с данным программным кодом представлено на рис. 6.13.

Рис. 6.13. Программный код функции, определяющей систему уравнений

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

252

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

>>[x,y]=ode45('LDE',0:0.01:7,[2;1]);

>>plot(x,y)

>>grid on

>>hold on

>>plot(x,exp(-x).*(3*sin(x)+2*cos(x)),'r:','LineWidth',3)

>>title('Решение уравнения второго порядка')

>>legend('функция y(x)','производная y''(x)','точное решение')

Здесь командой [x,y]=ode45('LDE',0:0.01:7,[2;1]) решается система уравнений, а результат записывается в переменную y. При этом элемент y(1) содержит значение функции y(x) (или, что то же самое, функции y1(x) ), а элемент y(2) содержит значение производной y′(x) (функции y2(x) ). Кроме этой команды, инструкцией plot(x,y) строится график функции y(x) и ее производной y′(x) . Командой plot(x,exp(-x).* (3*sin(x)+2*cos(x)),'r:','LineWidth',3) строится график функции y(x) на основе точного (аналитического) выражения для решения дифференциального уравнения. Используется пунктирная кривая красного цвета толщины 3. Командное окно с соответствующими командами показано на рис. 6.14.

Рис. 6.14. Команды для решения системы уравнений

Графики для полученного числового решения (функция y(x), а также ее производная y′(x) ) и точного решения представлены на рис. 6.15.

Для удобства на графике отображается также и легенда. Это позволяет заметить, что найденное числовое решение практически не отличается (на использованном интервале значений аргумента) от аналитического решения.

На заметку

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

253

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

Рис. 6.15. Графическое представление числового решения и точного результата

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

Снова об интегралах

Я просто не предполагал, что моя догадка настолько попадет в цель.

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

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

Для решения поставленной задачи можно использовать разные подходы. Здесь мы создадим специальную функцию, в которой при вычислении

254

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

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

Рис. 6.16. Код функции для вычисления интегралов

Функция вычисляет интеграл на указанном интервале и, кроме этого, в результате ее выполнения строится график исходной функции и кривая для функции-первообразной. Код функции следующий:

function res=Int(F,a,b) f=@(x,y)F(x); [x,y]=ode45(f,a:(b-a)/100:b,0); res=y(length(y)); plot(x,F(x),'b-','LineWidth',2); hold on; plot(x,y,'r:','LineWidth',3); plot(b,res,'rs','LineWidth',4); plot([a,b],[res,res],'r-'); plot([b,b],[0,res],'r-');

grid on;

title('Вычисление интеграла','FontWeight','Bold','FontSize',12); legend('функция','первообразная','результат',2); text(a,res,num2str(res),'VerticalAlignment','bottom',...

'EdgeColor','red','BackgroundColor','yellow','FontWeight','BOLD'); hold off;

end

255

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

Проанализируем код функции Int(). У функции три аргумента: указатель F на подынтегральную функцию (предполагается, что это функция одного аргумента), а также пределы интегрирования (переменные a и b в списке аргументов функции Int()). Возвращаемое в качестве результата числовое значение для вычисляемого интеграла обозначено как res.

Поскольку для вычисления интеграла предполагается использовать функцию ode45(), аргументом которой передается указатель на функцию двух переменных, командой f=@(x,y)F(x) задаем такую функцию. От функции F она отличается тем, что формально у нее два аргумента (второй аргумент не используется). Командой [x,y]=ode45(f,a:(b-a)/100:b,0)

вычисляется решение дифференциального уравнения вида y′(x) = f (x), где f (x) - подынтегральная функция. Уравнение решается на интервале значений аргумента, определяемых переменными a и b. В качестве начального значения используется условие f (a) = 0 . Это условие является необходимым для того, чтобы вычисленное значение y(b) давало значение

b

интеграла f (x)dx .

a

На заметку

b

Определенный интеграл f (x)dx = Φ(b) −Φ(a), где через Φ(x) обозначена

a

любая из первообразных для функции f (x) (то есть Φ′(x) = f (x)). Первообразная функция вычисляется с точностью до аддитивной константы. Если константу

b

выбрать так, чтобы Φ(a) = 0 , то получим f (x)dx = Φ(b). С другой стороны,

при решении дифференциального уравненияa y′(x) = f (x) с начальным условием y(a) = y0 фактически ищем функцию y(x), которая является первооб-

b

разной для функции f (x). Поэтому f (x)dx = y(b) y(a) = y(b) y0 . Что- a

b

бы выполнялось соотношение y(b) = f (x)dx , достаточно положить y0 = 0 . a

Результат вычисляется командой res=y(length(y)). Здесь из вектора y, который содержит значения для решения дифференциального выражения и который вычислялся предыдущей командой, выбираем самый последний элемент. Этот элемент имеет индекс, равный размеру списка y (инструкция

256

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

length(y)). Следующая далее группа команд предназначена для графической иллюстрации результата.

На заметку

Доступ к последнему элементу списка можно получить, указав в качестве индекса ключевое слово end – например, y(end).

График подынтегральной функции строится с помощью команды plot(x,F(x),'b-','LineWidth',2) (синяя линия толщины 2). Команда hold on нужна для перехода в режим удержания графика. Кривая для первообразной строится с помощью команды plot(x,y,'r:','LineWidth',3) (красная пунктирная кривая толщины 3). Отдельно отображается граничная точка на кривой для первообразной, которая соответствует числовому значению вычисляемого интеграла. Делается это командой plot(b,res,'rs','LineWidth',4). Точка выделяется красным квадратом с жирными краями. Кроме этого, отображаются две вспомогательные прямые: горизонтальная красная прямая строится командой plot([a,b],[res,res],'r-') (соединяет точки с координатами (a,res) и (b,res)), а вертикальная красная прямая строится командой plot([b,b],[0,res],'r-') ((соединяет точки с координатами (b,0) и (b,res))). Координатная сетка отображается командой grid on. Также добавляем заголовок (инструкция title('Вычисление интегра ла','FontWeight','Bold','FontSize',12)) и легенду (инструкция legend('функция','первообразная','результат',2)). Легенда отображается только для первых трех кривых (подынтегральная функция, ее первообразная и отдельная точка решения). Аргумент 2 у функции legend() означает, что легенда отображается в левом верхнем углу области графика. Также на графике отображается текстовая метка с вычисленным значением интеграла. Для этого используем команду на основе функции text(). Первые два аргумента функции (a и res) – координаты точки, где выводится текст. Третий аргумент содержит отображаемое значение. Чтобы преобразовать число res в текст, используем команду num2str(res) на основе встроенной функции num2str(), специально предназначенной для таких целей. Опция 'VerticalAlignment' определяет способ выравнивания по вертикали позиции текстовой метки относительно точки отображения. Значение 'bottom' соответствует размещению метки над точкой отображения. Опция 'EdgeColor' определяет цвет рамки вокруг метки (значение 'red' означает красный). Опция 'BackgroundColor' задает цвет фона метки (значение 'yellow' означает желтый). Для того, чтобы использовался полужирный шрифт, для опции 'FontWeight' указывается значение 'BOLD'. Такая же опция использовалась при отображении заголовка графика. Наконец, благодаря инструкции hold off выполняется

257

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

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

функцией. На рис. 6.17 показано командное окно с выполненной командой

π4

Int(@tan,0,pi/4), что соответствует вычислению интеграла tg(x)dx .

0

Рис. 6.17. Команда для вычисления интеграла от функции f (x) = tg(x)

Помимо правильного результата, также будет построен и график, представленный на рис. 6.18.

Рис. 6.18. График построен при вычислении интеграла от функции f (x) = tg(x)

258

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

Если, например, воспользоваться командой Int(@(x)x.^2.*cos(x), 0,pi/2) (рис. 6.19), получим результат, как на рис. 6.20.

Рис. 6.19. Команда для вычисления интеграла от функции f (x) = x2 cos(x)

Рис. 6.20. График построен при вычислении интеграла от функции f (x) = x2 cos(x)

π2

В данном случае найдено решение для интеграла x2 cos(x)dx .

0

259

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

Решение неявных уравнений

Дорогой Ватсон! Вы в совершенстве познали мой дедуктивный метод. Но, увы! Ваши выводы в большинстве ошибочны.

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

Дифференциальные уравнения (первого порядка) далеко не всегда представимы в виде y′(x) = f (x,y(x)). Более общая форма записи дифференциального уравнения первого порядка имеет вид f (x,y(x),y′(x)) = 0. Уравнения вида y′(x) = f (x,y(x)) называют уравнениями первого порядка, разрешенными относительно производной. Уравнения вида f (x,y(x),y′(x)) = 0 называют неявными дифференциальными уравнениями первого порядка. Для решения неявных уравнений первого порядка в Matlab используется функция ode15i(). В качестве иллюстрации рассмотрим уравнение

(y′(x)y(x))2 x2 = 0 с начальным условием y(0) = 1. У этой задачи есть

два решения: y(x) = 1 −x2 и y(x) = 1 + x2 . Первое решение, очевидно, применимо только для значений | x |< 1. Для решения этого уравнения используем функцию ode15i(). Полезным будет следующий командный код:

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

>>[x,y]=ode15i(f,0:0.1:1.5,1,0);

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

>>grid on

>>hold on

>>plot(x,sqrt(1+x.^2),'r:','LineWidth',3)

Командой

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

задается

функция

2

x

2

, которая определяет неявное дифференциаль-

f (x,y,y ) = (y

 

y)

 

ное уравнение. У функции три аргумента: независимая переменная (аргумент x), неизвестная функция (аргумент y) и ее производная (аргумент dy). Все три параметра при определении функции f рассматриваются как независимые. Поиск решения дифференциального уравнения выполняется командой [x,y]=ode15i(f,0:0.1:1.5,1,0). Особенность передачи аргументов функции ode15i() по сравнению с прочими функциями для решения дифференциальных уравнений состоит в следующем. Во-первых, первым аргументом передается указатель на функцию от трех (а не двух, как было ранее) переменных. Во-вторых, кроме списка значений независимой переменной (второй аргумент функции ode15i()) и начального значения для неизвестной функции (третий аргумент функции ode15i()), указывается также начальное значение для производной (четвертый аргумент функции ode15i()). Помимо этого, могут быть и другие опции.

260