Как заменить неявные подвыражения в Mathematica? - PullRequest
5 голосов
/ 10 декабря 2011

У меня есть это выражение в Mathematica:

(a^2 (alpha + beta)^2)/(b^2 + c^2) + (a (alpha + beta))/(b^2 + c^2) + 1  

Как вы можете видеть, выражение имеет пару подвыражений, которые повторяются в нем.

Я хочу иметь возможность заменить a/(b^2+c^2) с d и alpha+beta с gamma.

Окончательное выражение должно быть таким:

1+d*gamma+a*d*gamma^2

У меня есть гораздо более сложные выражения, где возможность сделать этозначительно упростил мою работу.

Я пытался найти этот вопрос в Google, и я нахожу только ответы, которые используют FactorTerms и ReplaceRepeated, но не работают согласованно и для более сложных выражений, подобных этому.Я надеюсь, что у кого-то здесь есть ответ.

Ответы [ 3 ]

5 голосов
/ 10 декабря 2011

Трудная часть для рассматриваемого случая - это правило для d.Возможно, есть более простые способы сделать это, но один из них - расширить возможности продуктов, чтобы они работали.Допустим, это ваше выражение:

expr  = (a^2 (alpha + beta)^2)/(b^2 + c^2) + (a (alpha + beta))/(b^2 + c^2) + 1

и вот правила, которые наивно можно написать:

rules = {a/(b^2 + c^2) -> d, alpha + beta -> gamma}

Что мы хотели бы сделать сейчас, так это расширить полномочия на продуктыи expr и rules.Проблема в том, что даже если мы это сделаем, они автоматически оценят свои способности.Чтобы предотвратить это, нам нужно обернуть их, например, в Hold.Вот функция, которая поможет нам:

Clear[withExpandedPowers];
withExpandedPowers[expr_, f_: Hold] :=
  Module[{times},
    Apply[f,
       Hold[expr] /. x_^(n_Integer?Positive) :>
          With[{eval = times @@ Table[x, {n}]}, eval /; True] /.
       times -> Times //.
       HoldPattern[Times[left___, Times[middle__], right___]] :>
          Times[left, middle, right]]];

Например:

In[39]:= withExpandedPowers[expr]
Out[39]= Hold[1+(a (alpha+beta))/(b b+c c)+((alpha+beta) (alpha+beta) a a)/(b b+c c)]

Затем будет выполнено следующее:

In[40]:= 
ReleaseHold[
   withExpandedPowers[expr] //. 
      withExpandedPowers[Map[MapAt[HoldPattern, #, 1] &, rules], Identity]]

Out[40]= 1 + d gamma + a d gamma^2

Нам пришлосьдополнительно оберните lhs правил в HoldPattern, чтобы не допустить падения продуктов там.

Это всего лишь один случай, когда нам пришлось бороться с механизмом автоматического упрощения Mathematica, но для такого рода проблем это будет основным препятствием.Я не могу оценить, насколько надежным это будет для больших и более сложных выражений.

2 голосов
/ 10 декабря 2011

Используя ReplaceRepeated:

(a^2 (alpha + beta)^2)/(b^2 + c^2) + (a (alpha + beta))/(b^2 + c^2) + 
  1 //. {a/(b^2 + c^2) -> d, alpha + beta -> gamma}

Или используя TransformationFunctions:

FullSimplify[(a^2 (alpha + beta)^2)/(b^2 + 
     c^2) + (a (alpha + beta))/(b^2 + c^2) + 1, 
 TransformationFunctions -> {Automatic, # /. 
     a/(b^2 + c^2) -> d &, # /. alpha + beta -> gamma &}]

Оба дают:

1 + gamma (d + (a^2 gamma)/(b^2 + c^2))
0 голосов
/ 06 июня 2016

Я скромно --- Я не информатик --- думаю, что это проще, чем все другие предлагаемые решения

1+a(alpha+beta)/(b^2 + c^2) +a^2(alpha+beta)^2/(b^2 + c^2) \\.
{a^2-> a  z, a/(b^2 + c^2)-> d,alpha+\beta -> gamma,z-> a}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...