我目前正在进行一些数值传热计算,这需要一个很好的互补误差函数(erfc)的近似。其中一个传热方程由exp(s^2)和erfc(s)的乘积组成,这意味着(对于较大的s值)一个非常大的数乘以一个非常小的数。因此,电流变流控制的精度需要相当高。否则,对大量s的计算将是不稳定的。在
由于处理not的数学函数(例如sqrt()、exp()和pow())不能取双倍数,所以我使用float,这给了我对于大值s的稳定性问题。对于大值,我的意思是大约4到5。例如,4.5的erfc应该是1.97*10^(-10)。在
…现在来回答问题。在
1)是否可以在处理的数学函数(例如平方根、exp和幂)中使用双精度来获得互补误差函数值的更精确表示?在
2)据我所知,Python也在使用float,而不是double,这意味着(至少在我看来)Processing和Python对于互补错误函数应该得到相同的结果。然而,事实并非如此。Python对错误函数的逼近比处理更精确。怎么会这样?在
下面显示了Python和互补误差函数近似的处理版本。在
Python:from math import sqrt
from math import pi
from math import exp
n=1000 #number of intervals
b=float(1) #integration end
h=b/n #Interval width
leftRiemann=0
for s in range(0, n):
leftRiemann=leftRiemann+h*2/sqrt(pi)*exp(-((s*h)**2))
rightRiemann=0
for s in range(1, n+1):
rightRiemann=rightRiemann+h*2/sqrt(pi)*exp(-((s*h)**2))
trapez=0.5*leftRiemann+0.5*rightRiemann
centrePoint=0
for s in range(1, n+1):
centrePoint = centrePoint+h*2/sqrt(pi)*exp(-((h*(s-0.5))**2))
erfc=1 - (1.0/3*trapez+2.0/3*centrePoint)
print erfc
正在处理:
^{pr2}$
Python:erfc(1)=0.15729920705
处理:erfc(1)=0.15729982
表值:erfc(1)=0.157299