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

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

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

Глава 9. Символьные вычисления

Рис. 9.21. Определение функции

На рис. 9.22 приведен пример объявления и использования функции двух переменных.

Функция объявляется командой F:=(x,y)->sin(x)*sin(y)/sqrt(x^2+ y^2). Там же приведен пример вызова этой функции при создании двумерного графика. При этом функция передается с одним фиксированным аргументом. На рис. 9.23 приведены другие примеры использования функции двух переменных.

На заметку

Стоит отметить, что необходимости отдельно объявлять символьные переменные в среде MuPAD нет. Все переменные по умолчанию полагаются символьными, а операции выполняются в символьном виде.

371

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

Рис. 9.22. Функция двух переменных

Рис. 9.23. Использование функции двух переменных

372

Глава 9. Символьные вычисления

Вычисление производных

Нас всех губит отсутствие дерзости в перспективном видении проблем. Мы не можем себе позволить фантазировать.

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

Не будет большой новостью узнать, что производные в MuPAD вычисляются с помощью функции diff(). Дифференцируемое выражение указывается первым аргументом функции, а переменная дифференцирования – вторым. Примеры использования функции diff() для вычисления производной приведены в документе на рис. 9.24.

Рис. 9.24. Производная от функции одной переменной вычислена с помощью функции diff()

Дифференцируемое выражение может быть непосредственно указано аргументом функции diff(), как в команде diff(x^2*sin(x),x). Этой же функцией diff() вычисляются производные высоких порядков. В общем случае переменные, по которым вычисляются производные от выражения – первого аргумента функции diff(), указываются через запятую в соответствии с порядком вычисления производной. Поскольку переменная дифференцированиявданномслучаеодна,тоименнооначереззапятуюуказывается в списке аргументов функции diff(). Например, команда diff(f(x),x)

373

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

означает первую производную, а команда diff(f(x),x,x) означает вторую производную. В обоих случаях дифференцируется выражение f(x), вычисленное на основе функции f(), определенной ранее.

На заметку

Результат вычисления производной очень часто представлен в неупрощенном виде. Для упрощения результата используют функцию simplify(), аргументом которой передается упрощаемое выражение. Бывает удобно в качестве ссылки на результат предыдущей команды использовать инструкцию %, как, например, в команде simplify(%).

Интерес представляет команда simplify(diff(f(x),x$100)). Вопервых, здесь команда дифференцирования "спрятана" аргументом функции simplify() – то есть производная вычисляется, и результат сразу упрощается. Но что же это за производная? Это 100-я производная по переменной x от выражения f(x). Чтобы понять это, необходимо учесть, что результатом инструкции x$100 является последовательность из 100 элементов, каждый из которых равен x.

На заметку

Последовательность – набор элементов, разделенных запятыми. Оператор последовательности $ имеет несколько форм вызова. В формате x$n формируется последовательность из n элементов x.

Что касается функции diff(), то она хороша всем, кроме одного – с ее помощью не получится вычислить производную для конкретного числового зна-

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

При работе с функциями одной переменной производные можно вычислять с помощью специального оператора производной – штриха. Штрих возле имени функции означает производную от этой функции. Также производная вычисляется с помощью функции D(). Аргументом этой функции указывается имя функции, для которой вычисляется производная. Обратимся к примерам в продолжении рассмотренного выше документа, представленном на рис. 9.25.

Если воспользоваться командой вида f', в результате получим формальное правило вычисления производной от функции одной переменной f().

На заметку

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

имя_функции:=аргументы->выражение можно интерпретировать следующим

374

Глава 9. Символьные вычисления

Рис. 9.25. Вычисление производной с помощью функции D() и символа производной

образом. Инструкция аргументы->выражение задает правило, определяющее, какие действия должны быть выполнены, в соответствии с этим правилом, над аргументами, чтобы получить выражение. Это правило в качестве значения присваивается переменной имя_функции. Эта переменная становится оператором, действие которого на аргументы сводится к применению соответствующего правила. Другими словами, если имеет место команда имя_функции(аргументы), то результат получается применением правила аргументы->выражение к аргументам.

Если используем команду f'(z), то получаем значение производной от функции f(z) по переменной z. Удобно и то, что при вычислении производной с помощью оператора "штрих" аргументом функции может быть указано число – например, как в команде f'(2). В этом случае сначала вычисляется производная, а затем в полученное выражение вместо символьной переменной, по которой вычислялась производная, подставляется значение 2.

375

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

Оператор "штрих" можно использовать несколько раз подряд, чтобы вычислить производную более высокого порядка, чем первый. Так, производная второго порядка вычисляется командой f''(t). Правда, такой подход не очень удобен при вычислении производных очень высокого порядка. Намного легче это сделать с помощью функции D(). Аргументом функции указывается имя дифференцируемой функции. Результатом является оператор, определяющий функциональную зависимость для производной от исходной функции. Таким образом, этот оператор может быть применен к аргументу (или аргументам). Например, инструкцией D(f) вычисляется оператор для производной. Командой D(f)(z) вычисляется выражение для производной при значении символьной переменной z, а командой D(f)

