2017-03-01 1 views
0

나는 이것을 가지고 며칠 동안 고심하고있다. 나는 조각 별 가우시안 함수의 밀도를 추정하려고 노력하고있다. 아무도 지금 왜 오류가 발생하는지 말해 줄 수 있습니까?출력 [0] = y0 ValueError : 시퀀스가있는 배열 요소 설정

TypeError:  output[0] = y0 

ValueError : 배열로 배열 요소를 설정합니다.

그것은이 라인에서 발생

: 첫 번째 인수가 통합됩니다 하나의 변수의 함수이다

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' 함수의 첫 번째 인수는 함수 여야합니다. 인수를 사용하여 람다를 호출 한 결과를 '가우시안 (...)'이라고합니다. – hpaulj

+0

@hpaulj, 아직 작동하지 않습니다. 나는 이것을 시도한 2 일간 허리를 have다 :-) .... –

답변

1

romberg에 대한 문서는 매우 명확하다 : 여기

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

는 스크립트입니다 .

우선, 부차적 인 부분입니다. np.e**보다 우선하여 np.exp을 사용하십시오. 네 개의 인자의 함수에 파이썬

표현식

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에 필수 매개 변수를 전달하는 데는 두 가지 방법이 있습니다.

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

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

다른 방법은 당신을 위해 인수를 전달하는 래퍼 함수를 ​​만드는 것입니다 : 가장 쉬운 방법은 튜플로 세 개의 추가 인수를 전달하기 위해 args 매개 변수를 사용하는 것입니다

기존 메커니즘을 사용하고 짧고 읽기 쉽기 때문에 주먹 접근 방식을 권장합니다.

+0

두 가지 방법 모두 작동하지만 다른 오류가 발생합니다. Zero_RG = integrate.romberg (wrapped_gaussian, Q1, Q2), 출력 [0] = y0 ValueError : 배열로 배열 요소를 설정합니다. –

+0

첫 번째 경우는 어떻습니까? –

+1

또한'np.e ** (...)'를'np.exp (...) '로 변경하십시오. 답변을 업데이트했습니다. –

관련 문제