2012-01-25 96 views
3

我試圖模擬一個特定的物理系統。爲了傳播解決方案,我需要能夠乘以描述系統每個部分的行列式= 1的矩陣。在低於T(變量)的代碼與DET(T)= 1 2維矩陣,我只是表示區域號碼,其餘是不相關的。增加numpy.dot(蟒蛇)的精度

當我爲超過30個區域的系統運行此代碼時,最終的Msys不再具有行列式= 1。我在整個計算過程中檢查了Msys的行列式的值,在前幾次迭代中爲1,開始分歧。我在創建數組T時嘗試過把dtype = float64看作是否會提高精度並阻止它分解,但我沒有看到任何改進。

有什麼辦法,我可以編寫代碼來避免錯誤累積或方法可以讓我增加小數numpy的存儲量,從而使可忽略不計與100+地區系統的錯誤。

for i in range(n):         
    if i == 0:          
     Msys = T(L[i],i,k) 
    else:           
     Msys = numpy.dot(T(L[i]-L[i-1],i,k), Msys) 
return Msys 
+2

如果它是一個選項,[sympy(HTTP://計算器。 COM /問題/ 6876377/numpy的,任意精度線性代數)具有任意精度 – jterrace

+0

謝謝!結束使用mpmath這是sympy的一部分。 – Zykx

回答

5

所有浮點運算精度有限,錯誤累積。你需要決定多少精確度「足夠好」,或多少誤差累積「可以忽略」。如果float64對你來說不夠精確,請嘗試float128。你可以找到浮動類型的精度是這樣的:

In [83]: np.finfo(np.float32).eps 
Out[83]: 1.1920929e-07 

In [84]: np.finfo(np.float64).eps 
Out[84]: 2.2204460492503131e-16 

In [85]: np.finfo(np.float128).eps 
Out[85]: 1.084202172485504434e-19 

以下是有關浮點運算了更多信息:What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

SO上必須有浮點問題的TONS。我記得有些例子可以證明2個方程是相等的。只有在其中一個方程式中,他們得到了錯誤,因爲他們已經分配了一個非常小的數字(正如大多數科學計算教科書所涵蓋的)。 –

+0

還記得機器epsilon(實際上是計算機可以代表的最小數量)。 –

+0

這些仍然是不夠準確的,但我發現了另一個模塊調用mpmath,讓你選擇你想要的預知。謝謝你的幫助! – Zykx