2013-05-08 132 views
7

我知道sympy在python中可以設置變量的假設,例如x是正數,負數,實數,複數等。我在想,sympy是否可以設置相對變量的假設到其他變量。例如,如果我有變量x和y,我可以設置sympy在其解決方案中假定x> y。或者,或者,如果我有兩個變量a和b,我可以設置sympy來假設a + 2B < 1?這些假設可能有助於sympy簡化複雜的解決方案來解決()和特徵向量。在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的結果,因爲它們非常漫長而複雜。我懷疑它與變量的假設有關,例如指定a + 2b < 1,但我不確定。

回答

9

我想知道是否張貼此作爲一個評論,但它是太長:

簡短的回答:沒有可用的方式。

SymPy的假設系統現在很混亂(版本0.7.2,截至2013年5月最新)。由於預期的GSoC項目,今年夏天有可能會變得更好,但這還不確定。

SymPy中實際上有兩個假設系統。舊的,它添加了符號本身的假設(因此導致重建表達樹的問題),並在構造函數中調用(例如Symbol(..., positive=True)),並且有一個新的基於全局變量的全局假設和本地經理(with assume(...):)。

SymPy中的許多函數都會檢查舊的假設(例如Abs將檢查是否設置了關鍵字參數positive),但仍然可能存在漏洞。新的假設系統可能更強大,但目前幾乎未被使用(除非是最近的子模塊)。

在舊的假設系統中,你想要的是不可能的。在新版本中,它是可能的,但可能尚未實現,並且不用於SymPy的任何部分。

所以你有兩個選擇:幫助我們設定假設系統或幫助我們使用矩陣模塊。兩人都可以用更多的愛。

+1

你好,你似乎知道了很多關於假設系統中。我在哪裏可以瞭解當前的狀態更加的實用技巧假設系統在2016年年底?Sympy現在處於版本1,並且似乎仍然存在兩個假設系統,因爲假設模塊和符號構造器假設都存在。文檔沒有解釋爲什麼仍然存在兩個系統或提供指導要知道何時使用其中一個或另一個 – Shaun 2016-12-02 19:14:24

+0

@Shaun,要求更新說明的最佳位置是sympy郵件列表。 – Krastanov 2016-12-04 04:57:18

4

這裏的假設並未發揮作用。如果你有平方根,那通常只是很重要,因爲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 ⎦⎦⎠⎦ 
+0

https://code.google.com/p/sympy/issues/detail?id= 3811 – asmeurer 2013-05-08 18:01:00

+0

啊。謝謝!解決問題實際上解決了我遇到的一些問題。我遇到了包含平方根的特徵向量問題,如sqrt((K-a)** 2)。能夠指定K> a的假設是很好的,所以這可以簡化爲正面。根據上面的帖子,看來這是不可能的。 – Nate 2013-05-08 19:51:34

+1

你可以在一定程度上用新的假設來做到這一點。試一下'refine(expr,Q.positive(K-a))'。 – asmeurer 2013-05-09 00:07:39