係数と一致パターンの両方を集めて単純化します


1

Collectの問題は、Collect[exp, pattern, Simplify]が係数を単純化する一方で、一致パターン自体に何も作用しないことです。コレクションの結果についてFullSimplifyを呼び出すと、頻繁にコレクションが取り消されます。これは、複雑で非整数の指数または指数を収集して一致させるときに特に重要です。

これを解決するには、次の解決策についてどう思いますか?この変換で表現木の一部を失う可能性はありますか?

私は上FullSimplifyを呼び出すすなわち(そう、彼らは再帰的である場合は、下から上式を簡略化し、私が通過するように私は、以前のコレクションを元に戻していないことを確認してください、私は深最初MapAllをしたいと思います
CollectFullSimplifyImpl[exp_, pat_]:= If[MatchQ[#,pat], [email protected]#, #]& //@ Collect[exp, pat, FullSimplify]; 
CollectFullSimplify[exp_, pat_]:= FixedPoint[CollectFullSimplifyImpl[#, pat]&, exp] 

より高いレベルのノードは、より低いノードがパターンともはやマッチしないことを意味し得る)。なぜ固定小数点があるのですか?指数が単純化され、結合される可能性があるが、最小限の例を見つけるのが困難な場合は、想起を//さらに単純化することができます。

は、次のテストしようと、結果を表示するには)... * unncessaryされることがあります。

exp = ((b - a)/a - b/a)x^(((b - a)/a) - (b/a) )+(1 + a)x + (b - 1)x; 
exp2 = ((b - a)/a - b/a)x^(((b - a)/a) - (b/a) )+ x^x^((b - a)/a - b/a-1/x+x^((b - a)/a - b/a)); (* Test out the recursion *) 
Print["Collect, then Collect with simplification, then CollectFullSimplify"] 
Collect[exp, x^_] 
Collect[exp, x^_, FullSimplify] 
CollectFullSimplify[exp, x^_] 

Print["Collect, then Collect with simplification, then CollectFullSimplify"] 
Collect[exp2, x^_] 
Collect[exp2, x^_, FullSimplify] 
CollectFullSimplify[exp, x^_] 

次は

"Collect, then Collect with simplification, then CollectFullSimplify" 

(* 
==> (1 + a) x + (-1 + b) x + (-(b/a) + (-a + b)/a) x^(-(b/ 
    a) + (-a + b)/a) 
*) 

(* ==> (a + b) x - x^(-(b/a) + (-a + b)/a) *) 

(* 
==> -(1/x) + (a + b) x 

During evaluation of 
*) 

"Collect, then Collect with simplification, then CollectFullSimplify" 

(* 
==> -x^(-(b/a) + (-a + b)/a) + x^x^(-(b/a) + (-a + b)/a - 1/x + 
    x^(-(b/a) + (-a + b)/a)) 
*) 

(* 
==> -x^(-(b/a) + (-a + b)/a) + x^x^(-(b/a) + (-a + b)/a - 1/x + 
    x^(-(b/a) + (-a + b)/a)) 
*) 

(* ==> -(1/x) + (a + b) x *) 

一つの問題は、私が発見した出力であることは次のようになります。 CollectFullSimplifyImpl[v[l][z_] , z^_]v[l][Pattern[(If[MatchQ[#, z^Blank[]], FullSimplify[#], #]&)[z], Blank[]]]になります。私は通常、{v[l][z_] -> COMPLICATED STUFFという形式のルールでCollectFullSimplifyを呼びたいので、これは醜いです。これはそれを破壊します。

  0

いいえ、そうは思いません。もう一度読む。 26 8月. 132013-08-26 18:38:42

  0

ありがとうございます。今は固定小数点を無視して、良いアイデアかどうか再考し始めています。しかし、メインコードはルールに適用される場合を除いて動作するようです。 26 8月. 132013-08-26 18:43:45

3

私はあなたの希望する機能を理解していないので、私はこの質問に反対し、自分のコードで問題を解決できるかどうか確認します。私は追加

CollectFullSimplifyImpl[exp_, pat_] := 
    Replace[ 
    Collect[exp, pat, FullSimplify], 
    x : pat :> RuleCondition @ FullSimplify @ x, 
    {0, -1} 
    ] 

:あなたのパターンpatと一致していませむしろ名前が示すように、それらを含むすべての部分式に機能をマップMapAllを使用するよりないつまり、あなたはlevelspec{0, -1}のでReplaceを使用することができますRuleConditionは、あなたのパターンが保持されている式の一部と一致する場合に適しています。この機能をテストして、それがどこで失敗するか教えてください。

  0

それは完全に動作するようです。それはまた、規則の崩壊の問題を解決する。私が固定点に置くことを望んだのは、一致した式を簡略化した後である(例えばここでは '((b - a)/ a) - (b/a)収集...)、それ以上の用語を別の収集と組み合わせることは可能かもしれない。しかし、私はこれに遭遇した場所を見つけ出すのに苦労しています。恐らくそれは無視されるべきです。 26 8月. 132013-08-26 19:02:38

  0

1つのプロトコルに関する質問:関連する質問を削除するとよいフォームですか? 26 8月. 132013-08-26 19:05:29

  0

@jlperlaあなたは[this one](http://mathematica.stackexchange.com/q/30937/121)を意味しますか? 26 8月. 132013-08-26 19:06:37

  0

はい、それです 26 8月. 132013-08-26 19:11:15

  0

@jlperla私はあなたを参照してくださいこの答えを受け入れる。ありがとうございますが、あなたはそれについて素早くする必要はありません。他の誰かが、あなたの問題に近づくためにはまったく異なる優れた方法を持っているかもしれません。私は誰もそれに答えなかったので、あなたは古い質問を削除することをお勧めします。私はそれにコメントする気にさえ戸惑う唯一の人です。だから誰も現在答えに取り組んでいるとは思わないでしょう。 26 8月. 132013-08-26 19:49:14

  0

エチケットのヒントありがとうございました。ところで、mathematicaからの入力と出力をSEにコピー&ペーストする最良の方法は何ですか?これを実行して適切な書式設定を行う最良の方法について、矛盾する投稿が見つかりました。 26 8月. 132013-08-26 19:56:05

  0

@jlperla [相違する意見](http://meta.mathematica.stackexchange.com/q/2/121)があります。私は、入力と出力のセルを別々にコピーして、 'In [x]:='と 'Out [x] ='ラベルを含まないようにします。 26 8月. 132013-08-26 20:05:39

  0

ところで、私はあなたがこの答えを受け入れたがそれに投票しなかったことに気付きました。あなたは両方を行うことができることを知っていますか?とにかく私は毎日の制限を超えているので、このケースでは違いはありませんので、ちょうどFYIです。 26 8月. 132013-08-26 20:06:43