7

一般的な形式の非常に長く複雑な分析式を生成します。

(...something not so complex...)(...ditto...)(...ditto...)...lots...

私が使用しようとするSimplifyと、Mathematicaは停止しますが、角かっこを拡張したり、異なる角かっこ間で単純化したりしようとしているためだと思います。角かっこは長い式を含んでいますが、Mathematicaだけで簡単に簡略化できます。スコープをSimplify一度に1つのブラケットに制限する方法はありますか?

編集:いくつかの追加情報と進捗状況。

だから皆さんからのアドバイスを使って、私は今、

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のような適切なヘッドに変更すると、単純化を非常に正確にターゲットにすることができます。ただし、残っている問題/質問は次のとおりです。たとえば、に指定されたレベルよりも深く下降します。PlusPowerSimplifyReplace

In[3]:= Replace[trouble, form_ /; (Head[form] == Plus) :> Simplify[form], {1}]

Out[3]= Log[Sqrt[a^2 + b^2] + x^2 + y^2]

平方根も単純化します。

私の計画は、一度に1レベルずつ下から上に繰り返し使用することでしたが、これは明らかに、最初に経験したMathematicaのまったく同じ停止をもたらし、Replace大量の繰り返し作業をもたらすことになります。特定のレベルSimplifyに制限する方法はありますか?Simplify

この種の制限では最適な結果が得られない可能性があることは理解していますが、ここでの考え方は「十分に良い」ものを取得することです。

4

3 に答える 3

5

これを行う方法はいくつかありますが、実際の式の構造によっては、少し扱いに​​くい場合があります。ただし、通常、括弧内の項の数の積には head があり、これを確認するためにTimes使用できます。FullForm

In[1]:= FullForm[(a+b)(c+d)]
Out[1]= Times[Plus[a, b], Plus[c, d]]

高階関数Mapを head 付きの式でTimes使用するのと同じ方法で、 head 付きの式で使用できます。これにより、次のように一度に 1 項ずつ式Listを使用できる場合があります。Simplify

Map[Simplify, yourGinormousExpression]

Expand後でブラケットを展開する必要がある場合は、結果に対して使用できます。

追加する編集:単純化したいフォームを指定したい場合は、 の親戚の代わりにReplaceorを使用できます。は、レベル指定が必要なため、最上位の製品の要因のみに影響を与えることができるため、特に便利です。簡単な例として、次のことを考慮してください。ReplaceAllMapReplace

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]

に依存する第 2 項のみbが変更されています。Timesただし、いくつかの変換はorによって自動的に行われることに注意してくださいPlus。たとえば、を使用しなくてもa + aに変わります。2 aSimplify

于 2009-11-17T16:02:31.187 に答える
2

Mapを使用して各部分式に適用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]

また、 の 2 番目のパラメーターは仮定用であることを忘れないでください。これSimplifyにより、式を有用な形式に変換する際の苦労が大幅に軽減されます。

于 2009-11-17T19:01:14.633 に答える
1

試してみてくださいMap
一般に、任意の headと任意の式Map[foo, G[a, b, c, ...]]が得られるため、G[foo[a], foo[b], foo[c], ...]Gfoo

  Map[Simplify, a b c d e]

それは与えます

  Simplify[a] Simplify[b] Simplify[c] Simplify[d] Simplify[e]

より便利な場合は、 Map[foo, expr]alsを指定できることに注意してください。foo /@ expr

于 2009-11-17T16:01:23.623 に答える