Я генерирую очень длинные и сложные аналитические выражения общего вида:
(...something not so complex...)(...ditto...)(...ditto...)...lots...
Когда я пытаюсь использовать Simplify
, Mathematica останавливается, я полагаю, из-за того, что он пытается расширить скобки или упростить их в разных скобках. Скобки, хотя и содержат длинные выражения, легко упрощаются Mathematica самостоятельно. Можно ли как-то ограничить область действия Simplify
одной скобкой за раз?
Редактировать: Некоторая дополнительная информация и прогресс.
Поэтому, пользуясь советом от вас, ребята, я теперь начал использовать что-то в духе
In[1]:= trouble = Log[(x + I y) (x - I y) + Sqrt[(a + I b) (a - I b)]];
In[2]:= Replace[trouble, form_ /; (Head[form] == Times) :> Simplify[form],{3}]
Out[2]= Log[Sqrt[a^2 + b^2] + (x - I y) (x + I y)]
Изменение Times
на соответствующую головку, такую как Plus
или Power
, позволяет достаточно точно нацелиться на упрощение. Проблема / вопрос, который остается, тем не менее, заключается в следующем: Simplify
все равно будет опускаться глубже, чем уровень, указанный в Replace
, например,
In[3]:= Replace[trouble, form_ /; (Head[form] == Plus) :> Simplify[form], {1}]
Out[3]= Log[Sqrt[a^2 + b^2] + x^2 + y^2]
также упрощает квадратный корень.
Мой план состоял в том, чтобы итеративно использовать Replace
снизу вверх на один уровень за раз, но это, очевидно, приведет к огромному количеству повторных работ к Simplify
и в конечном итоге это приводит к тому же тупому падению Mathematica, которое я испытал в самом начале. Есть ли способ ограничить Simplify
определенным уровнем (уровнями)?
Я понимаю, что такого рода ограничения могут не дать оптимальных результатов, но идея в том, чтобы получить что-то "достаточно хорошее".