2014-10-08 74 views
2

我正在求解一個大的非線性方程組,我需要高度的數值精度。我目前使用sympy.lambdify將等式系統的符號表達式及其雅可比轉換爲矢量化函數,這些函數將ndarrays作爲輸入並返回一個ndarray作爲輸出。lambdify可以用dytpe np.float128返回一個數組嗎?

默認情況下,lambdify返回一個dtype爲numpy.float64的數組。是否有可能返回一個dtype爲numpy.float128的數組?也許這需要輸入的dtype爲numpy.float128

+0

事實上,輸出dtype應該或多或少地跟隨輸入。實際上,lambdify沒有指定任何dtype。它只是將sympy表達式轉換爲python表達式。如果將它應用於numpy數組,通常會應用numpy投射規則。 – burnpanck 2014-10-08 13:53:24

+0

如果您需要使用**任意精度**和**快速**計算引擎(兩者都受限於您的硬件),請嘗試**'fractions.Fraction **或**'decimal.Decimal '而不是稍長一些,但仍然主要是精確數字的精確浮點表示。爲了定量比較這些對象類的'numpy'處理性能,請閱讀>>> http://stackoverflow.com/a/26248202/3666197 – user3666197 2014-10-09 01:25:32

回答

0

輸出只是反映了輸入:

from numpy import float128 
from sympy.abc import x 
from sympy.utilities import lambdify 

f = lambdify(x, x ** 2) 
result = f(float128(2)) 

result 
#>>> 4.0 

type(result) 
#>>> <class 'numpy.float128'> 
+0

太棒了!謝謝。我想這會導致跟進。如果我運行的是64位機器,只需使用'numpy.float128'而不是'numpy.float64',我可以獲得浮點精度嗎?如果是的話,什麼是權衡? – davidrpugh 2014-10-08 16:46:54

+0

是的。它的成本很高。 – Veedrac 2014-10-08 17:53:52

+1

我很驚訝地發現,在numpy實現中float128的eps幾乎沒有優於float64的優勢:在我的機器上:1.084202172485504434e-19(來自np.finfo(np.float128).eps)。也許OP最好查看sympy的mpmath子包? – 2014-10-09 20:56:18

1

如果你需要大量的精密,你可以嘗試使用SymPy浮動,或直接mpmath(這是SymPy的一部分),它提供了任意精度。例如,sympy.Float('2.0', 100)創建了一個精度爲100的浮點數爲2.0的數字。例如,您可以使用類似sympy.sin(2).evalf(100)的東西來獲得100位數的sin(2)。這將比numpy慢很多,因爲它是任意的精度,這意味着它不使用機器浮點數,並且它是用純Python實現的(而numpy是用Fortran和C編寫的)。

+0

謝謝。我意識到使用mpmath獲得任意精度的能力,但不認爲我可以採取性能命中。 – davidrpugh 2014-10-13 03:20:07

相關問題