18

非常に複雑な数式があり、新しい、場合によっては無次元のパラメーターを使用して簡略化したいと思います。

私の表現の例は次のとおりです。

K=a*b*t/((t+f)c*d);

(実際の表現は非常に大きく、数千文字です)。式t/(t + f)のすべての出現箇所をpに置き換えたい

p=t/(t+f);

ここでの目標は、すべてのtとfがpに置き換えられるように置換を見つけることです。この場合、置換pは無次元化されたパラメーターであるため、適切な置換候補のように見えます。

私は数学でこれを行う方法を理解することができませんでした(または可能であれば)。私は試した:

eq1= K==a*b*t/((t+f)c*d);
eq2= p==t/(t+f);
Solve[{eq1,eq2},K]

当然のことながら、これは機能しません。p、a、b、c、dの観点からKを強制的に解く方法があれば、これは機能するかもしれませんが、その方法もわかりません。考え?


編集#1(11/10/11-1:30)[簡略化のために削除]

OK、新しいタクト。p = ton /(ton + toff)を取り、pにいくつかの式を掛けました。pを完全になくすことができることを私は知っています。新しい式(pに関して)は次のとおりです。

testEQ = A B p + A^2 B p^2 + (A+B)p^3;

次に、pを代入し、(通常の)FullSimplifyを呼び出して、この式を作成しました。

testEQ2= (ton (B ton^2 + A^2 B ton (toff + ton) + 
   A (ton^2 + B (toff + ton)^2)))/(toff + ton)^3;

最後に、最後の提案を除いて、以下のすべての提案を試しました(まだどのように機能するかはわかりません!)

削除オプションのみが機能しました。だから、これからこの方法を試してみようと思います。ありがとうございました。

EQ1 = a1 == (ton (B ton^2 + A^2 B ton (toff + ton) + 
        A (ton^2 + B (toff + ton)^2)))/(toff + ton)^3;
EQ2 = P1 == ton/(ton + toff);
Eliminate[{EQ1, EQ2}, {ton, toff}]

A B P1 + A^2 B P1^2 + (A + B) P1^3 == a1

追加する必要があります。目標が可能なすべての置換を行い、残りを残すことである場合、それを行う方法がまだわかりません。ただし、置換によっていくつかの変数を完全に削除できる場合は、Eliminate[]が最適に機能するようです。

4

3 に答える 3

13

これを試しましたか?

K = a*b*t/((t + f) c*d);
Solve[p == t/(t + f), t]
 -> {{t -> -((f p)/(-1 + p))}}

Simplify[K /. %[[1]] ]
 -> (a b p)/(c d)

編集:ああ、あなたは知っていEliminiateますか?

Eliminate[{eq1, eq2}, {t,f}]
 -> a b p == c d K && c != 0 && d != 0

Solve[%, K]
 -> {{K -> (a b p)/(c d)}}

編集2:また、この単純なケースでは、解決するKt同時にトリックを実行するようです:

Solve[{eq1, eq2}, {K, t}]
 -> {{K -> (a b p)/(c d), t -> -((f p)/(-1 + p))}}
于 2011-11-10T01:24:54.403 に答える
9

これらの線に沿った何かは、MathGroupの投稿で議論されています

http://forums.wolfram.com/mathgroup/archive/2009/Oct/msg00023.html

(少なくともその投稿の作者には非常に関連性のある外典のメモがあるようです。)

上記の例でどのように適用されるかを次に示します。この自己完結型を維持するために、置換コードを繰り返します。

