5

を使用しているときに、奇妙な動作に遭遇しGroebnerBasisました。以下ではm1、変数としてギリシャ文字をm2使用し、ではラテン文字を使用しました。どちらにもルールはありません。選択した変数によって、回答が大きく異なるのはなぜですか?

画像:

ここに画像の説明を入力してください

コピー可能なコード:

Clear["Global`*"]
g = Module[{x}, 
    x /. Solve[
      z - x (1 - b - 
           b x ( (a (3 - 2 a (1 + x)))/(1 - 3 a x + 2 a^2 x^2))) == 0,
       x]][[3]];
m1 = First@GroebnerBasis[\[Kappa] - g, z]
m2 = First@GroebnerBasis[k - g, z]

編集:

ベリサリウスが指摘しているように、私の使用法はGroebnerBasis多項式入力を必要とするため、完全には正しくありませんが、私の使用法はそうではありません。コピーパスタによって発生したこのエラーは、上から使用して残りのコードを実行したときに期待した答えが得られたため、これまで気付かれませんでしたm1しかし、私はそれが不合理な使用法であると完全には確信していません。以下の例を考えてみましょう。

x = (-b+Sqrt[b^2-4 a c])/2a;
p = First@GroebnerBasis[k - x,{a,b,c}]; (*get relation or cover for Riemann surface*)
q = First@GroebnerBasis[{D[p,k] == 0, p == 0},{a,b,c},k,
    MonomialOrder -> EliminationOrder]; 

Solve[q==0, b] (*get condition on b for double root or branch point*) 

{{b -> -2 Sqrt[a] Sqrt[c]}, {b -> 2 Sqrt[a] Sqrt[c]}}

どちらが正しい。ですから、そのような場合でも大丈夫GroebnerBasisと思いますが、その背後にある深い理論に精通しているわけではないので、ここでは完全に間違っている可能性があります。

PSGroebnerBasis投稿で3回言及すると、DanielLichtblauがあなたの質問に答えると聞きました:)

4

2 に答える 2

4

これらの例で示されたバグはバージョン9で修正されます。オフハンドバージョン8以前でそれを回避する方法がわかりません。正しく思い出せば、シンボリック多項式係数がゼロであるかどうかをチェックしていたコードの中間数値オーバーフローが原因でした。

目的によっては、より多くの変数を指定し、場合によってはデフォルト以外の用語の順序を指定することが適切な場合があります。また、分母を払うことは、少なくともそれが有効なことである場合に役立つ可能性があります。そうは言っても、これらの戦術がこの例で役立つかどうかはわかりません。

このコードについてもう少し詳しく見ていきますが、近い将来にはおそらくないでしょう。

ダニエル・リヒトブラウ

于 2011-06-23T13:54:18.170 に答える
3

これは、Mathematicaがのような関数ですべての可変次数を試行するわけではないという事実に関連している可能性がありますSimplify。次に例を示します。

ClearAll[a, b, c]
expr = (c^4 b^2)/(c^4 b^2 + a^4 b^2 + c^2 a^2 (1 - 2 b^2));
Simplify[expr]
Simplify[expr /. {a -> b, b -> a}]
   (b ^ 2 c ^ 4)/(a ^ 4 b ^ 2 + a ^ 2(1-2 b ^ 2)c ^ 2 + b ^ 2 c ^ 4)
   (a ^ 2 c ^ 4)/(b ^ 2 c ^ 2 + a ^ 2(b ^ 2-c ^ 2)^ 2)

AdamStrzebonskiは次のように説明しています。

...選択した変数のすべての可能な順序でFullSimplifyを試すことができます。もちろん、これは計算時間をFactorial[Length[variables]]で乗算します...

于 2011-06-01T11:49:44.657 に答える