Алгебра и пакет Mathematica 5

Екатеринбург ЧМ 2018


Замена выражений в формулах



Одним из наиболее распространенных видов алгебраических преобразований является замена выражений, часто называемая также подстановкой, в результате выполнения которой какая-либо часть алгебраического выражения заменяется новым выражением. В системе 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, {x1, х2, ...}] собирает в выражении ехрr члены с одинаковыми степенями х{, затем — с одинаковыми степенями х2 и т.д.

Иногда после приведения подобных нужно к каждому члену применить какую-нибудь функцию. Тогда ее нужно указать третьим параметром функции Collect: Collect [expr, {x1, х2, ...}, функция]. Вот как, например, выполняется разложение коэффициентов на множители после приведения подобных.

В функции Collect можно использовать шаблоны. В приведенном ниже примере они используются для того, чтобы собрать члены с одинаковыми степенями х и у.

Заметьте, что полученное выражение отличается от

хотя и равно ему тождественно.

Ниже показано применение шаблона для того, чтобы собрать члены, содержащее производные функции z одинакового порядка.