replacementFunction[expr_, rep_, vars_] := 
 Module[{num = Numerator[expr], den = Denominator[expr], 
   hed = Head[expr], base, expon}, 
  If[PolynomialQ[num, vars] && 
    PolynomialQ[den, vars] && ! NumberQ[den], 
   replacementFunction[num, rep, vars]/
    replacementFunction[den, rep, vars], 
   If[hed === Power && Length[expr] == 2, 
    base = replacementFunction[expr[[1]], rep, vars];
    expon = replacementFunction[expr[[2]], rep, vars];
    PolynomialReduce[base^expon, rep, vars][[2]], 
    If[Head[hed] === Symbol && 
      MemberQ[Attributes[hed], NumericFunction], 
     Map[replacementFunction[#, rep, vars] &, expr], 
     PolynomialReduce[expr, rep, vars][[2]]]]]]

あなたの例は次のようになります。入力と置換を行います。後者の場合、分母を払うことによって同等の多項式を作成します。

kK = a*b*t/((t + f) c*d);
rep = Numerator[Together[p - t/(t + f)]];

これで、置換を呼び出すことができます。'p'をパラメーターとして扱い、置き換えたい変数をリストします。このように、それは他よりも低く注文されます。つまり、置換は「p」を優先してそれらを削除しようとします。

In[127]:= replacementFunction[kK, rep, {t, f}]
Out[127]= (a b p)/(c d)

このアプローチには、リストされている「変数」が何であるかを理解するのに少し魔法があります。おそらく、それを改善するためにさらに微調整を行うことができます。しかし、一般的に、新しい代替品として使用したいものをリストしないことが正しい方法であると私は信じています。

何年にもわたって、MathGroupにはこのアイデアのバリエーションがありました。他のいくつかは、処理したい特定の式により適している可能性があります。

- - 編集 - -

この背後にある考え方は、PolynomialReduceを使用して代数置換を行うことです。つまり、パターンマッチングを試みるのではなく、多項式の「正規化」メソッドを使用します。しかし、一般的に、私たちは多項式入力を扱っていません。したがって、このアイデアをNumericQ関数内のPolynomialQ引数に再帰的に適用します。

このアイデアの以前のバージョンは、いくつかの詳細とともに、以下で参照されているメモ、およびそれが参照しているメモにあります(説明的な再帰についてはどうですか?)。

http://forums.wolfram.com/mathgroup/archive/2006/Aug/msg00283.html

---編集を終了---

---編集2---

野生で観察されるように、このアプローチは必ずしも単純化するものではありません。これは代数的置換を行います。これには、内部で「用語の順序付け」(大まかに言うと「どのものが他のものに置き換えられるか」)の概念が含まれるため、単純な変数はより長い式に拡張できます。

用語の書き換えのもう1つの形式は、パターンマッチングによる構文の置換であり、他の応答では、そのアプローチの使用について説明しています。考慮すべきパターンの一般性が圧倒的になる可能性がある限り、これには別の欠点があります。たとえば、ルールがk /(w + p ^ 4)をqに置き換えることである場合、k ^ 2 /(w + p ^ 4)^ 3で何をしますか?(具体的には、これを(k /(w + p ^ 4))^ 2 * 1 /(w + p ^ 4)と同等であるとどのように認識しますか?)

結論は、何が望まれ、どのような方法が実行可能であるかについての考えを持っている必要があるということです。もちろん、これは一般的に問題固有です。

発生することの1つは、一般的に発生するすべての「複雑な」式を見つけて、より単純な式に置き換えたい場合です。これは、共通部分式除去(CSE)と呼ばれます。Mathematicaでは、これはExperimental`OptimizeExpression[]と呼ばれる関数を使って行うことができます。これについて説明しているMathGroupの投稿へのリンクがいくつかあります。

http://forums.wolfram.com/mathgroup/archive/2009/Jul/msg00138.html

http://forums.wolfram.com/mathgroup/archive/2007/Nov/msg00270.html

http://forums.wolfram.com/mathgroup/archive/2006/Sep/msg00300.html

http://forums.wolfram.com/mathgroup/archive/2005/Jan/msg00387.html

http://forums.wolfram.com/mathgroup/archive/2002/Jan/msg00369.html

これらのメモの1つからの例を次に示します。

InputForm[Experimental`OptimizeExpression[(3 + 3*a^2 + Sqrt[5 + 6*a + 5*a^2] +
      a*(4 + Sqrt[5 + 6*a + 5*a^2]))/6]]

Out[206]//InputForm=
Experimental`OptimizedExpression[Block[{Compile`$1, Compile`$3, Compile`$4, 
   Compile`$5, Compile`$6}, Compile`$1 = a^2; Compile`$3 = 6*a; 
   Compile`$4 = 5*Compile`$1; Compile`$5 = 5 + Compile`$3 + Compile`$4; 
   Compile`$6 = Sqrt[Compile`$5]; (3 + 3*Compile`$1 + Compile`$6 + 
     a*(4 + Compile`$6))/6]]

---編集を終了2---

ダニエル・リヒトブラウ

于 2011-11-10T16:44:24.490 に答える
8
K = a*b*t/((t+f)c*d);

FullSimplify[ K, 
 TransformationFunctions -> {(# /. t/(t + f) -> p &), Automatic}]
(abp)/(cd)

別のメソッドを表示するように更新を修正しました。

EQ1 = a1 == (ton (B ton^2 + A^2 B ton (toff + ton) + 
        A (ton^2 + B (toff + ton)^2)))/(toff + ton)^3;

f = # /. ton + toff -> ton/p &;

FullSimplify[f @ EQ1]
a1 == p(AB + A ^ 2 B p +(A + B)p ^ 2)

現時点でこれが価値があるかどうかはわかりませんが、少なくともうまくいくことを願っています。

于 2011-11-10T10:25:01.890 に答える