2017-06-18 52 views
1

我想用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是一種如此靈活的語言,具有許多強大的功能,可以更有效地完成這項任務。我正在考慮uncertaintiesmcerppymc。由於使用這些軟件包的經驗有限,我不確定如何繼續。

編輯: 我原來的例子沒有那麼多的信息,這就是爲什麼我決定做一個新的例子,其實際上可以說明我的想法。

+0

爲什麼這個問題有標籤 'pymc'? –

回答

-1

Numpy支持任意數字類型的數組。但是,並非所有功能都支持任意數字類型。

在這種情況下,不支持numpy.exptrapz

請注意,uncertanties模塊包含unumpy包。 numpy.exp在這裏有一個替換:uncertainties.unumpy.exp

我們將trapz定義爲ufunc

看看這裏!

a=un.ufloat(0.3,0.01) 
b=un.ufloat(1.2,0.071) 



def sample_func(a: un.UFloat, b: un.UFloat) -> np.ndarray: 
    x=np.linspace(0,a,100) 
    y = un.unumpy.exp(x) 
    return utrapz(y, x) 

def utrapz(y: np.ndarray, x: np.ndarray) -> np.ndarray: 
    Δx = x[1:]-x[:-1] 
    avg_y = (y[1:]+y[:-1])/2 
    return (Δx*avg_y) 


print(sample_func(a, b)) 

OUT:

[0.00026601240063021264+/-nan 0.0005935120815465686+/-6.429403852670308e-06 
0.0006973604419223405+/-3.888235103342809e-06 ..., 
0.002095505706899622+/-6.503985178118233e-05 
0.0021019968633076134+/-6.545802781649068e-05 
0.0021084415802710295+/-6.587387316821736e-05] 
+1

'np.exp()'與'**'不一樣。 'np.exp()'是指數函數。 –

+0

哦,這是一個非常重要的錯誤。讓我解決這個問題! –

相關問題