Замена выражений в формулах
Одним из наиболее распространенных видов алгебраических преобразований является замена выражений, часто называемая также подстановкой, в результате выполнения которой какая-либо часть алгебраического выражения заменяется новым выражением. В системе Mathematica предусмотрено два способа подстановок. Первый способ выполняется с помощью функции
Set.
Вычисление выражения Set [левая часть, правая часть], или левая часть = правая часть, выполняется следующим образом. Сначала вычисляется правая часть, а затем получившийся результат (вычисленное выражение) присваивается в качестве значения невычисленной левой части. Всюду в дальнейшем левая часть, в какие бы выражения она ни входила, будет заменяться выражением, полученным в результате вычисления правой части. Левая и правая части могут быть списками, и поэтому операцию замены (подстановки)
Set можно записать в виде присваивания списков {левая часть,, левая часть2, ...} = {правая часть,, правая часть2, .. .}. В этом случае результат вычисления /-и правой части будет присвоен /-и левой части. В качестве примера присвоим символу х значение а и после этого вычислим выражение (х+1)^2.
х=а
а
(х+1)^2
(1 + а)2
Вот более сложный случай.
{х,х}={а,b}
{а,b}
х^2 b^2
Обратите внимание, что никакого предупреждения не было. Это подобно тому, как в языках программирования вполне допустим оператор х = х+1 потому, что действия выполняются не одновременно, а в определенном порядке.
А вот случай, когда значения функции задаются в определенных точках.
Evaluate[ff/@{a,b,с,d}]={1,23,45,678}; ff[b] 23
Как видите, теперь везде ff [b] заменяется своим значением. Пусть теперь b = 1. Заменится ли ff [1] своим значением? Оказывается, нет.
b=1
1
ff[l] ff[l]
Более того, теперь даже ff [b] не заменяется своим значением.
ff [b] ff1]
Это происходит потому, что аргумент функции вычисляется в данном случае раньше.
Иногда глобальную! подстановку нужно отменить. Если левая часть есть переменная, это можно сделать с помощью функции
Clear. Вызов clear [переменная], переменная2, .. .} отменяет все подстановки значений, присвоенных переменным переменная!, переменная!, ... . Для отмены подстановки значения одной переменной можно использовать присваивание вида переменная = .
b=N[Pi,50]
3.1415926535897932384626433832795028841971693993751
b=.
b
b
Присваивание вида переменная = . является синонимом выражения Unset [переменная].
b=N[Pi,50]
3.1415926535897932384626433832795028841971693993751
Unset[b]
b
b
Присваивание, или функция Set, задает глобальную подстановку, т.е. такую подстановку, которая выполняется во всех последующих вычислениях до ее явной отмены. Если же подстановку одного выражения вместо другого нужно сделать в одном конкретном выражении или же в нескольких, то удобнее использовать функцию
Rule.
Выражение Rule [левая часть, правая часть], записываемое также в виде левая часть->правая часть, задает правило, в соответствии с которым вместо левой части подставляется вычисленная правая часть. При этом правая часть вычисляется в момент
вызова функции Rule. Если правую часть нужно вычислять в момент применения правила, то нужно вызвать не функцию
Rule, а функцию RuleDelayed, вызов которой можно записать в виде левая часть
:> правая часть.
Для всех дальнейших вычислений х сохраняет свое значение.
х+у
5.8598744820488384738229308546321653819544164930751+ у
Подстановки удобно задавать в виде поименованных правил. Например, можно определить подстановку
r1= х->а, и после этого она может быть применена к конкретному выражению с помощью функции
ReplaceAll, имеющей также постфиксную форму /.:
r1 = х -> а x+1/.rl
1+а
То же самое можно сделать и так:
ReplaceAll[х + 1, r1]
1+а
Вот пример последовательных замен.
{а,b, с}/.a->b/.b->d
{d,d,c}
Функция ReplaceAll позволяет осуществить несколько подстановок одновременно. Тогда эти подстановки должны быть оформлены в виде списка и заданы вторым аргументом этой функции. Вот пример одновременной замены:
{а,b,с}/.(a->b,b->d)
{b,d,c}
Однако функция ReplaceAll выполняет замену в каждом подвыражении только
раз, рекурсивно замена не выполняется.
а
ReplaceAll [х + х2 , {х -> а, х2 -> х} ]
а+х
Если же нужно делать подстановки повторно, необходимо использовать функцию
ReplaceRepeated.
ReplaceRepeated[x + х2, {х->а, х2-» х} ]
2 а
Функция ReplaceRepeated имеет постфиксную форму // ..
х + х
2 // . {х -> а, х
2 -> х}
2 а
Пусть имеем список заменяемых и список заменяющих выражений. Тогда правила замены можно сформировать с помощью функции
Thread.
rr=Thread[{r,s,t}->{R, S,T}]
(r->R,s->S,t->T)
Теперь применим эти правила.
Выражения в системе Mathematica имеют заголовки. Например:
Их тоже можно заменить.
13 данном случае выражения с заголовками integer, Rational и Plus были заменены их логарифмами. Вот еще пример этого типа. Все выражения с заголовками f или g заменим их квадратами.
Вот еще один способ сделать то же самое.
А вот как все множители, являющиеся вызовами функций, можно возвести в квадрат:
Заметьте, . что выражение HoldPattern [expression] эквивалентно выражению
expression для сопоставления с образцом, но оставляет выражение expression в невычисленной форме.
А вот как все вызовы функций, не содержащие степеней и произведений, возводятся в куб.
Действия со степенями
Функция PowerExpand приводит (а*b) ^с к виду а^с * b^с. Преобразования, сделанные с помощью
PowerExpand, корректны, вообще говоря, только если с целое, а а и b положительные.
Кроме того, PowerExpand приводит Log[а^b] к виду b*Log [а].
PowerExpand [Log [ (ab)n] ]
n (Log[a]+Log[b])
Квадратный корень тоже рассматривается как степень.
Ну и конечно же, PowerExpand также приводит (а^b) ^с к виду а^ (bc).
Раскрытие скобок
Раскрытие скобок выполняет функция Expand. Вот пример.
Можно указать, что при раскрытии скобок нужно выполнять приведение по определенному модулю.
Наконец, можно указать, что раскрывать скобки нужно только в выражениях определенного вида. Для этого в вызове функции должен быть задан второй аргумент — шаблон, к которому применяется раскрытие скобок. Все выражения, не содержащие шаблона, останутся без изменения.
Однако функция Expand раскрывает не все скобки, а только в произведениях и степенях. Она не раскрывает скобки, например, в знаменателях. Если же нужно раскрыть все скобки, нужно применить функцию
ExpandAll.
Конечно же, для функции ExpandAll также можно указать шаблон, к которому применяется раскрытие скобок. Все выражения, не содержащие шаблона, останутся без изменения.
Приведение подобных
Вызов Collect [expr, x] собирает в выражении ехрr члены с одинаковыми степенями х. Иными словами, функция
Collect приводит подобные члены.
Collect[х+4у+5ху,х].
4 у+х (1+5 у), Collect[х+4у+5ху,у]
х+(4+5 х) у
Вызов Collect [ехрr, {x
1, х2, ...}] собирает в выражении
ехрr члены с одинаковыми степенями х{, затем — с одинаковыми степенями х2 и т.д.
Иногда после приведения подобных нужно к каждому члену применить какую-нибудь функцию. Тогда ее нужно указать третьим параметром функции
Collect: Collect [expr, {x1, х2, ...}, функция]. Вот как, например, выполняется разложение коэффициентов на множители после приведения подобных.
В функции Collect можно использовать шаблоны. В приведенном ниже примере они используются для того, чтобы собрать члены с одинаковыми степенями х и у.
Заметьте, что полученное выражение отличается от
хотя и равно ему тождественно.
Ниже показано применение шаблона для того, чтобы собрать члены, содержащее производные функции z
одинакового порядка.