Трудная часть для рассматриваемого случая - это правило для 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, но для такого рода проблем это будет основным препятствием.Я не могу оценить, насколько надежным это будет для больших и более сложных выражений.