2017-03-01 86 views
0

我一直在爲此奮鬥了幾天。我試圖估計分段高斯函數的密度。誰能告訴我爲什麼現在我得到錯誤輸出[0] = y0 ValueError:設置一個序列的數組元素

TypeError:  output[0] = y0 

ValueError:設置一個數組元素的序列。

它發生在這條線:

Zero_RG = integrate.romberg(gaussian(q,x,mu,sigma), Q1, Q2).` 

下面是腳本:

import numpy as np 
import sympy as sp 
from sympy import * 
from scipy import integrate 
from sympy import Integral, log, exp, sqrt, pi 
import matplotlib.pyplot as plt 
from scipy.stats import norm, gaussian_kde 
from quantecon import LAE 

from sympy import symbols 
var('Q1 Q2 x q sigma mu') 
#q= symbols('q') 

## == Define parameters == # 
mu=80 
sigma=20 
b=0.2 
Q=80 
Q1=Q*(1-b) 
Q2=Q*(1+b) 
d = (sigma*np.sqrt(2*np.pi)) 
phi = norm() 
n = 500 

def p(x, y): 
    x, y = np.array(x, dtype=float), np.array(y, dtype=float) 
    Positive_RG = norm.pdf(x-y+Q1, mu, sigma) 
    print('Positive_R = ', Positive_RG) 
    Negative_RG = norm.pdf(x-y+Q2, mu, sigma) 
    print('Negative_RG = ', Negative_RG) 
    gaussian = lambda q,x,mu,sigma: 1/(sigma*np.sqrt(2*np.pi))*np.exp(-(x+q-mu)**2 /(2*sigma**2)) 
    wrapped_gaussian = lambda q: gaussian(q, x, mu, sigma) 
    Zero_RG = integrate.romberg(wrapped_gaussian, Q1, Q2) 
    print('pdf',gaussian) 
    #Zero_RG = scipy.integrate.quad(norm.pdf(x + q, mu, sigma)) 
# Int_zerocase= lambda q: norm.pdf(x + q, u, sigma) 
# Zero_RG = scipy.integrate.quad(Int_zerocase, Q1, Q2) 
# print(Zero_RG) 

    if y>0.0 and x -y>=-Q1: 
     #print('printA', Positive_RG) 
     return Positive_RG 
    elif y<0.0 and x -y>=-Q2: 
     #print('printC', Negative_RG) 
     return Negative_RG 
    elif y==0.0 and x >=-Q1: 
     #print('printB', Zero_RG) 
     return Zero_RG 
    return 0.0 


Z = phi.rvs(n) 
X = np.empty(n) 
for t in range(n-1): 
    X[t+1] = X[t] + Z[t] 
    #X[t+1] = np.abs(X[t]) + Z[t] 
psi_est = LAE(p, X) 
k_est = gaussian_kde(X) 

fig, ax = plt.subplots(figsize=(10,7)) 
ys = np.linspace(-200.0, 200.0, 200) 
ax.plot(ys, psi_est(ys), 'g-', lw=2, alpha=0.6, label='look ahead estimate') 
ax.plot(ys, k_est(ys), 'k-', lw=2, alpha=0.6, label='kernel based estimate') 
ax.legend(loc='upper left') 
plt.show() 
+2

「integeate.romberg」函數的第一個參數必須是一個函數。你給它'gausian(...)',用參數調用lambda的結果。 – hpaulj

+0

@hpaulj,仍然無法正常工作。我已經忍受了2天的嘗試:-) .... –

回答

1

romberg的文檔是很清楚,第一個參數是被集成在一個單一變量的函數。

首先,小點。使用np.exp優先於np.e**

在Python,表達

gaussian = lambda q,x,mu,sigma: 1/(sigma*np.sqrt(2*np.pi))*np.exp(-(x+q-mu)**2 /(2*sigma**2)) 

gaussian到的四個參數的函數。表達式gaussian(q, x, mu, sigma)只是該函數的返回值。

有兩種方法可將所需參數傳遞給romberg。最簡單的方法是使用args參數在三個附加參數傳遞一個元組:

Zero_RG = integrate.romberg(gaussian, Q1, Q2, args=(x,mu,sigma)) 

另一種方法是創建一個包裝的功能,將傳遞參數給你:

wrapped_gaussian = lambda q: gaussian(q, x, mu, sigma) 
Zero_RG = integrate.romberg(wrapped_gaussian, Q1, Q2) 

我會推薦拳頭的方法,因爲它使用現有的機制,以及更短,更容易閱讀。

+0

這兩種方式的工作,但創建另一個錯誤。例如在第二種情況下聲明:Zero_RG = integrate.romberg(wrapped_gaussian,Q1,Q2),output [0] = y0 ValueError:使用序列設置數組元素。 –

+0

第一個案子呢? –

+1

另外,將'np.e **(...)'改爲'np.exp(...)'。我已經更新了答案。 –

相關問題