2017-02-20 1 views
-1

Je reçois un ValueError lors de l'intégration à l'aide de scipy.integrate.quad. Voici mon code simplifié:ValueError lors de l'utilisation de scipy.integrate.quad

import numpy as np 
import scipy.integrate as integrate 
p = np.arange(0,1,1/1000) 
h = lambda p: p**2/2+p*(1-p) 
Kl = lambda p: h(p) + 0.02 
K = Kl(p) 
R = 0.5*h(p) + 0.5*h(1) 
Vl = lambda p: np.minimum.reduce([p, K, R]) 
integrate.quad(Vl, 0, 1)[0] 

La dernière ligne donne l'exception:

ValueError: setting an array element with a sequence. 

Quelqu'un peut-il s'il vous plaît proposer comment faire cette intégration correctement? Merci

+0

Pourriez-vous expliquer votre fonction 'Vl'? Que voulez-vous 'np.minimum.reduce ([p, K, R])' faire? – DSM

+0

Merci @DSM. Je voudrais qu'il prenne le minimum élémentaire de p, K et R. Je le considère comme une fonction mathématique Vl (p, K (p), R (p)) – splinter

+0

C'est le même code que http://stackoverflow.com/questions/42342409/valueerror-when-defining-a-lambda-function-in-python; juste une question légèrement différente. – hpaulj

Répondre

1

Je pense que ce code confond les fonctions sur les flottants avec des tableaux. L'argument de la fonction à quad doit accepter un flottant et renvoyer un flottant. Dans

Vl = lambda p: np.minimum.reduce([p, K, R]) 

p est un flotteur (et n'est pas le p array-- il est généralement une mauvaise idée d'avoir un module global avec le même nom comme argument) et K et R sont des tableaux qui ne sont pas ce que nous voulons (c'est ce lancer l'erreur.)

Je pense que vous êtes à la recherche d'

def h(p): 
    return p**2/2+p*(1-p) 

def K(p): 
    return h(p) + 0.02 

def R(p): 
    return 0.5*h(p) + 0.5*h(1) 

def Vl(p): 
    return min(p, K(p), R(p)) 

qui me donne

In [177]: integrate.quad(Vl, 0, 1.0) 
Out[177]: (0.34689543041336846, 4.8736376714649885e-09)