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

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

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

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