如何使用python将不确定性传播到用户定义的函数
我想使用python传播不确定性。通过不确定性软件包,对于简单函数而言,这是相对容易的。但是,使用用户定义的函数实现同样的效果并不明显。下面是我试图做的一个例子如何使用python将不确定性传播到用户定义的函数,python,numpy,pymc,uncertainty,Python,Numpy,Pymc,Uncertainty,我想使用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 int
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)))
上面所做的只是对两个参数进行随机抽样,并计算平均值和方差。然而,我不确定这种暴力手段在多大程度上是足够的。我可以使用大数定律,试着估计需要多少次试验才能得到某个值(P=1-1/(N*k**2))约为k
乘以真实平均值的标准偏差
原则上我写的东西可以用。然而,我的假设是,作为一种具有许多强大软件包的灵活语言,python可以更有效地完成这项任务。我在考虑不确定性
,mcerp
和pymc
。由于我使用这些软件包的经验有限,我不确定如何继续
编辑:
我最初的示例没有那么多信息,这就是为什么我决定做一个新的示例来说明我的想法。Numpy支持任意数字类型的数组。但是,并非所有函数都支持任意数字类型 在这种情况下,不支持
numpy.exp
和trapz
请注意,uncertanties模块包含unumpy
包numpy.exp
在这里有一个替换项:unampy.exp
我们把trapz定义为
看看这里
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))
输出:
np.exp()
与**
不同np.exp()
是指数函数。哦,这是一个非常严重的错误。让我来修!为什么这个问题的标签是“pymc”?
[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]