2013-05-08 7 views
7

pythonのsympyは、xが正、負、実数、複合などの変数について仮定を設定できることを知っています。sympyが変数の相対的な仮定他の変数にたとえば、変数xとyがある場合、そのソリューションでx> yと仮定してsympyを設定できますか?あるいは、もし私が2つの変数、aとBを持っていれば、sympyを+ 2B <と仮定するように設定できますか?このような仮定は、sympyがsolve()と固有ベクトルの複雑な解を単純化するのに役立ちます。sympyの変数の仮定を他の変数と比較して設定する

私は、これらの仮定をsympyで設定することに関する情報を見つけておらず、見つけていません。

私は特定の行列

a,b = symbols('a,b', nonnegative=False) 
M = Matrix([ [1-a-2*b, a, b, b], 
      [a, 1-a-2*b, b, b], 
      [b, b, 1-a-2*b, a], 
      [b, b, a, 1-a-2*b] ]) 

Sympyの固有ベクトルを見つけようとしていますので、私は質問が正しく

M.eigenvals() 

私はMATLABとWolframAlphaを介して確認しました固有値を発見したすべての同じ結果を与える。しかし、固有ベクトルは混乱

M.eigenvects() 

MATLABとWolframAlpha [1,1,1,1] [-1、-1,1,1] [0,0、-1,1の両方のリターン・固有ベクトルであります] [-1,1,0,0]であり、正しい固有ベクトルである。私はsympyの結果を単純化することさえしようとしなかった。私はそれが+ 2b < 1を指定するような変数についての仮定と関係していると思うが、わからない。

答えて

9

私はコメントとしてこれを投稿するかどうかを疑問に思ったが、それはあまりにも長いです:

短い答え:ない使用可能な方法で。

SymPyの前提システムは今のところ混乱しています(バージョン0.7.2、2013年5月現在)。 GSoCプロジェクトのために今夏の方が良いかもしれないが、これはまだ確定していない。

実際にはSymPy内に2つの仮定システムがあります。古いものは、シンボル自体に仮定を追加し(したがって、表現木の再構築に問題を引き起こす)、コンストラクタで呼び出されます(例えば、Symbol(..., positive=True))、新しいものがあります。これはグローバルな仮定のためのグローバル変数に基づいていますローカルのコンテキストマネージャ(with assume(...):)です。

SymPy内の多くの機能は古い仮定をチェックします(たとえば、はキーワード引数positiveが設定されているかどうかをチェックしますが、それでもなおミスが存在する可能性があります)。新しい仮定システムはより強力になることができるが、現時点ではほとんど使われていない(最近のサブモジュールを除いて)。

古い仮定システムでは、あなたが望むものはできません。新しいものでは可能ですが、まだ実装されておらず、SymPyのどの部分でも使用されていない可能性があります。

あなたは2つの選択肢があります:仮定システムで私たちを助けてください、またはマトリックスモジュールで助けてください。どちらももっと愛を使うことができます。

+1

を使用することができない場合は、インプレースMatrix.simplify行為は(あなたが前提のシステムについて多くのことを知っているように見えることに注意してください。私は現在の状態について、より実用的なヒントを学ぶことができるところ2016年の後半に想定システムのバージョンが登場しましたか?Sympyはバージョン1になりました。仮定モジュールとシンボルコンストラクタの前提があるため、まだ2つの仮定システムがあるようです。 – Shaun

+0

@Shaun、更新された指示を求めるのに最適な場所は、sympyメーリングリストです。 – Krastanov

4

ここでは前提はありません。 sqrt(x**2) = xx >= 0の場合にのみ、平方根がある場合は、通常は問題ありません。

あなたがこれを行うために必要なのは、結果を単純化することだけです。Matrix.eigenvectsにはsimplifyフラグがありますが、明らかに結果は単純化されません。私はその問題を開くつもりです。その間、手動で行うこともできます。あなたがそのように、あなたはこんにちはMatrix.applyfunc(simplify)

>>> A = M.eigenvects() 
>>> A[0][2][0].simplify() 
>>> A[1][2][0].simplify() 
>>> pprint(A) 
⎡⎛1, 1, ⎡⎡1⎤⎤⎞, ⎛-4⋅b + 1, 1, ⎡⎡-1⎤⎤⎞, ⎛-2⋅a - 2⋅b + 1, 2, ⎡⎡-1⎤, ⎡0 ⎤⎤⎞⎤ 
⎢⎜  ⎢⎢ ⎥⎥⎟ ⎜    ⎢⎢ ⎥⎥⎟ ⎜     ⎢⎢ ⎥ ⎢ ⎥⎥⎟⎥ 
⎢⎜  ⎢⎢1⎥⎥⎟ ⎜    ⎢⎢-1⎥⎥⎟ ⎜     ⎢⎢1 ⎥ ⎢0 ⎥⎥⎟⎥ 
⎢⎜  ⎢⎢ ⎥⎥⎟ ⎜    ⎢⎢ ⎥⎥⎟ ⎜     ⎢⎢ ⎥ ⎢ ⎥⎥⎟⎥ 
⎢⎜  ⎢⎢1⎥⎥⎟ ⎜    ⎢⎢1 ⎥⎥⎟ ⎜     ⎢⎢0 ⎥ ⎢-1⎥⎥⎟⎥ 
⎢⎜  ⎢⎢ ⎥⎥⎟ ⎜    ⎢⎢ ⎥⎥⎟ ⎜     ⎢⎢ ⎥ ⎢ ⎥⎥⎟⎥ 
⎣⎝  ⎣⎣1⎦⎦⎠ ⎝    ⎣⎣1 ⎦⎦⎠ ⎝     ⎣⎣0 ⎦ ⎣1 ⎦⎦⎠⎦ 
+0

https://code.google.com/p/sympy/issues/detail?id= 3811 – asmeurer

+0

ああありがとうございますTh解決策は実際に私が持っていたいくつかの問題を解決します。私は、sqrt((K-a)** 2)のような平方根を含む固有ベクトルに関する問題にぶつかってきました。これがK> aという仮定を指定することができればうまくいくので、これは正の値として単純化されます。上記の投稿に基づいて、これはまだ可能ではないようです。 – Nate

+1

新しい仮定を使ってある程度まで行うことができます。 'refine(expr、Q.positive(K-a))'を試してください。 – asmeurer

関連する問題