Я генерирую очень долго и сложные аналитические выражения общей формы:
(...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
к определенному уровню (уровням)?
Я понимаю, что этот вид ограничения не может привести к оптимальным результатам, но идея здесь получает что-то, что "достаточно хорошо".
Есть несколько способов сделать это, но это может быть немного сложно и зависит от структуры вашего фактического выражения. Однако обычно произведение нескольких терминов в скобках будет иметь заголовок Times
, и вы можете использовать FullForm
, чтобы проверить это:
In[1]:= FullForm[(a+b)(c+d)]
Out[1]= Times[Plus[a, b], Plus[c, d]]
Вы можете использовать функцию высшего порядка Карта
с выражениями с заголовком Times
так же, как вы используете его с выражениями с заголовком List
, и это может позволить вам упростить
выражение по одному члену за раз, например:
Map[Simplify, yourGinormousExpression]
Вы можете использовать Развернуть
в результате, если вам нужно впоследствии расширить скобки.
ИЗМЕНИТЬ, чтобы добавить: Если вы хотите укажите формы, которые вы хотите упростить, вы можете использовать Replace
или ReplaceAll
вместо одного из родственников Map
. Замена
особенно полезна, поскольку требует спецификации уровня , что позволяет вам влиять только на факторы в самом верхнем продукте. В качестве простого примера рассмотрим следующее:
In[1]:= expr = Sqrt[(a + 1)/a] Sqrt[(b + 1)/b];
In[2]:= Simplify[expr]
Out[2]= Sqrt[1 + 1/a] Sqrt[1 + 1/b]
Если вы не хотите упрощать факторы, которые зависят от a
. вместо этого вы можете сделать это:
In[3]:= Replace[expr, form_ /; FreeQ[form, a] :> Simplify[form], {1}]
Out[3]= Sqrt[(1 + a)/a] Sqrt[1 + 1/b]
Только второй член, который зависит от b
, был изменен. Однако следует иметь в виду, что некоторые преобразования выполняются автоматически Times
или Plus
; например, a + a
будет преобразован в 2 a
даже без использования Simplify
.
Замена
особенно полезна, поскольку требует спецификации уровня , что позволяет вам влиять только на факторы в самом верхнем продукте. В качестве простого примера рассмотрим следующее:
In[1]:= expr = Sqrt[(a + 1)/a] Sqrt[(b + 1)/b];
In[2]:= Simplify[expr]
Out[2]= Sqrt[1 + 1/a] Sqrt[1 + 1/b]
Если вы не хотите упрощать факторы, которые зависят от a
. вместо этого вы можете сделать это:
In[3]:= Replace[expr, form_ /; FreeQ[form, a] :> Simplify[form], {1}]
Out[3]= Sqrt[(1 + a)/a] Sqrt[1 + 1/b]
Только второй член, который зависит от b
, был изменен. Однако следует иметь в виду, что некоторые преобразования выполняются автоматически Times
или Plus
; например, a + a
будет преобразовано в 2 a
даже без использования Simplify
.
Замена
особенно полезна, поскольку требует спецификации уровня , что позволяет вам влиять только на факторы в самом верхнем продукте. В качестве простого примера рассмотрим следующее:
In[1]:= expr = Sqrt[(a + 1)/a] Sqrt[(b + 1)/b];
In[2]:= Simplify[expr]
Out[2]= Sqrt[1 + 1/a] Sqrt[1 + 1/b]
Если вы не хотите упрощать факторы, которые зависят от a
. вместо этого вы можете сделать это:
In[3]:= Replace[expr, form_ /; FreeQ[form, a] :> Simplify[form], {1}]
Out[3]= Sqrt[(1 + a)/a] Sqrt[1 + 1/b]
Только второй член, который зависит от b
, был изменен. Однако следует иметь в виду, что некоторые преобразования выполняются автоматически Times
или Plus
; например, a + a
будет преобразован в 2 a
даже без использования Simplify
.
In[1]:= expr = Sqrt[(a + 1)/a] Sqrt[(b + 1)/b];
In[2]:= Simplify[expr]
Out[2]= Sqrt[1 + 1/a] Sqrt[1 + 1/b]
Если вы не хотите упрощать факторы, которые зависят от a
. вместо этого вы можете сделать это:
In[3]:= Replace[expr, form_ /; FreeQ[form, a] :> Simplify[form], {1}]
Out[3]= Sqrt[(1 + a)/a] Sqrt[1 + 1/b]
Только второй член, который зависит от b
, был изменен. Однако следует иметь в виду, что некоторые преобразования выполняются автоматически Times
или Plus
; например, a + a
будет преобразовано в 2 a
даже без использования Simplify
.
In[1]:= expr = Sqrt[(a + 1)/a] Sqrt[(b + 1)/b];
In[2]:= Simplify[expr]
Out[2]= Sqrt[1 + 1/a] Sqrt[1 + 1/b]
Если вы не хотите упрощать факторы, которые зависят от a
. вместо этого вы можете сделать это:
In[3]:= Replace[expr, form_ /; FreeQ[form, a] :> Simplify[form], {1}]
Out[3]= Sqrt[(1 + a)/a] Sqrt[1 + 1/b]
Только второй член, который зависит от b
, был изменен. Однако следует иметь в виду, что некоторые преобразования выполняются автоматически Times
или Plus
; например, a + a
будет преобразован в 2 a
даже без использования Simplify
.
Times
или Plus
; например, a + a
будет преобразован в 2 a
даже без использования Simplify
. Однако следует иметь в виду, что некоторые преобразования выполняются автоматически Times
или Plus
; например, a + a
будет преобразован в 2 a
даже без использования Simplify
. Вам следует попробовать карту
.
В общем, Map [foo, G [a, b, c, ...]]
дает G [foo [a], foo [b], foo [c], ... ]
для любой головы G
и любого выражения foo
, поэтому для
Map[Simplify, a b c d e]
это дает
Simplify[a] Simplify[b] Simplify[c] Simplify[d] Simplify[e]
Обратите внимание, вы можете обозначить Map [foo, expr]
als foo / @ expr
, если вам так удобнее.
Я прошу не согласиться с моими коллегами, используя Карта
для применения Simplify
к каждому подвыражению не может экономить время, поскольку она все равно будет применяться к каждому из них. Вместо этого попробуйте MapAt
следующим образом:
In[1]:= MapAt[f, SomeHead[a,b,c,d], {4}]
Out[1]:= SomeHead[a, b, c, f[d]]
Сложная часть - это определение спецификации положения. Хотя, если выражение, которое вы хотите упростить, находится на первом уровне, это не должно быть сложнее того, что я написал выше.
Теперь, если вы все еще хотите все упростить, но хотите сохранить некоторую структуру, попробуйте использовать опцию ExcludedForms
. В прошлом я использовал, чтобы предотвратить это упрощение:
In[2]:= Simplify[d Exp[I (a + b)] Cos[c/2]]
Out[2]:= Exp[I(a + b + c)](d + d Exp[c])
, что, кажется, нравится Mathematica, поэтому я делаю
In[3]:= Simplify[d Exp[I (a + b)] Cos[c/2], ExcludedForms -> {_Cos,_Sin}]
Out[3]:= d Exp[I (a + b)] Cos[c/2]
Кроме того, не забывайте, что второй параметр для Simplify
предназначен для предположений и может значительно облегчить ваши усилия по приведению ваших выражений в полезную форму.