Россия, Новосибирск, НГПУ, 1994 |
Символьные вычисления
5.2. Правила преобразований — подстановки
Подстановки как с ключевой элемент одного из стилей программирования мы рассмотрим в одной из следующих лекций. Здесь мы познакомимся с самим понятием подстановок и применением их для целей преобразования выражений.
Е. М. Воробьёв [1, с. 38] определяет подстановки следующим образом: "Подстановки — это алгебраические преобразования, в результате выполнения которых какая-либо часть алгебраического выражения заменяется на новое выражение". Подстановка в Mathematica реализуется знакомым нам из лекции 2 способом — с помощью функции Set[expr1,expr2] или в инфиксной форме expr1=expr2. Согласно Е. М. Воробьёву [1, с. 38], подстановка осуществляется следующим образом: сначала вычисляется выражение expr2, а затем результат вычисления присваивается выражению expr1. При дальнейших вычислениях выражение expr1, в каком бы месте программы оно ни встречалось, будет заменяться результатом вычисления выражения expr2. Выражения expr1 и expr2 также могут быть списками, поэтому в результате выполнения действия {expr11,expr12,...}={expr21,expr22,...} вычисленное выражение expr21 будет присвоено выражению expr11, выражение expr22 — выражению expr12 и т.д.
Отменить присвоение значения выражению expr1, то есть, снова сделать его символом, можно с помощью также известной нам функции Clear[smb1,smb2,...], где smb1,smb2,... — символы, значения которых нужно отменить. Для одного символа smb можно воспользоваться также уже известной нам формой smb=. выражения Unset[smb].
Функция Set задает глобальную подстановку, то есть действует на аргумент в пределах всего текста программы. Если же замену одного выражения другим следует осуществить в одном конкретном выражении, то применяется так называемая локальная подстановка или локальное правило преобразования, задаваемое в виде Rule[expr1,expr2] или expr1->expr2. В соответствии с этим правилом осуществляется подстановка вычисленного выражения expr2 вместо expr1. Выражение expr2 вычисляется в момент задания правила Rule. Если expr2 требуется вычислить в момент обращения к Rule, следует использовать функцию отложенной подстановки RuleDelayed[expr1,expr2], или expr1:>expr2.
Применить правило преобразования rule=expr1->expr2 (такое правило мы задаём в примере In[2] на рис. 5.11) к некоторому выражению mainexpr, содержащему заменяемое выражение, помогает функция ReplaceAll[mainexpr,rule] (постфиксная форма /.rule) — пример In[3]. Отдельно задавать и присваивать подстановку какому-либо символу (как в примере In[2]) целесообразно, только если она будет применяться несколько раз в процессе вычислений. Если же подстановка применяется единожды, то ее можно задать непосредственно в виде второго аргумента rule1 — пример In[4].
Можно совершать несколько подстановок одновременно. Для этого следует задать функцию в виде ReplaceAll[mainexpr,{rule1,rule2,...}], где rule1,rule2,... — требуемые подстановки (пример In[5] на рис. 5.11).
Подробней о глобальных подстановках и функции ReplaceAll см. книгу Е. М. Воробьёва [1, с. 38–39].
Порой требуется осуществить подстановку многократно. Например, в нашем выражении требуется заменить на , а на , то есть, в конечном итоге требуется заменить на . При однократном осуществления подстановки в нашем примере в результате снова получается выражение, в котором символ больше не присутствует, однако по-прежнему входит символ — пример In[2] на рис. 5.12. Для достижения требуемого результата, то есть избавления от символа в конечном выражении имеется два способа. Первый — повторно воспользоваться функцией ReplaceAll — пример In[3]. Второй более изящный способ — воспользоваться функцией, автоматически осуществляющей подстановку два раза — ReplaceRepeated[mainexpr,{rule1,rule2,...}] (постфиксная форма //.mainexpr,{rule1,rule2,...}) — пример In[4].
Подробней о функции ReplaceRepeated см. книгу Е. М. Воробьёва [1, с. 40].
Е. М. Воробьёв [1, с. 40] акцентирует внимание на ещё одной функции, которая может оказаться полезной: "После подстановки могут возникнуть выражения вида (xk)п, которые можно привести к виду xkn с помощью функции PowerExpand. Эта функция преобразует в , какого бы вида ни было . Преобразования, сделанные с помощью функции PowerExpand корректны в общем случае, только если есть целое, а и положительные".
5.3. Функции математического анализа
5.3.1. Дифференцирование и интегрирование
При проведении математических и технических расчетов именно операции математического анализа используются чаще всего. Одна из основных операций математического анализа — дифференцирование. Mathematica умеет вычислять производные всех стандартных математических функций, а также специальных функций (А. Н. Прокопеня и А. В. Чичурин [5, с. 31]). Производную первого порядка функции expr по переменной var вычисляют при помощи выражения D[expr,var] (пример In[1] на рис. 5.13) При вычислении смешанных и кратных производных аргумент var задаётся в виде списка. Производную высшего порядка n вычисляют при помощи функции D[expr,{var,n}], а производную по нескольким переменным var1,var2,... — при помощи D[expr,var1,var2,...] (примеры In[2] и In[3]). Функция D[expr,{{var1,var2,...}}] для скалярного выражения expr даёт вектор производных expr по каждой из переменных var1,var2,... (пример In[4]).
Рассмотрим произвольную функцию f[x,y] и вычислим ее третью смешанную производную \partial ^3f/\partial х^2\partial у — пример In[5] на рис. 5.13. Обозначение производной в Out[5] задано выражением (2,1), компоненты которого показывают, что вычислена вторая производная по первому аргументу и первая производная по второму аргументу. Выражение типа (2,1) называется мультииндексом (Е. М. Воробьёв [1, с. 51]). Сумма компонент мультииндекса даёт порядок производной. Если Mathematica не может явно вычислить производную, она сводит вычисление к выражениям с видом Derivative[n1,n2,...][f]. В примере In[6] представлена внутренняя форма вычисленного выражения Out[5].
Если выражение, к которому применена функция дифференцирования, не содержит переменных, по которым дифференцирование осуществляется, то Mathematica D рассматривает это выражение как константу по переменным дифференцирования. Поэтому при вычислении производной некоторой функции необходимо обязательно в явном виде указывать её аргумент — см. соответствующие примеры In[7] и In[8] на рис. 5.13. Если в функции двух аргументов один аргумент зависит от другого, например, , то эту зависимость также следует явно указывать — см. пример In[9].
В Mathematica имеется функция Dt[expr,var], которая находит полную производную выражения expr: она рассматривает все символы в выражении expr как функции от переменных var, по которым осуществляется дифференцирование — пример In[1] на рис. 5.14. Функция в упрощённом виде, без второго аргумента, Dt[expr], есть дифференциал выражения expr — пример In[2].
Если дифференцируемое выражение expr содержит какие-либо константы, т.е., при дифференцировании их производные равны нулю, то их можно указать в соответствующей опции, т.е., задать функцию дифференцирования в виде Dt[expr,var,Constants->{const1,const2,...}], где {const1,const2,...} — список имеющихся в выражении expr констант (примеры In[3] и In[4] на рис. 5.14).
Подробней о функциях дифференцирования см. книги Е. М. Воробьёва [1, с. 51–52] и А. Н. Прокопени и А. В. Чичурина [5, с. 31–32].
Другая важнейшая операция математического анализа — нахождение первообразной. Первообразная функции expr по аргументу arg находится в Mathematica при помощи функции Integrate[expr,arg]. По сути, находится неопределённый интеграл, в котором отсутствует константа интегрирования. Пример In[1] нахождения первообразной см. на рис. 5.15.
Mathematica также позволяет вычислять определённые интегралы: для этого второе выражение следует задать в виде списка, содержащего переменную интегрирования expr, верхний uppval и нижний lowwal пределы интегрирования. При этом функция вычисления определённого интеграла будет выглядеть следующим образом: Integrate[expr,{arg,lowval,uppval}]. На рис. 5.15. см. пример In[2] нахождения определённых интегралов.
При помощи всё той же функции Integrate Mathematica умеет вычислять кратные интегралы, как неопределённые, Integrate[expr,arg1,arg2}], так и определённые, Integrate[expr,{arg1,lowval1,uppval1},{arg2,lowval2,uppval2}], причём первым указывается переменная (или переменная с пределами интегрирования), интегрирование по которой производится в последнюю очередь (А. Н. Прокопеня и А. В. Чичурин [5, с. 34]) — пример In[3] на рис. 5.15.
Безусловно, кратный интеграл можно вычислить последовательным нахождением одиночных интегралов по соответствующим дифференциалам, когда результат вычисления первого интеграла указывается в качестве подынтегрального выражения второго одиночного интеграла и т.д. — ср. результаты вычислений Out[3] и Out[4] на рис. 5.15.
Помимо стандартных математических функций Mathematica позволяет интегрировать выражения, содержащие спецфункции. На рис. 5.15. представлен пример In[5] интегрирования выражения, содержащего функцию ошибок.
Несмотря на свои весьма широкие возможности, Mathematica порой не может в символьном виде вычислить интеграл, т.е., представить результат интегрирования в виде формулы. В этом случае она выдаёт введённое выражение без изменений — пример In[6] на рис. 5.15. Однако если в подынтегральном выражении expr и пределах интегрирования lowval и uppval все параметры определены (т.е., имеют численное значении), можно выполнить численное интегрирование при помощи функции NIntegrate[expr,{arg,lowval,uppval}]. В примере In[7] мы численно нашли интеграл, который не сумели вычислить аналитически в In[6].
Подробней о функциях интегрирования см. книги Е. М. Воробьёва [1, с. 52–53] и А. Н. Прокопени и А. В. Чичурина [5, с. 32–34].