(2) вычисляется значение производной при значении аргумента 2. Вычислить производную высокого порядка (например, 100-ю) можно с помощью оператора функциональной композиции @@, который полезен при многократном действии функционального оператора. Команда вычисления 100-й производной имеет вид (D@@100)(f)(t).

На заметку

По определению оператора @@ инструкция вида (f@@5)(x) означает вычисление выражения f(f(f(f(f(x))))). Соответственно, инструкция

(D@@100)(f)(x)означает вычисление выражения D(D(...(D(D(f)))))

(x) – символов D должно быть ровно 100.

Частные производные также вычисляются достаточно просто. В этом случае применяется функция diff() или функция D(). В документе на рис. 9.26 процесс вычисления частных производных иллюстрируется на примере функции F(x,y) = xn exp(−ay) двух переменных – задается командой

F:=(x,y)->x^n*exp(-a*y).

Частая производная

2F(x,y)

вычисляется командой diff(F(x,y),x,y).

xy

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

При вычислении частных производных с помощью функции D() первым ее аргументом указывается список с числами, определяющими номера аргументов функции, по которым вычисляются частные производные. Второй аргумент функции D() является именем функции, от которой вычисляются частные производные. Инструкция D([1],F) означает, что производная вычисляется по первому аргументу функции F(). Результатом является оператор, определяющий функциональную зависимость для соответствующей частной производной.

376

Глава 9. Символьные вычисления

Рис. 9.26. Вычисление частных производных разными методами

Команда D([1,2],F)(x,y) означает частную производную

2F(x,y)

(то

xy

есть производная по первому x и второму y аргументам). Для вычисления

производной 6F(x,y)

(пятая производная по первому аргументу и пер-

5

x =2

x y

y=1

 

вая производная по второму аргументу, при значении первого аргумента 2 и значении второго аргумента 1) используем команду D([1$5,2],F)(2,1).

На заметку

Результат инструкции 1$5 есть последовательность из пяти единиц, то есть

1,1,1,1,1.

377

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

Вычисление интегралов

Если возражений нет, то форма принимается. Приступим к проверке содержания.

К/ф "Чародеи"

Интегралы вычисляются функцией int(). Первым аргументом указывается подынтегральное выражение. Второй аргумент – переменная интегрирования. Если интеграл определенный, то переменная интегрирования указывается вместе с диапазоном изменения.

На заметку

Бесконечность обозначается ключевым словом infinity.

Примеры вычисления интегралов приведены в документе на рис. 9.27.

Рис. 9.27. Вычисление интегралов

Неопределенный интеграл

exp(−ax)cos(bx)dx = b sin(bx) −a cos(bx) exp(−ax) a2 +b2

вычисляется командой int(exp(-a*x)*cos(b*x),x). Для вычисления

определенного интеграла exp(−x)cos(5x)dx = 1 используем коман-

26

0

378

Глава 9. Символьные вычисления

ду int(exp(-x)*cos(5*x),x=0..infinity). Так же легко вычисля-

π2

ется интеграл cos(x)3 sin(x)7dx = 1 . В этом случае мы используем

40

0

команду int(cos(x)^3*sin(x)^7,x=0..PI/2). Здесь все достаточно просто. Тем не менее, нередко при вычислении интегралов, особенно несобственных, приходится задавать дополнительные условия относительно параметров, которые входят в интеграл. Например, интеграл Пуассона

π сходится при значениях параметра a > 0 . При вы-

exp(−ax2)dx =

1

 

 

2

 

a

0

 

 

 

числении соответствующего интеграла в среде MuPAD необходимо предварительно указать, что переменная a, входящая в подынтегральное выражение, положительна. Для этого перед вычислением интеграла командой assume(a>0) задаем нужное ограничение на переменную a. После этого интеграл вычисляется командой int(exp(-a*x^2),x=0..infinity).

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

1

 

числить интеграл sin(2πx)dx с помощью команды int(sin(2*PI*x)/

0

1 + x

 

sqrt(1+x),x=0..1).

 

Рис. 9.28. Вычисление определенного интеграла в числовом виде

379

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

В таком случае можно прибегнуть к вычислению интеграла в числовом виде. Для этого используем команду float(int(sin(2*PI*x)/sqrt(1+x), x=0..1)) или numeric::int(sin(2*PI*x)/sqrt(1+x),x=0..1). В первом случае выполняется попытка вычислить интеграл в символьном виде, и если не удается, то вычисления производятся с использованием числовых алгоритмов. Во втором случае числовые алгоритмы используются сразу.

Решение алгебраических уравнений

и неравенств

Работа у меня такая – думать дальше своего носа.

Дж. Буш (младший)

Для решения алгебраических уравнений и неравенств используется функция solve(). Аргументами функции solve() передаются уравнения или неравенства, которые необходимо решить. Если уравнений (неравенств) несколько, они оформляются в виде списка – заключаются в квадратные скобки. Кроме уравнений и неравенств, обычно указывают переменные, относительно которых решается уравнение, неравенство или система. Если таких переменных несколько, то они тоже заключаются в квадратные скобки. Пример решения алгебраического уравнения и системы из двух алгебраических уравнений приведен в документе на рис. 9.29.

Рис. 9.29. Решение алгебраических уравнений и систем

380