Цель лекции: познакомиться с принципами выполнения символьных вычислений и рядом предназначенных для этого встроенных функций Mathematica.
Большинство систем компьютерной математики изначально разрабатывалось для выполнения численных расчётов. Пользователь на языке программы задаёт алгебраическую зависимость, вводит набор начальных численных данных и на выходе также получает набор численных данных. Всю рутину вычислений берёт на себя компьютер. По сути, с этой позиции компьютер выступает как очень хороший программируемый калькулятор. В предыдущей лекции мы познакомились с представлением чисел в Mathematica и основами работы с ними. Как мы помним, точными оказываются результаты весьма ограниченного круга вычислений. Большинство результатов оказываются приближёнными. Кроме того, для понимания некоторых моделей может не хватать голых численных данных. Простая алгебраическая зависимость порой может сказать о системе гораздо больше, чем массив подробных численных данных.
Пакет Mathematica — одна из немногих систем, что позволяют аккуратно и качественно выполнять символьные операции и получать результаты вычислений в аналитическом (формульном) виде. Численные результаты в этом случае оказываются развитием и продолжением аналитических. Взяв за основу работу Е. М. Воробьёва [1], познакомимся с основными принципами и встроенными функциями Mathematica для осуществления символьных вычислений и численных расчётов.
Е. М. Воробьёв [1, с. 34] предлагает, не углубляясь в теорию, начать рассмотрение функций преобразования многочленов с простейших примеров. Так же поступим и мы. Присвоим некоторому символу b1 некоторое выражение, например, $$b1=(x+y)2+(x-y)(x+y)$$. Как мы видим в примере Out[1] на рис. 5.1, Mathematica самостоятельно вовсе не старается ни раскрыть скобки в этом выражении, ни упростить его. Для того чтобы раскрыть произведения и положительные степени сумм в выражении expr, используется функция Expand[expr] — пример In[2]. Функция также может задаваться в виде Expand[expr,pattern], где второй аргумент pattern задаёт шаблон для элементов выражения expr, которые следует раскрыть при вычислении, при этом все остальные элементы оказываются нераскрытыми. Так в примере In[3] мы раскрываем только выражения, содержащие $$(x+y)$$, в примере In[4] — содержащие $$(x-y)$$.
Подробней о функции Expand см. книгу Е. М. Воробьёва [1, с. 34–35].
(рис 5.1) Раскрытие скобок в выражении
Для упрощения выражений применяется функция Factor[expr], которая раскладывает многочлен expr на множители. Обе функции, и Expand[expr], и Factor[expr], имеют опции – дополнительные аргументы, которые указывать необязательно. Одна их таких опций — Trig. Если активировать её, задав Trig->True, то при раскрытии произведения или упрощении выражения тригонометрические функции будут рассматриваться как функции экспонент. Примеры In[2] и In[3] упрощения выражений при помощи функции Factor см. на рис. 5.2.
Для упрощения выражений также используется функция FactorList[expr], однако вывод результата вычисления имеет достаточно специфический вид. Вычисленное выражение представляет собой вложенный список, элементами которого являются внутренние списки, состоящие из двух элементов. Первым элементом внутреннего списка является множитель полинома expr, а вторым — показатель степени этого множителя, с которым он входит в разложение полинома. Самый первый элемент вложенного списка есть общий числовой множитель: если он равен единице, то список начинается с {1,1}. Пример использования FactorList[expr] — In[4] на рис. 5.2.
(рис 5.2) Упрощение выражений
Функция FactorTerms[expr,x] выносит общий числовой множитель, который не зависит от х. Более полная форма функции FactorTerms[expr,{x1,x2,...}] последовательно выделяет множители, которые не зависят от каждого из x1,x2,.... Выражение FactorTermsList[expr,{x1,x2,...}] возвращает список множителей выражения expr. Первый элемент в списке — общий числовой множитель, второй — множитель, который не зависит ни от одного из заданных x1,x2,.... Следующие элементы — множители, которые не зависят от как можно большего числа x1,x2,.... Примеры вынесения множителей выражения см. на рис. 5.3.
Подробней о функциях упрощения выражений см. книгу Е. М. Воробьёва [1, с. 35].
(рис 5.3) Вынесение множителей выражения
Mathematica позволяет определять коэффициенты при некотором выражении expr, содержащемся многочлене pol при помощи функции Coefficient[pol,expr], а функция CoefficientList[pol,expr] возвращает список коэффициентов при степенях expr в полиноме pol: первым элементом списка будет коэффициент при нулевой степени выражения expr, а последним — при наибольшей степени expr в полиноме pol. Примеры In[1] – In[3] на рис. 5.4 демонстрируют возможность определения коэффициентов при выражениях в полиноме.
Если в полиноме отсутствует выражение, содержащее expr в какой-то степени, то соответствующий элемент списка коэффициентов принимает значении 0 (пример In[4] на рис. 5.4). Таким образом, выражение CoefficientList[pol,expr] генерирует список, содержащий количество элементов на 1 большее, чем максимальная степень выражения expr в pol.
Подробней о функциях Coefficient и CoefficientList см. книгу Е. М. Воробьёва [1, с. 36].
(рис 5.4) Определение коэффициентов при конкретных выражениях в полиноме
Ещё одна полезная функция преобразовании выражений — Collect[pol,expr], которая собирает члены с одной и той же степенью expr в многочлене pol. Заданная в расширенной форме Collect[pol,{expr1,expr2,...}] функция группирует члены с одинаковыми степенями expr1,expr2,.... Примеры использования функции Collect — In[1] – In[3] на рис. 5.5.
Подробней о функции Collect см. книгу Е. М. Воробьёва [1, с. 36–37].
При работе с полиномами полезной может оказаться функция Length, уже знакомая нам по лекции, посвящённой работе со списками. В общем случае результат применения функции Length к некоторому выражению expr зависит от внутренней формы этого выражения, точнее от того, какой заголовок указан на верхнем уровне полной формы этого выражения. Если выражение expr является многочленом (In[4] на рис. 5.5), то искомый заголовок — Plus (In[5]), и, соответственно, результатом выполнения функции Length[expr] будет количество слагаемых в многочлене expr (In[6]). Если выражение expr представляет собой, например, произведение нескольких многочленов (In[7]), то искомый заголовок — Times (In[8]). В этом случае функция Length[expr] вернёт количество множителей выражения expr (In[9]).
(рис 5.5) Группировка членов при разных степенях одного выражения
Если требуется выяснить, является ли выражение expr многочленом для некоторой переменной var, то следует воспользоваться выражением PolynomialQ[expr,var], возвращающим True, если expr — действительно полином по переменной var, и False в противном случае. Для нескольких переменных следует задавать функцию в виде PolynomialQ[expr,{var1,var2,..}]. Упрощённая форма PolynomialQ[expr] проверяет, является ли вообще expr полиномом относительно каких-либо переменных. Однако функция может вернуть False, например, в случае, когда expr содержит числа типа Real. Примеры In[1] – In[5] проверки выражения, является ли он полиномом относительно той или иной переменной, см. на рис. 5.6.
Функция Variables[expr] возвращает список всех переменных в выражении expr — пример In[6] на рис. 5.6. Как мы видим, встроенные функции Mathematica, задающие математические функции, также могут выступать в роли переменных (в нашем примере это выражение Cos[x]).
Подробней о функциях выяснения структуры полиномов см. книгу Е. М. Воробьёва [1, с. 37].
(рис 5.6) Использование функций PolinomialQ и Variables в отношении полиномов
При работе с полиномами может возникнуть необходимость в нахождении наибольшего общего делителя и наименьшего общего кратного. Для полиномов expr1 и expr2 НОД находится с помощью функции PolynomialGCD[expr1,expr2], при этом все символьные параметры рассматриваются как переменные, и деление на них невозможно. Функция PolynomialLCM[expr1,expr2] возвращает НОК полиномов expr1 и expr2. См. соответствующие примеры In[3] и In[4] на рис. 5.7.
(рис 5.7) Нахождение наименьшего общего кратного и наибольшего общего делителя полиномов
Е. М. Воробьёв [1, с. 40] определяет рациональные выражения следующим образом: "Дробь, числитель и знаменатель которой — полиномы, называется рациональным выражением". Функции Factor и Expand, с которыми мы познакомились выше, также можно применять и к рациональным выражениям. Функция Expand[rexpr] раскрывает числитель и представляет рациональное выражение rexpr в виде суммы дробей, знаменателями которых выступает знаменатель исходного выражения, а числители являются слагаемыми раскрытого числителя — пример In[2] на рис. 5.8. Функция Factor[rexpr] раскладывает на множители и числитель, и знаменатель. Если выражение rexpr является суммой рациональных выражений, то функция Factor[rexpr] приводит все выражения суммы к общему знаменателю и также раскладывает на множители и числитель, и знаменатель — пример In[3] на рис. 5.8.
Ещё одна функция, которая специфическим образом работает с суммой рациональных выражений — Together[rexpr]: она приводит выражения суммы к общему знаменателю и сокращает общие множители — пример In[4] на рис. 5.8.
Новая для нас функция Apart[rexpr] раскладывает рациональное выражение rexpr на сумму простых дробей — пример In[5] на рис. 5.8.
(рис 5.8) Простейшие преобразования рациональных выражений
Зачастую может возникнуть необходимость провести преобразования только числителя или только знаменателя дроби. Выделить числитель и знаменатель рационального выражения rexpr позволяют функции Numerator[rexpr] и Denomenator[rexpr], соответственно — примеры In[2] и In[3] на рис. 5.9.
Mathematica позволяет, не извлекая числителя и знаменателя из рационального выражения rexpr, производить их раскрытие: для этого используются функции ExpandNumerator[rexpr] и ExpandDenominator[rexpr], соответственно — примеры In[4] и In[5] на рис. 5.9.
Упрощение выражений (и рациональных в том числе) осуществляется функцией Simplify. Результатом применения этой функции к выражению expr является простейшая с точки зрения Mathematica форма этого выражения — пример In[6] на рис. 5.9.
Подробней о функциях преобразования рациональных выражений см. книгу Е. М. Воробьёва [1, с. 40–42].
(рис 5.9) Работа с числителем и знаменателем рационального выражения
В предыдущих лекциях мы уже познакомились с некоторыми встроенными функциями, которые задают тригонометрические математические функции: это функции нахождения синуса Sin и косинуса Cos. Другие тригонометрические функции в Mathematica: тангенс Tan и котангенс Cot, секанс Sec и косеканс Csc. Обратные тригонометрические функции: арксинус ArcSin и арккосинус ArcCos, арктангенс ArcTan и арккотангенс ArcCot, арксеканс ArcSec и арккосеканс ArcCsc.
Гиперболические функции задаются в Mathematica следующим образом: гиперболические синус Sinh и косинус Cosh, тангенс Tanh и котангенс Coth, секанс Sech и косеканс Csch. Обратные гиперболические функции: гиперболические арксинус ArcSinh и арккосинус ArcCosh, арктангенс ArcTanh и арккотангенс ArcCoth, арксеканс ArcSech и арккосеканс ArcCsch.
По умолчанию в Mathematica углы задаются в радианах. Однако если пользователь хочет оперировать углами, заданными в градусах, программа даёт такую возможность. Чтобы аргумент тригонометрической функции воспринимался как заданный в градусах, к нему справа следует дописать выражение Degree. В In[1] рис. 5.10 аргументы первых двух функций мы задали в радианах, а двух последних — в градусах.
Для преобразования выражений, содержащих тригонометрические и гиперболические функции, в Mathematica имеется целый набор встроенных функций (А. Н. Прокопеня и А. В. Чичурин [5, с. 27–28].
Функция TrigExpand[texpr] избавляет выражение texpr от кратных углов, заменяя тригонометрические и гиперболические функции от них степенями и произведениями функций, а также раскрывает скобки.
Противоположное действие осуществляет функция TrigReduce[expr]: она заменяет произведения и степени тригонометрических и гиперболических функций в expr функциями кратных углов.
Функция TrigFactor[expr] преобразует выражение expr, используя соотношения между тригонометрическими (гиперболическими) функциями.
TrigToExp[expr] записывает тригонометрические и гиперболические функции через экспоненты, а функция ExpToTrig[expr] совершает обратное действие — записывает экспоненту от комплексного аргумента в expr через тригонометрические или гиперболические функции.
Примеры использования функций преобразования выражений, содержащих тригонометрические и гиперболические функции, см. на рис. 5.10.
(рис 5.10) Преобразование выражений, содержащих тригонометрические и гиперболические функции
Подстановки как с ключевой элемент одного из стилей программирования мы рассмотрим в одной из следующих лекций. Здесь мы познакомимся с самим понятием подстановок и применением их для целей преобразования выражений.
Е. М. Воробьёв [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].
(рис 5.11) Одиночная подстановка выражения
Порой требуется осуществить подстановку многократно. Например, в нашем выражении $$d=3(x-y)+(x+y)2$$ требуется заменить $$x$$ на $$a$$, а $$y$$ на $$ax$$, то есть, в конечном итоге требуется заменить $$y$$ на $$a2$$. При однократном осуществления подстановки в нашем примере в результате снова получается выражение, в котором символ $$y$$ больше не присутствует, однако по-прежнему входит символ $$x$$ — пример In[2] на рис. 5.12. Для достижения требуемого результата, то есть избавления от символа $$x$$ в конечном выражении $$d$$ имеется два способа. Первый — повторно воспользоваться функцией ReplaceAll — пример In[3]. Второй более изящный способ — воспользоваться функцией, автоматически осуществляющей подстановку два раза — ReplaceRepeated[mainexpr,{rule1,rule2,...}] (постфиксная форма //.mainexpr,{rule1,rule2,...}) — пример In[4].
Подробней о функции ReplaceRepeated см. книгу Е. М. Воробьёва [1, с. 40].
(рис 5.12) Двойная подстановка выражений
Е. М. Воробьёв [1, с. 40] акцентирует внимание на ещё одной функции, которая может оказаться полезной: "После подстановки могут возникнуть выражения вида (xk)п, которые можно привести к виду xkn с помощью функции PowerExpand. Эта функция преобразует $$(x k)^n$$ в $$x^n k^n$$, какого бы вида ни было $$n$$. Преобразования, сделанные с помощью функции PowerExpand корректны в общем случае, только если $$n$$ есть целое, а $$x$$ и $$k$$ положительные".
При проведении математических и технических расчетов именно операции математического анализа используются чаще всего. Одна из основных операций математического анализа — дифференцирование. 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 рассматривает это выражение как константу по переменным дифференцирования. Поэтому при вычислении производной некоторой функции $$f(x)$$ необходимо обязательно в явном виде указывать её аргумент — см. соответствующие примеры In[7] и In[8] на рис. 5.13. Если в функции двух аргументов $$g(x,y)$$ один аргумент зависит от другого, например, $$x(y)$$, то эту зависимость также следует явно указывать — см. пример In[9].
(рис 5.13) Нахождение частных производных
В 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].
(рис 5.14) Нахождение полных производных
Другая важнейшая операция математического анализа — нахождение первообразной. Первообразная функции 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].
(рис 5.15) Нахождение интегралов
Произвольная функция f[var] может быть разложена в степенной ряд в окрестности точки var0 до члена порядка (var-var0)^n при помощи функции Series[f[var],{var,var0,n}]. Слагаемое O[var-var0]^(n+1) в полученном выражении указывает на то, что следующий член ряда будет иметь порядок (n+1). См. соответствующий пример In[1] На рис. 5.16.
Помимо возможности создавать ряды Тейлора функция Series позволяет генерировать ряды, содержащие рациональные и отрицательные степени (пример In[2] на рис. 5.16), а также раскладывать функции в окрестностях бесконечно удалённой точки (пример In[3], аналогичный примеру из книги А.Н. Прокопени и А.В. Чичурина [5, с. 37]).
Иногда Mathematica не может представить ту или иную функцию в виде степенного ряда в окрестностях некоторой точки. Причин тому может быть масса: одна из них, например, сингулярность в этой точке (А. Н. Прокопеня и А. В. Чичурин [5, с. 37]). В этом случае вычисления не производятся, выдаётся предупреждающее сообщение, а в качестве результата возвращается введённое выражение — пример In[4] на рис. 5.16.
Одна из функций, которую нельзя представить в виде ряда — логарифмическая функция. Однако при попытке разложить содержащие её выражения возле нуля или бесконечно удалённой точки ошибки Mathematica не выдаёт: выражение исправно раскладывается в ряд, при этом в окончательном результате логарифм сохраняется в исходном виде (А. Н. Прокопеня и А. В. Чичурин [5, с. 37–38]) — пример In[5] на рис. 5.16.
Разложение в ряд есть некоторая аппроксимация функций, и слагаемое вида O[var-var0]^n является атрибутом этой аппроксимации, поэтому добавление выражения вида O[var]^n к сумме произвольных функций преобразует всю сумму в степенной ряд (А. Н. Прокопеня и А. В. Чичурин [5, с. 38]). Количество слагаемых в сумме не имеет значения: оно может быть и очень большим, и равным нулю. Пример In[6] на рис. 5.16 демонстрирует преобразование некоторого выражения в степенной ряд прибавлением к нему O[x]^6.
Обратную операцию, преобразование степенного ряда ser в обычную сумму, можно при помощи функции Normal[ser], которая отбрасывает остаточный член O[var-var0]^n и конвертирует ряд в многочлен — пример In[7] на рис. 5.16.
Узнать, является ли выражение степенным рядом, можно при помощи хорошо известной нам функции Head. Если выражение expr является степенным рядом, то Head[expr] возвращает SeriesData. В примере In[8] на рис. 5.16 мы применяем Head к полученным в Out[6] и Out[7] выражениям и убеждаемся в том, что первое из них является степенным рядом, а второе — нет.
Mathematica позволяет разлагать выражение в степенной ряд по нескольким переменным. Для этого используется та же функция Series, заданная в виде функции Series[f[var],{var1,var10,nvar1},{var2,var20,nvar2},...]. Эта операция эквивалентна последовательному разложению функции f[var1,var2,...] по переменным var1,var2,... в том порядке, в котором они указаны в функции Series — пример In[9] на рис. 5.16.
(рис 5.16) Разложение функции в степенной ряд
Поскольку степенные ряды содержат обыкновенные математические выражения, с ними можно проделывать обычные математические операции: складывать, перемножать, дифференцировать, интегрировать, возводить в степень и т.д., при этом, в результате образуются новые степенные ряды (Е. М. Воробьёв [1, с. 54] и А. Н. Прокопеня и А. В. Чичурин [5, с. 38] — примеры In[1] и In[2] на рис. 5.17.
Результатом выполнения функции Series является выражение Mathematica, во внутренней форме имеющее заголовок SeriesData. Е. М. Воробьёв [1, с. 55] описывает это выражение следующим образом: "Вычисленное выражение SeriesData[x,x0, {a0,a1,...},nmin,nmax,den] представляет отрезок степенного ряда по переменной x в окрестности точки x0. Величины a0,a1,... есть коэффициенты ряда. Разность x-x0 входит в ряд в степенях nmin/den, (nmin+1)/den,..., nmax/den". При помощи этой функции можно задавать ряд с заданными коэффициентами и степенями выражений при коэффициентах (пример In[3] на рис. 5.17), при этом неопределённые символьные коэффициенты можно задавать при помощи уже известных нам функций Table и Array (пример In[4]).
Подробней о разложении функций в степенной ряд см. книги Е. М. Воробьёва [1, с. 53–55] и А. Н. Прокопени и А. В. Чичурина [5, с. 36–40].
(рис 5.17) Преобразования рядов и непосредственное задание рядов во внутренней форме
В предыдущем пункте мы познакомились с функциями интегрирования, используемыми при описании непрерывных систем. Для дискретных систем используется функция суммирования.
Сумма в символьной форме вычисляется в Mathematica при помощи функции Sum[expr,int]; количество слагаемых в сумме может быть как конечным, так и бесконечным. Вообще второй аргумент int, задающий интервал изменения переменной, по которой производится суммирование, может быть задан в нескольких формах (А. Н. Прокопеня и А. В. Чичурин [5, с. 41]):
{i,n} — i изменяется на отрезке от 1 до n с шагом 1;{i,imin,imax} — i изменяется на отрезке от imin до imax с шагом 1;{i,imin,imax,d} — i изменяется на отрезке от imin до imax с шагом d.Mathematica стремится выразить любую функцию в виде степенного ряда.
На рис. 5.18 представлены примеры In[1], In[2] и In[3] вычисления суммы при помощи указанных выше выражений.
Если найти результат суммирования в символьной форме не удаётся, Mathematica возвращает сумму невычисленной — In[4] на рис. 5.18.
Mathematica также позволяет вычислить сумму по нескольким индексам i,j,..., для чего необходимо задать функцию в виде Sum[f,{i,imin,imax},{j,jmin,jmax},...] (пример In[5] на рис. 5.18). В заданном формате предполагается, что сумма по i является внешней, поэтому пределы изменения могут зависеть от i, и т.д.
Mathematica также позволяет вычислять произведение выражений в символьном виде, для чего используется функция Product[expr,int], причём правила задания интервала варьирования переменной такие же, как и для такового при суммировании (пример In[6] на рис. 5.18).
По аналогии с интегрированием суммирование и нахождение произведения также могут быть осуществлены численно: при этом результат вычисления будет приближённым (вещественным). Предназначенные для этого функции — NSum и NProduct — примеры In[7] на рис. 5.18.
Подробней о функциях нахождения сумм и произведений см. книгу А. Н. Прокопени и А. В. Чичурина [5, с. 41–43].
(рис 5.18) Вычисление сумм и произведений
Вычислить предел некоторой функции f[var] при стремлении var к заданному значению var0 позволяет функция Limit[f[var],var->var0]. Предел вычисляется только для функций, заданных в явном виде, в противном случае в ячейке Out возвращается исходное выражение — примеры In[1] и In[2] на рис. 5.19.
Предел ряда функций при стремлении var->var0 зависит от направления, вдоль которого осуществляется приближение var к var0. Требуемое направление задаётся опцией Direction->s, где при вычислении предела сверху вместо s следует писать -1, а снизу — 1. Для значения Automatic, используемого по умолчанию, вычисляется предел сверху, кроме случая var->Infinity (примеры In[3] и In[4] на рис. 5.19) [5, с. 40].
При стремлении var к некоторому var0 предельное значение функции f[var] не всегда существует. А.Н. Прокопеня и А.В. Чичурин [5, с. 41] приводят следующий пример: "Функция $$cos(1/x)$$, например, является быстро осциллирующей при $$x->0$$. Поэтому результатом вычисления соответствующего предела является Interval-объект, который только указывает интервал, в пределах которого может находиться вычисляемый предел". Иллюстрирующий это замечание пример In[5] на рис. 5.19 также аналогичен примеру в книге А. Н. Прокопени и А. В. Чичурина [5, с. 41].
Mathematica позволяет представлять на экране выражение для нахождения предела в традиционном для математики виде. Для этого служит функция TraditionalForm. В примере In[6] на рис. 5.19 мы в традиционной форме представили предел, записанный в In[2].
Подробней о функции нахождения предела см. книгу А. Н. Прокопени и А. В. Чичурина [5, с. 40–41].
(рис 5.19) Вычисление пределов
Подстановки — это алгебраические преобразования, в результате выполнения которых какая-либо часть алгебраического выражения заменяется новым выражением.
Рациональным выражением называется дробь, числитель и знаменатель которой — полиномы.
В данной лекции мы научились осуществлять преобразования выражений, в том числе рациональных и тригонометрических. В частности мы познакомились с функциями, предназначенными для раскрытия произведений и положительных степеней сумм, упрощения выражений. Мы научились компьютерными методами распознавать среди выражений полиномы, собирать члены полиномов при нужных степенях, находить наименьшее общее кратное и наибольший общий делитель полиномов. Мы познакомились с одним из наиболее эффективных инструментов осуществления преобразований выражений — подстановками. Мы познакомились со встроенными функциями Mathematica, позволяющими осуществлять операции математического анализа, в том числе находить производные, первообразные, суммы и произведения, раскладывать функции в ряд и находить пределы.
Expand? Factor? FactorTerms? Collect? Simplify?Factor от FactorList? FactorTerms от FactorTermsList?Trig функций Factor и Expand?Expand, Factor, Together, Apart, на рациональные выражения?$$8x^3(2x+y-y^2)^3$$
$$-8x^3(-8x^3-12x^2y-6xy^2+12x^2y^2-y^3+12xy^3+3y^4-6xy^4-3y^5+y^6)$$
$$8(8x^6+12x^5y+6x^4y^2-12x^5y^2+x^3y^3-12x^4y^3-3x^3y^4+6x^4y^4+3x^3y^5-x^3y^6)$$
$$64x^6+x^5(96y-96y^2)+x^4(48y^2-96y^3+48y^4)+x^3(8y^3-24y^4+24y^5-8y^6)$$
При помощи функции Length определите количество элементов в каждом полученном выражении. Какой заголовок находится на верхнем уровне полной формы каждого из полученных выражений?
Для решения сначала вычислите дискриминант по формуле $$D=b^2-4ac$$, затем найдите корни уравнения по формулам $$x_1=(-b+D^{1/2})/(2a)$$ и $$x_1=(-b-D^{1/2})/(2a)$$. Корни уравнения могут быть комплексными.
Решите двумя способами.
Первый способ — аналогично предыдущему пункту.
Второй способ: при помощи функций Mathematica преобразования многочленов разложите выражение в левой части уравнения на множители.
Для решения при помощи функций Mathematica преобразования многочленов разложите выражение в левой части уравнения на множители.
Для решения при помощи локальной подстановки замените $$x^2$$ символом $$y$$, затем известным способом решите квадратное уравнение относительно $$y$$.
Для решения перенесите дифференциал $$dt$$ в правую часть, средствами Mathematica проинтегрируйте обе части по соответствующим переменным.
Для решения сначала найдите корни характеристического уравнения, полученного заменой выражения $$d^2y/dx^2$$ символом $$k^2$$, а выражения $$dy/dx$$ символом $$k$$. Полученные корни подставьте в общее решение уравнения $$y=C_1exp(k_1x)+C_2exp(k_2x)$$.
$$(x^2-4)/(x-2)$$ при $$x->2$$
$$1/(x-5)-10/(x^2-25)$$ при $$x->5$$
$$sin(x)/x$$ при $$x->0$$
$$((x+2y)/x)^x$$ при x->\infty
$$(1+1/x)^{2x+1}$$ при x->\infty
$$tg(x)/x$$ при $$x->0$$
Цель лекции: познакомиться с принципами выполнения символьных вычислений и рядом предназначенных для этого встроенных функций Mathematica.
Большинство систем компьютерной математики изначально разрабатывалось для выполнения численных расчётов. Пользователь на языке программы задаёт алгебраическую зависимость, вводит набор начальных численных данных и на выходе также получает набор численных данных. Всю рутину вычислений берёт на себя компьютер. По сути, с этой позиции компьютер выступает как очень хороший программируемый калькулятор. В предыдущей лекции мы познакомились с представлением чисел в Mathematica и основами работы с ними. Как мы помним, точными оказываются результаты весьма ограниченного круга вычислений. Большинство результатов оказываются приближёнными. Кроме того, для понимания некоторых моделей может не хватать голых численных данных. Простая алгебраическая зависимость порой может сказать о системе гораздо больше, чем массив подробных численных данных.
Пакет Mathematica — одна из немногих систем, что позволяют аккуратно и качественно выполнять символьные операции и получать результаты вычислений в аналитическом (формульном) виде. Численные результаты в этом случае оказываются развитием и продолжением аналитических. Взяв за основу работу Е. М. Воробьёва [1], познакомимся с основными принципами и встроенными функциями Mathematica для осуществления символьных вычислений и численных расчётов.
Е. М. Воробьёв [1, с. 34] предлагает, не углубляясь в теорию, начать рассмотрение функций преобразования многочленов с простейших примеров. Так же поступим и мы. Присвоим некоторому символу b1 некоторое выражение, например, $$b1=(x+y)2+(x-y)(x+y)$$. Как мы видим в примере Out[1] на рис. 5.1, Mathematica самостоятельно вовсе не старается ни раскрыть скобки в этом выражении, ни упростить его. Для того чтобы раскрыть произведения и положительные степени сумм в выражении expr, используется функция Expand[expr] — пример In[2]. Функция также может задаваться в виде Expand[expr,pattern], где второй аргумент pattern задаёт шаблон для элементов выражения expr, которые следует раскрыть при вычислении, при этом все остальные элементы оказываются нераскрытыми. Так в примере In[3] мы раскрываем только выражения, содержащие $$(x+y)$$, в примере In[4] — содержащие $$(x-y)$$.
Подробней о функции Expand см. книгу Е. М. Воробьёва [1, с. 34–35].
(рис 5.1) Раскрытие скобок в выражении
Для упрощения выражений применяется функция Factor[expr], которая раскладывает многочлен expr на множители. Обе функции, и Expand[expr], и Factor[expr], имеют опции – дополнительные аргументы, которые указывать необязательно. Одна их таких опций — Trig. Если активировать её, задав Trig->True, то при раскрытии произведения или упрощении выражения тригонометрические функции будут рассматриваться как функции экспонент. Примеры In[2] и In[3] упрощения выражений при помощи функции Factor см. на рис. 5.2.
Для упрощения выражений также используется функция FactorList[expr], однако вывод результата вычисления имеет достаточно специфический вид. Вычисленное выражение представляет собой вложенный список, элементами которого являются внутренние списки, состоящие из двух элементов. Первым элементом внутреннего списка является множитель полинома expr, а вторым — показатель степени этого множителя, с которым он входит в разложение полинома. Самый первый элемент вложенного списка есть общий числовой множитель: если он равен единице, то список начинается с {1,1}. Пример использования FactorList[expr] — In[4] на рис. 5.2.
(рис 5.2) Упрощение выражений
Функция FactorTerms[expr,x] выносит общий числовой множитель, который не зависит от х. Более полная форма функции FactorTerms[expr,{x1,x2,...}] последовательно выделяет множители, которые не зависят от каждого из x1,x2,.... Выражение FactorTermsList[expr,{x1,x2,...}] возвращает список множителей выражения expr. Первый элемент в списке — общий числовой множитель, второй — множитель, который не зависит ни от одного из заданных x1,x2,.... Следующие элементы — множители, которые не зависят от как можно большего числа x1,x2,.... Примеры вынесения множителей выражения см. на рис. 5.3.
Подробней о функциях упрощения выражений см. книгу Е. М. Воробьёва [1, с. 35].
(рис 5.3) Вынесение множителей выражения
Mathematica позволяет определять коэффициенты при некотором выражении expr, содержащемся многочлене pol при помощи функции Coefficient[pol,expr], а функция CoefficientList[pol,expr] возвращает список коэффициентов при степенях expr в полиноме pol: первым элементом списка будет коэффициент при нулевой степени выражения expr, а последним — при наибольшей степени expr в полиноме pol. Примеры In[1] – In[3] на рис. 5.4 демонстрируют возможность определения коэффициентов при выражениях в полиноме.
Если в полиноме отсутствует выражение, содержащее expr в какой-то степени, то соответствующий элемент списка коэффициентов принимает значении 0 (пример In[4] на рис. 5.4). Таким образом, выражение CoefficientList[pol,expr] генерирует список, содержащий количество элементов на 1 большее, чем максимальная степень выражения expr в pol.
Подробней о функциях Coefficient и CoefficientList см. книгу Е. М. Воробьёва [1, с. 36].
(рис 5.4) Определение коэффициентов при конкретных выражениях в полиноме
Ещё одна полезная функция преобразовании выражений — Collect[pol,expr], которая собирает члены с одной и той же степенью expr в многочлене pol. Заданная в расширенной форме Collect[pol,{expr1,expr2,...}] функция группирует члены с одинаковыми степенями expr1,expr2,.... Примеры использования функции Collect — In[1] – In[3] на рис. 5.5.
Подробней о функции Collect см. книгу Е. М. Воробьёва [1, с. 36–37].
При работе с полиномами полезной может оказаться функция Length, уже знакомая нам по лекции, посвящённой работе со списками. В общем случае результат применения функции Length к некоторому выражению expr зависит от внутренней формы этого выражения, точнее от того, какой заголовок указан на верхнем уровне полной формы этого выражения. Если выражение expr является многочленом (In[4] на рис. 5.5), то искомый заголовок — Plus (In[5]), и, соответственно, результатом выполнения функции Length[expr] будет количество слагаемых в многочлене expr (In[6]). Если выражение expr представляет собой, например, произведение нескольких многочленов (In[7]), то искомый заголовок — Times (In[8]). В этом случае функция Length[expr] вернёт количество множителей выражения expr (In[9]).
(рис 5.5) Группировка членов при разных степенях одного выражения
Если требуется выяснить, является ли выражение expr многочленом для некоторой переменной var, то следует воспользоваться выражением PolynomialQ[expr,var], возвращающим True, если expr — действительно полином по переменной var, и False в противном случае. Для нескольких переменных следует задавать функцию в виде PolynomialQ[expr,{var1,var2,..}]. Упрощённая форма PolynomialQ[expr] проверяет, является ли вообще expr полиномом относительно каких-либо переменных. Однако функция может вернуть False, например, в случае, когда expr содержит числа типа Real. Примеры In[1] – In[5] проверки выражения, является ли он полиномом относительно той или иной переменной, см. на рис. 5.6.
Функция Variables[expr] возвращает список всех переменных в выражении expr — пример In[6] на рис. 5.6. Как мы видим, встроенные функции Mathematica, задающие математические функции, также могут выступать в роли переменных (в нашем примере это выражение Cos[x]).
Подробней о функциях выяснения структуры полиномов см. книгу Е. М. Воробьёва [1, с. 37].
(рис 5.6) Использование функций PolinomialQ и Variables в отношении полиномов
При работе с полиномами может возникнуть необходимость в нахождении наибольшего общего делителя и наименьшего общего кратного. Для полиномов expr1 и expr2 НОД находится с помощью функции PolynomialGCD[expr1,expr2], при этом все символьные параметры рассматриваются как переменные, и деление на них невозможно. Функция PolynomialLCM[expr1,expr2] возвращает НОК полиномов expr1 и expr2. См. соответствующие примеры In[3] и In[4] на рис. 5.7.
(рис 5.7) Нахождение наименьшего общего кратного и наибольшего общего делителя полиномов
Е. М. Воробьёв [1, с. 40] определяет рациональные выражения следующим образом: "Дробь, числитель и знаменатель которой — полиномы, называется рациональным выражением". Функции Factor и Expand, с которыми мы познакомились выше, также можно применять и к рациональным выражениям. Функция Expand[rexpr] раскрывает числитель и представляет рациональное выражение rexpr в виде суммы дробей, знаменателями которых выступает знаменатель исходного выражения, а числители являются слагаемыми раскрытого числителя — пример In[2] на рис. 5.8. Функция Factor[rexpr] раскладывает на множители и числитель, и знаменатель. Если выражение rexpr является суммой рациональных выражений, то функция Factor[rexpr] приводит все выражения суммы к общему знаменателю и также раскладывает на множители и числитель, и знаменатель — пример In[3] на рис. 5.8.
Ещё одна функция, которая специфическим образом работает с суммой рациональных выражений — Together[rexpr]: она приводит выражения суммы к общему знаменателю и сокращает общие множители — пример In[4] на рис. 5.8.
Новая для нас функция Apart[rexpr] раскладывает рациональное выражение rexpr на сумму простых дробей — пример In[5] на рис. 5.8.
(рис 5.8) Простейшие преобразования рациональных выражений
Зачастую может возникнуть необходимость провести преобразования только числителя или только знаменателя дроби. Выделить числитель и знаменатель рационального выражения rexpr позволяют функции Numerator[rexpr] и Denomenator[rexpr], соответственно — примеры In[2] и In[3] на рис. 5.9.
Mathematica позволяет, не извлекая числителя и знаменателя из рационального выражения rexpr, производить их раскрытие: для этого используются функции ExpandNumerator[rexpr] и ExpandDenominator[rexpr], соответственно — примеры In[4] и In[5] на рис. 5.9.
Упрощение выражений (и рациональных в том числе) осуществляется функцией Simplify. Результатом применения этой функции к выражению expr является простейшая с точки зрения Mathematica форма этого выражения — пример In[6] на рис. 5.9.
Подробней о функциях преобразования рациональных выражений см. книгу Е. М. Воробьёва [1, с. 40–42].
(рис 5.9) Работа с числителем и знаменателем рационального выражения
В предыдущих лекциях мы уже познакомились с некоторыми встроенными функциями, которые задают тригонометрические математические функции: это функции нахождения синуса Sin и косинуса Cos. Другие тригонометрические функции в Mathematica: тангенс Tan и котангенс Cot, секанс Sec и косеканс Csc. Обратные тригонометрические функции: арксинус ArcSin и арккосинус ArcCos, арктангенс ArcTan и арккотангенс ArcCot, арксеканс ArcSec и арккосеканс ArcCsc.
Гиперболические функции задаются в Mathematica следующим образом: гиперболические синус Sinh и косинус Cosh, тангенс Tanh и котангенс Coth, секанс Sech и косеканс Csch. Обратные гиперболические функции: гиперболические арксинус ArcSinh и арккосинус ArcCosh, арктангенс ArcTanh и арккотангенс ArcCoth, арксеканс ArcSech и арккосеканс ArcCsch.
По умолчанию в Mathematica углы задаются в радианах. Однако если пользователь хочет оперировать углами, заданными в градусах, программа даёт такую возможность. Чтобы аргумент тригонометрической функции воспринимался как заданный в градусах, к нему справа следует дописать выражение Degree. В In[1] рис. 5.10 аргументы первых двух функций мы задали в радианах, а двух последних — в градусах.
Для преобразования выражений, содержащих тригонометрические и гиперболические функции, в Mathematica имеется целый набор встроенных функций (А. Н. Прокопеня и А. В. Чичурин [5, с. 27–28].
Функция TrigExpand[texpr] избавляет выражение texpr от кратных углов, заменяя тригонометрические и гиперболические функции от них степенями и произведениями функций, а также раскрывает скобки.
Противоположное действие осуществляет функция TrigReduce[expr]: она заменяет произведения и степени тригонометрических и гиперболических функций в expr функциями кратных углов.
Функция TrigFactor[expr] преобразует выражение expr, используя соотношения между тригонометрическими (гиперболическими) функциями.
TrigToExp[expr] записывает тригонометрические и гиперболические функции через экспоненты, а функция ExpToTrig[expr] совершает обратное действие — записывает экспоненту от комплексного аргумента в expr через тригонометрические или гиперболические функции.
Примеры использования функций преобразования выражений, содержащих тригонометрические и гиперболические функции, см. на рис. 5.10.
(рис 5.10) Преобразование выражений, содержащих тригонометрические и гиперболические функции
Подстановки как с ключевой элемент одного из стилей программирования мы рассмотрим в одной из следующих лекций. Здесь мы познакомимся с самим понятием подстановок и применением их для целей преобразования выражений.
Е. М. Воробьёв [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].
(рис 5.11) Одиночная подстановка выражения
Порой требуется осуществить подстановку многократно. Например, в нашем выражении $$d=3(x-y)+(x+y)2$$ требуется заменить $$x$$ на $$a$$, а $$y$$ на $$ax$$, то есть, в конечном итоге требуется заменить $$y$$ на $$a2$$. При однократном осуществления подстановки в нашем примере в результате снова получается выражение, в котором символ $$y$$ больше не присутствует, однако по-прежнему входит символ $$x$$ — пример In[2] на рис. 5.12. Для достижения требуемого результата, то есть избавления от символа $$x$$ в конечном выражении $$d$$ имеется два способа. Первый — повторно воспользоваться функцией ReplaceAll — пример In[3]. Второй более изящный способ — воспользоваться функцией, автоматически осуществляющей подстановку два раза — ReplaceRepeated[mainexpr,{rule1,rule2,...}] (постфиксная форма //.mainexpr,{rule1,rule2,...}) — пример In[4].
Подробней о функции ReplaceRepeated см. книгу Е. М. Воробьёва [1, с. 40].
(рис 5.12) Двойная подстановка выражений
Е. М. Воробьёв [1, с. 40] акцентирует внимание на ещё одной функции, которая может оказаться полезной: "После подстановки могут возникнуть выражения вида (xk)п, которые можно привести к виду xkn с помощью функции PowerExpand. Эта функция преобразует $$(x k)^n$$ в $$x^n k^n$$, какого бы вида ни было $$n$$. Преобразования, сделанные с помощью функции PowerExpand корректны в общем случае, только если $$n$$ есть целое, а $$x$$ и $$k$$ положительные".
При проведении математических и технических расчетов именно операции математического анализа используются чаще всего. Одна из основных операций математического анализа — дифференцирование. 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 рассматривает это выражение как константу по переменным дифференцирования. Поэтому при вычислении производной некоторой функции $$f(x)$$ необходимо обязательно в явном виде указывать её аргумент — см. соответствующие примеры In[7] и In[8] на рис. 5.13. Если в функции двух аргументов $$g(x,y)$$ один аргумент зависит от другого, например, $$x(y)$$, то эту зависимость также следует явно указывать — см. пример In[9].
(рис 5.13) Нахождение частных производных
В 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].
(рис 5.14) Нахождение полных производных
Другая важнейшая операция математического анализа — нахождение первообразной. Первообразная функции 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].
(рис 5.15) Нахождение интегралов
Произвольная функция f[var] может быть разложена в степенной ряд в окрестности точки var0 до члена порядка (var-var0)^n при помощи функции Series[f[var],{var,var0,n}]. Слагаемое O[var-var0]^(n+1) в полученном выражении указывает на то, что следующий член ряда будет иметь порядок (n+1). См. соответствующий пример In[1] На рис. 5.16.
Помимо возможности создавать ряды Тейлора функция Series позволяет генерировать ряды, содержащие рациональные и отрицательные степени (пример In[2] на рис. 5.16), а также раскладывать функции в окрестностях бесконечно удалённой точки (пример In[3], аналогичный примеру из книги А.Н. Прокопени и А.В. Чичурина [5, с. 37]).
Иногда Mathematica не может представить ту или иную функцию в виде степенного ряда в окрестностях некоторой точки. Причин тому может быть масса: одна из них, например, сингулярность в этой точке (А. Н. Прокопеня и А. В. Чичурин [5, с. 37]). В этом случае вычисления не производятся, выдаётся предупреждающее сообщение, а в качестве результата возвращается введённое выражение — пример In[4] на рис. 5.16.
Одна из функций, которую нельзя представить в виде ряда — логарифмическая функция. Однако при попытке разложить содержащие её выражения возле нуля или бесконечно удалённой точки ошибки Mathematica не выдаёт: выражение исправно раскладывается в ряд, при этом в окончательном результате логарифм сохраняется в исходном виде (А. Н. Прокопеня и А. В. Чичурин [5, с. 37–38]) — пример In[5] на рис. 5.16.
Разложение в ряд есть некоторая аппроксимация функций, и слагаемое вида O[var-var0]^n является атрибутом этой аппроксимации, поэтому добавление выражения вида O[var]^n к сумме произвольных функций преобразует всю сумму в степенной ряд (А. Н. Прокопеня и А. В. Чичурин [5, с. 38]). Количество слагаемых в сумме не имеет значения: оно может быть и очень большим, и равным нулю. Пример In[6] на рис. 5.16 демонстрирует преобразование некоторого выражения в степенной ряд прибавлением к нему O[x]^6.
Обратную операцию, преобразование степенного ряда ser в обычную сумму, можно при помощи функции Normal[ser], которая отбрасывает остаточный член O[var-var0]^n и конвертирует ряд в многочлен — пример In[7] на рис. 5.16.
Узнать, является ли выражение степенным рядом, можно при помощи хорошо известной нам функции Head. Если выражение expr является степенным рядом, то Head[expr] возвращает SeriesData. В примере In[8] на рис. 5.16 мы применяем Head к полученным в Out[6] и Out[7] выражениям и убеждаемся в том, что первое из них является степенным рядом, а второе — нет.
Mathematica позволяет разлагать выражение в степенной ряд по нескольким переменным. Для этого используется та же функция Series, заданная в виде функции Series[f[var],{var1,var10,nvar1},{var2,var20,nvar2},...]. Эта операция эквивалентна последовательному разложению функции f[var1,var2,...] по переменным var1,var2,... в том порядке, в котором они указаны в функции Series — пример In[9] на рис. 5.16.
(рис 5.16) Разложение функции в степенной ряд
Поскольку степенные ряды содержат обыкновенные математические выражения, с ними можно проделывать обычные математические операции: складывать, перемножать, дифференцировать, интегрировать, возводить в степень и т.д., при этом, в результате образуются новые степенные ряды (Е. М. Воробьёв [1, с. 54] и А. Н. Прокопеня и А. В. Чичурин [5, с. 38] — примеры In[1] и In[2] на рис. 5.17.
Результатом выполнения функции Series является выражение Mathematica, во внутренней форме имеющее заголовок SeriesData. Е. М. Воробьёв [1, с. 55] описывает это выражение следующим образом: "Вычисленное выражение SeriesData[x,x0, {a0,a1,...},nmin,nmax,den] представляет отрезок степенного ряда по переменной x в окрестности точки x0. Величины a0,a1,... есть коэффициенты ряда. Разность x-x0 входит в ряд в степенях nmin/den, (nmin+1)/den,..., nmax/den". При помощи этой функции можно задавать ряд с заданными коэффициентами и степенями выражений при коэффициентах (пример In[3] на рис. 5.17), при этом неопределённые символьные коэффициенты можно задавать при помощи уже известных нам функций Table и Array (пример In[4]).
Подробней о разложении функций в степенной ряд см. книги Е. М. Воробьёва [1, с. 53–55] и А. Н. Прокопени и А. В. Чичурина [5, с. 36–40].
(рис 5.17) Преобразования рядов и непосредственное задание рядов во внутренней форме
В предыдущем пункте мы познакомились с функциями интегрирования, используемыми при описании непрерывных систем. Для дискретных систем используется функция суммирования.
Сумма в символьной форме вычисляется в Mathematica при помощи функции Sum[expr,int]; количество слагаемых в сумме может быть как конечным, так и бесконечным. Вообще второй аргумент int, задающий интервал изменения переменной, по которой производится суммирование, может быть задан в нескольких формах (А. Н. Прокопеня и А. В. Чичурин [5, с. 41]):
{i,n} — i изменяется на отрезке от 1 до n с шагом 1;{i,imin,imax} — i изменяется на отрезке от imin до imax с шагом 1;{i,imin,imax,d} — i изменяется на отрезке от imin до imax с шагом d.Mathematica стремится выразить любую функцию в виде степенного ряда.
На рис. 5.18 представлены примеры In[1], In[2] и In[3] вычисления суммы при помощи указанных выше выражений.
Если найти результат суммирования в символьной форме не удаётся, Mathematica возвращает сумму невычисленной — In[4] на рис. 5.18.
Mathematica также позволяет вычислить сумму по нескольким индексам i,j,..., для чего необходимо задать функцию в виде Sum[f,{i,imin,imax},{j,jmin,jmax},...] (пример In[5] на рис. 5.18). В заданном формате предполагается, что сумма по i является внешней, поэтому пределы изменения могут зависеть от i, и т.д.
Mathematica также позволяет вычислять произведение выражений в символьном виде, для чего используется функция Product[expr,int], причём правила задания интервала варьирования переменной такие же, как и для такового при суммировании (пример In[6] на рис. 5.18).
По аналогии с интегрированием суммирование и нахождение произведения также могут быть осуществлены численно: при этом результат вычисления будет приближённым (вещественным). Предназначенные для этого функции — NSum и NProduct — примеры In[7] на рис. 5.18.
Подробней о функциях нахождения сумм и произведений см. книгу А. Н. Прокопени и А. В. Чичурина [5, с. 41–43].
(рис 5.18) Вычисление сумм и произведений
Вычислить предел некоторой функции f[var] при стремлении var к заданному значению var0 позволяет функция Limit[f[var],var->var0]. Предел вычисляется только для функций, заданных в явном виде, в противном случае в ячейке Out возвращается исходное выражение — примеры In[1] и In[2] на рис. 5.19.
Предел ряда функций при стремлении var->var0 зависит от направления, вдоль которого осуществляется приближение var к var0. Требуемое направление задаётся опцией Direction->s, где при вычислении предела сверху вместо s следует писать -1, а снизу — 1. Для значения Automatic, используемого по умолчанию, вычисляется предел сверху, кроме случая var->Infinity (примеры In[3] и In[4] на рис. 5.19) [5, с. 40].
При стремлении var к некоторому var0 предельное значение функции f[var] не всегда существует. А.Н. Прокопеня и А.В. Чичурин [5, с. 41] приводят следующий пример: "Функция $$cos(1/x)$$, например, является быстро осциллирующей при $$x->0$$. Поэтому результатом вычисления соответствующего предела является Interval-объект, который только указывает интервал, в пределах которого может находиться вычисляемый предел". Иллюстрирующий это замечание пример In[5] на рис. 5.19 также аналогичен примеру в книге А. Н. Прокопени и А. В. Чичурина [5, с. 41].
Mathematica позволяет представлять на экране выражение для нахождения предела в традиционном для математики виде. Для этого служит функция TraditionalForm. В примере In[6] на рис. 5.19 мы в традиционной форме представили предел, записанный в In[2].
Подробней о функции нахождения предела см. книгу А. Н. Прокопени и А. В. Чичурина [5, с. 40–41].
(рис 5.19) Вычисление пределов
Подстановки — это алгебраические преобразования, в результате выполнения которых какая-либо часть алгебраического выражения заменяется новым выражением.
Рациональным выражением называется дробь, числитель и знаменатель которой — полиномы.
В данной лекции мы научились осуществлять преобразования выражений, в том числе рациональных и тригонометрических. В частности мы познакомились с функциями, предназначенными для раскрытия произведений и положительных степеней сумм, упрощения выражений. Мы научились компьютерными методами распознавать среди выражений полиномы, собирать члены полиномов при нужных степенях, находить наименьшее общее кратное и наибольший общий делитель полиномов. Мы познакомились с одним из наиболее эффективных инструментов осуществления преобразований выражений — подстановками. Мы познакомились со встроенными функциями Mathematica, позволяющими осуществлять операции математического анализа, в том числе находить производные, первообразные, суммы и произведения, раскладывать функции в ряд и находить пределы.
Expand? Factor? FactorTerms? Collect? Simplify?Factor от FactorList? FactorTerms от FactorTermsList?Trig функций Factor и Expand?Expand, Factor, Together, Apart, на рациональные выражения?$$8x^3(2x+y-y^2)^3$$
$$-8x^3(-8x^3-12x^2y-6xy^2+12x^2y^2-y^3+12xy^3+3y^4-6xy^4-3y^5+y^6)$$
$$8(8x^6+12x^5y+6x^4y^2-12x^5y^2+x^3y^3-12x^4y^3-3x^3y^4+6x^4y^4+3x^3y^5-x^3y^6)$$
$$64x^6+x^5(96y-96y^2)+x^4(48y^2-96y^3+48y^4)+x^3(8y^3-24y^4+24y^5-8y^6)$$
При помощи функции Length определите количество элементов в каждом полученном выражении. Какой заголовок находится на верхнем уровне полной формы каждого из полученных выражений?
Для решения сначала вычислите дискриминант по формуле $$D=b^2-4ac$$, затем найдите корни уравнения по формулам $$x_1=(-b+D^{1/2})/(2a)$$ и $$x_1=(-b-D^{1/2})/(2a)$$. Корни уравнения могут быть комплексными.
Решите двумя способами.
Первый способ — аналогично предыдущему пункту.
Второй способ: при помощи функций Mathematica преобразования многочленов разложите выражение в левой части уравнения на множители.
Для решения при помощи функций Mathematica преобразования многочленов разложите выражение в левой части уравнения на множители.
Для решения при помощи локальной подстановки замените $$x^2$$ символом $$y$$, затем известным способом решите квадратное уравнение относительно $$y$$.
Для решения перенесите дифференциал $$dt$$ в правую часть, средствами Mathematica проинтегрируйте обе части по соответствующим переменным.
Для решения сначала найдите корни характеристического уравнения, полученного заменой выражения $$d^2y/dx^2$$ символом $$k^2$$, а выражения $$dy/dx$$ символом $$k$$. Полученные корни подставьте в общее решение уравнения $$y=C_1exp(k_1x)+C_2exp(k_2x)$$.
$$(x^2-4)/(x-2)$$ при $$x->2$$
$$1/(x-5)-10/(x^2-25)$$ при $$x->5$$
$$sin(x)/x$$ при $$x->0$$
$$((x+2y)/x)^x$$ при x->\infty
$$(1+1/x)^{2x+1}$$ при x->\infty
$$tg(x)/x$$ при $$x->0$$
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.