ValueError: Истинное значение массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all () с pymc3 - PullRequest
0 голосов
/ 14 апреля 2020

Я пытался применить этот код к pymc3, но я получил ValueError: Истинное значение массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all (). Я получил ошибку при оценке интеграла, вот код.

import pymc3 as pm
import numpy as np
import scipy.integrate as integrate
data= np.loadtxt('sn_union2.txt',comments="#")
x=data[:,0]
y=data[:,1]
yerr=data[:,2]
c=3e5
mul=[]
def Or(h):
    Neff= 3.04
    Orad= 2.469*10**(-5)*h**(-2)*(1+0.2271* Neff)
    return Orad
def H(z,Om,Orc,h):
    Orad= Or(h)
    H0= 100*h
    E=np.sqrt((1-(np.sqrt(Orc)+np.sqrt(Orc+Om))**2)*(1+z)**2+(np.sqrt(Orc)+np.sqrt(Orc+Om*(1+z)**3))**2)
    return E
def Hinv(z,Om,Orc,h):
    return 1.0/H(z,Om,Orc,h)         
def dl(z,Om,Orc,h):
    int=integrate.quad(Hinv,0,z,args=(Om,Orc,h))[0]
    return int
def mu(z,Om,Orc,h, mu0):
    H0=100.0*h
    smu=5.0*np.log10((c/H0)*(1.0+z)*dl(z,Om,Orc,h)) + mu0
    return smu
with pm.Model() as model:
    Orc=pm.Uniform('Orc', lower=0, upper=0.25, transform=None)
    Om=pm.Uniform('Om', lower=0, upper=0.5, transform=None)
    mu0= pm.Uniform('mu0', lower=0, upper=100,   transform=None)
    h=pm.Normal('h',mu=0.7324, sigma=0.0174)
    mu=mu(x,Om,Orc,h,mu0)
    likelihood=pm.Normal('Y', mu=mu,sd=yerr, observed=y)
with model:
    step = pm.Metropolis ()
    trace = pm.sample (2000, tune=100, init=None, step=step, cores=8)
x=trace.get_values('Orc',burn=100, combine=True)
y=trace.get_values('Om',burn=100, combine=True)
z=trace.get_values('h',burn=100, combine=True)
mu0=trace.get_values('mu0',burn=100, combine=True)
t=list(zip(x,y,z,mu0))
np.savetxt('SNIaDGP.txt',t)
...