Предназначенный упрощают в Mathematica

Я генерирую очень долго и сложные аналитические выражения общей формы:

(...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 к определенному уровню (уровням)?

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

6
задан Timo 18 November 2009 в 20:51
поделиться

3 ответа

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

4
ответ дан 17 December 2019 в 00:10
поделиться

Вам следует попробовать карту .
В общем, 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 , если вам так удобнее.

1
ответ дан 17 December 2019 в 00:10
поделиться

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

2
ответ дан 17 December 2019 в 00:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: