13

Python の sympy は、x が正、負、実数、複素数などの変数に仮定を設定できることを知っています。sympy が他の変数に関連する変数に仮定を設定できるかどうか疑問に思っていました。たとえば、変数 x と y がある場合、その解で x > y と仮定するように sympy を設定できますか。または、代わりに、a と B という 2 つの変数がある場合、sympy を設定して a + 2B < 1 と仮定することはできますか? これらの種類の仮定は、sympy が solve() および固有ベクトルの複雑なソリューションを単純化するのに役立つ可能性があります。

私はいろいろ調べましたが、これらの種類の仮定を 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 の結果は信じられないほど長く複雑であるため、単純化することさえ試みていません。a+2b < 1 と指定するなど、変数の仮定に関係していると思われますが、よくわかりません。

4

2 に答える 2

5

ここでは仮定は機能しません。通常、平方根がある場合にのみ問題にsqrt(x**2) = xなりますx >= 0

このために必要なことは、結果を単純化することだけです。Matrix.eigenvectsフラグがsimplifyありますが、明らかに結果を単純化していません。そのために問題を開きます。その間、手動で行うことができます。その場で動作することに注意してくださいMatrix.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 ⎦⎦⎠⎦
于 2013-05-08T17:58:37.843 に答える