SymPy學習之Numerical evaluation

Basics
#N(expr, <args>)函數與sympify(expr).evalf(<args>)等價
>>> from sympy import *
>>> N(sqrt(2)*pi)
4.44288293815837
>>> (sqrt(2)*pi).evalf()
4.44288293815837
#額外的參數用於確認精確度
>>> N(sqrt(2)*pi, 5)
4.4429
>>> N(sqrt(2)*pi, 50)
4.4428829381583662470158809900606936986146216893757
#支持複數
>>> N(1/(pi + I), 20)
0.28902548222223624241 - 0.091999668350375232456*I
#有變量時進行部分計算
>>> x = Symbol('x')
>>> (pi*x**2 + x/3).evalf()
3.14159265358979*x**2 + 0.333333333333333*x
#也可以用標準python函數
>>> float(pi)
3.1415926535...
>>> complex(pi+E*I)
(3.1415926535...+2.7182818284...j)
#理論上無精確度上限
>>> str(N(pi, 10**6))[-50:] 
'95678796130331164628399634646042209010610577945815'
Floating-point numbers
>>> Float(0.1)
0.100000000000000
>>> Float(0.1, 10)
0.1000000000
>>> Float(0.125, 30)
0.125000000000000000000000000000
>>> Float(0.1, 30)   #傳數值經精度比較低
0.100000000000000005551115123126
#解決方案
>>> Float('0.1', 30)   #傳字符串
0.100000000000000000000000000000
>>> Float(Rational(1, 10), 30)  #傳Rational變量
0.100000000000000000000000000000
>>> Rational(1, 10).evalf(30)  #對Rational變量進行求值
0.100000000000000000000000000000
#以精確度較高的位數作爲最終結果精確度
>>> Float(0.1, 3)*Float(3.1415, 5)
0.31417
Accuracy and error handling
#普通python計算無法進行高精度計算
>>> a, b = GoldenRatio**1000/sqrt(5), fibonacci(1000)
>>> float(a)
4.34665576869e+208
>>> float(b)
4.34665576869e+208
>>> float(a) - float(b)
0.0
#可以用N方法實現
>>> N(fibonacci(100) - GoldenRatio**100/sqrt(5))
-5.64613129282185e-22
#精度更高時N方法也失效
>>> N(fibonacci(1000) - (GoldenRatio)**1000/sqrt(5))
0.e+85
#加入maxn參數
>>> N(fibonacci(1000) - (GoldenRatio)**1000/sqrt(5), maxn=500)
-4.60123853010113e-210
#高精度計算比較耗時,加入strict拋出錯誤
>>> N(fibonacci(1000) - (GoldenRatio)**1000/sqrt(5), strict=True)
#傳入0時N函數無法得知,用chop參數剔除
>>> f = fibonacci(100) - (GoldenRatio**100 - (GoldenRatio-1)**100)/sqrt(5)
>>> N(f)
0.e-104
>>> N(f, maxn=1000)
0.e-1336
>>> N(f, chop=True)
0
>>> N(3 + I*f, chop=True)
3.00000000000000
#round函數四捨五入,保留指定位小數
>>> v = 10*pi + cos(1)
>>> N(v)
31.9562288417661
>>> v.round(3)
31.956
Numerical simplification
#nsimplify用於化簡,第二個參數爲化簡的類型,tolerance爲誤差
>>> nsimplify(0.1)
1/10
>>> nsimplify(6.28, [pi], tolerance=0.01)
2*pi
>>> nsimplify(pi, tolerance=0.01)
22/7
>>> nsimplify(pi, tolerance=0.001)
355
---
113
>>> nsimplify(0.33333, tolerance=1e-4)
1/3
>>> nsimplify(2.0**(1/3.), tolerance=0.001)
635
---
504
>>> nsimplify(2.0**(1/3.), tolerance=0.001, full=True)
3 ___
\/ 2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章