我想用python傳播不確定性。通過不確定性包對於簡單的函數來說相對容易。但是,用用戶定義的函數實現這一點並不明顯。接下來是我想要做的一個例子。如何使用python傳播不確定性到用戶定義函數
import mcerp as err
import numpy as np
def mult_func(x,xm ,a):
x[x==0.] = 1e-20
v = (1.-(xm/x)**a) * (x > xm)
v[np.isnan(v)] = 0.
return v
def intg(e,f,cut,s):
t = mult_func(e,cut,s)
res = np.trapz(t*f,e)
return res
x=np.linspace(0,1,10000)
y=np.exp(x)
m=0.
mm=0.
N=100000
for i in range(0,N):
cut=np.random.normal(0.21,0.02)
stg=np.random.normal(1.1,0.1)
v=intg(x,y,cut,stg)
m=m+v
mm=mm+v*v
print("avg. %10.5E +/- %10.5E fixed %10.5E"%(m/N,np.sqrt((mm/N-(m/N)**2)),intg(x,y,0.21,1.1)))
以上所做的只是對兩個參數進行隨機抽樣並計算平均值和方差。不過,我不確定這個蠻力法足夠多。我可以使用大數定律並嘗試估計需要多少次試驗N
才能使某個值(P=1-1/(N*k**2))
大約是真實平均值附近的標準偏差的k
倍。
原則上我寫的可以工作。但是,我的假設是,Python是一種如此靈活的語言,具有許多強大的功能,可以更有效地完成這項任務。我正在考慮uncertainties
,mcerp
和pymc
。由於使用這些軟件包的經驗有限,我不確定如何繼續。
編輯: 我原來的例子沒有那麼多的信息,這就是爲什麼我決定做一個新的例子,其實際上可以說明我的想法。
爲什麼這個問題有標籤 'pymc'? –