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

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

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

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

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

Площадь области вычислялась двумя разными способами – через двойной и обычный интеграл. При этом для вычисления интегралов и создания графика использовались следующие команды (ввод пользователя выделен жирным шрифтом):

>>y1=@(x)(x.^2);

>>y2=@(x)(x);

>>quad2d(@(x,y)(x>0&x<1),0,1,y1,y2) ans =

0.1667

>>quad(@(x)(y2(x)-y1(x)),0,1)

ans = 0.1667

>>x=0:0.01:1.1;

>>plot(x,x,'LineWidth',2)

>>hold on

>>plot(x,x.^2,'LineWidth',2)

>>grid on

>>title('Область интегрирования')

На заметку

Через двойной интеграл площадь области вычисляется как

 

1

x

1

 

∫∫

dxdy = dx dy =

.

6

 

0<x <1

0

x2

 

 

 

x <y<x2

1

То же значение можно получить, вычислив интеграл (x x2)dx = 1 .

6

0

Командами y1=@(x)(x.^2) и y2=@(x)(x) задаются указатели на функции, которыми определяются кривые, ограничивающие область интегрирования. Двойной интеграл вычисляется командой quad2d(@(x,y) (x>0&x<1),0,1,y1,y2). Первым аргументом функции quad2d() передается указатель на подынтегральную функцию. Подынтегральная функция в данном случае специфическая. У нее два формальных аргумента, и возвращает она единицу (во всяком случае, в области интегрирования). Здесь мы первым аргументом функции quad2d() передаем анонимную функцию (@(x,y)(x>0&x<1), у которой два аргумента и которая принимает два значения (единичное, если первый ее аргумент попадает в интервал от 0 до 1, и ноль во всех прочих случаях). Второй и третий аргументы функции quad2d() – границы интервала интегрирования по переменной x .

241

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

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

Командой quad(@(x)(y2(x)-y1(x)),0,1) вычисляется та же площадь, но уже через однократный интеграл. Первым аргументом функции quad() передается указатель на подынтегральную функцию. Указатель (инструкция @(x)(y2(x)-y1(x))) создается через анонимную функцию, в которой использованы указатели y1 и y2 на функции, определяющие уравнения кривых, ограничивающих область. Диапазон изменения подынтегральной переменной – от 0 до 1 (второй и третий аргументы функции quad()). Результат получаем тот же. Прочие команды предназначены для отображения границ области, для которой вычисляется площадь. Результатом их выполнения является график на рис. 6.3. Подобные команды уже использовались ранее, поэтому особых комментариев они не требуют.

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

лим гамма-функцию Эйлера, которая по определению вычисляется как

Γ(α) = tα−1 exp(−t)dt .

0

На заметку

У гамма-функции есть ряд интересных свойств. Например, для целочисленного значения n имеет место соотношение Γ(n) = (n −1)! . Для аргумента 0 < α < 1 имеет место соотношение Γ(α)Γ(1 − α) = πsin(απ). Отсюда

при α = 1 2 получаем Γ(1 2) = π .

Документ, в котором определяется гамма-функция и приводятся примеры ее использования, приведен на рис. 6.5.

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

>>Gamma=@(alpha)quadgk(@(t)t.^(alpha-1).*exp(-t),0,Inf);

>>Gamma(6)

ans = 120.0000

>>factorial(5) ans =

120

>>Gamma(0.5)

242

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

Рис. 6.5. Определение интеграла с параметром

ans = 1.7725

>> sqrt(pi) ans = 1.7725

Непосредственно гамма-функция определяется командой Gamma=@(alpha) quadgk(@(t)t.^(alpha-1).*exp(-t),0,Inf). Здесь в инструкции вычисления интеграла quadgk(@(t)t.^(alpha-1).*exp(-t),0,Inf)

присутствует параметр alpha, который является аргументом для внешней функции.

После определения функции ее можно использовать. В документе приведено две команды вызова созданной функции. Сначала командой Gamma(6) вычисляется значение гамма-функции с целочисленным аргументом. Результат равен 5!=120. Именно это значение (для контроля) вычисляется командой factorial(5). Еще одно значение гамма-функции вычисляется командой Gamma(0.5). Для сравнения также приведено значение sqrt(pi). Как видим, результаты совпадают.

243

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

Дифференциальные уравнения

Вы знаете, что это будет сложнее, чем простой ответ.

М. Горбачев

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

ВMatlab существует несколько функций для решения задачи Коши. Они перечислены в табл. 6.2 с кратким описанием их главных особенностей.

Табл. 6.2. Функции для решения задачи Коши

Функция

Описание

 

 

ode45()

Функция для решения нежестких дифференциальных уравнений яв-

ным методом Рунге-Кутты порядка 4 и 5

 

 

ode23()

Функция для решения нежестких дифференциальных уравнений яв-

ным методом Рунге-Кутты порядка 2 и 3

 

 

ode113()

Функция для решения нежестких дифференциальных уравнений

методом Адамса типа предиктор-корректор переменного порядка

 

 

ode15s()

Функция для решения жестких дифференциальных уравнений ме-

тодом обратного дифференцирования

 

 

ode23s()

Функция для решения жестких задач модифицированным одноша-

говым методом Розенброка

 

 

ode23t()

Функция для решения жестких задач неявным методом трапеций

ode23tb()

Функция для решения жестких задач с помощью неявного метода

Рунге-Кутты

 

 

ode15i()

Функция для решения неявных (не разрешенных относительно про-

изводной) дифференциальных уравнений и систем

 

 

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

ивизуализации полученных результатов.

На заметку

Несколько слов об основных подходах, используемых при решении дифференциальных уравнений (и их систем) в числовом виде. Одним из наиболее простых в реализации является метод Эйлера. Суть его рассмотрим на примере решения уравнения вида y′(x) = f (x,y) с начальным условием y(x0) = y0 . В методе Эйлера решение ищется по такой схеме. Выбирается достаточно малый шаг приращения аргумента h . Значения функции вычисляются в узлах xk = x0 + kh

244

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

(то есть xk +1 = xk + h ). Значения функции в узловых точках вычисляются по формуле yk +1 = yk + hf (xk,yk ). Эта формула является следствием при-

ближенного выражения для производной y′(xk +1) ≈ y(xk +1) −y(xk ) . Это

h

так называемый явный метод Эйлера. Здесь для оценки производной в следующем узле используются значение функции в текущем узле. Такой подход удобен с точки зрения его практической реализации, но далеко не всегда обеспечивает требуемый уровень точности. Более эффективным может быть неявный метод, в котором значение функции в новом узле вычисляется по формуле yk +1 = yk + hf (xk,yk +1). Это соотношение является алгебраическим уравнением, которое необходимо решить относительно yk +1 . К сожалению, даже этот подход не является панацеей. Часто приходится использовать более точные методы. Например, достаточно популярны методы Рунге-Кутты. Методы базируются на использовании ряда Тейлора (по переменной шага прира-

щения h ): y(xk +1) = y(xk + h) = y(xk ) + hy′(xk ) +... + hm y(m)(xk ) +... .

m !

Это позволяет записать добавку для функции в новой узловой точке в виде

yk +1

yk

= hy′(xk ) +... +

hm

y(m)(xk ) +....

 

В

явном методе

порядка

m !

N

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

значение функции

 

в новой

узловой

точке вычисляется

в виде

yk +1

= yk

+ hF(yk,xk,h), где функция F(yk,xk,h)

является приближением

для выражения y′(x

 

) +

 

h

y′′(x

 

) +... +

hN −1

y(N )(x

 

). Другими словами,

k

 

 

k

 

k

 

 

 

 

2!

 

 

 

N !

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

в ряде Тейлора оставляют слагаемые до степени N включительно, после чего для добавки yk +1 yk строится аппроксимация. В неявных методах эта добавка зависит не только от yk , но и от yk +1 . Для более детальной справки отсылаем читателя к специальной литературе.

Описанные методы относятся к так называемым одношаговым. В этих методах для определения значения функции yk +1 в узле xk +1 достаточно знать значение функции yk в соседнем узле xk . Многошаговые методы подразумевают вычисление значения функции yk +1 в узле xk +1 на основании значений функции в нескольких соседних узлах. К многошаговым методам относятся, например, методы Адамса (в разных реализациях).

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

Рассмотрим некоторые методы решения дифференциальных уравнений и их систем с помощью встроенных функций Matlab. Начнем со следующей задачи: необходимо решить дифференциальное уравнение y′ = y2 −2 x2 с начальным значением y(1) = 1.

245

Самоучитель 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