2017-01-02 5 views
0
import numpy 

import matplotlib.pyplot as plt 

from scipy import integrate 

def f(x,y): 
    return x*y + x**2 

def integral(x,y): 
    I = integrate.quad(f, 0, x, args=(y,))[0] 
    return I 

def gau(x,y): 
    return (1+x)*integral(x,y) 


xlist = numpy.linspace(-3.0, 3.0, 100) 
ylist = numpy.linspace(-3.0, 3.0, 100) 
X, Y = numpy.meshgrid(xlist, ylist) 
Z = gau(2, Y) 

print(Z) 

Я продолжаю получать сообщение об ошибке «Поставляемая функция не возвращает действительный поплавок»., я думаю, проблема в том, что я пытаюсь передать массив функции quad. Я думал о вычислении интеграла для каждого элемента массива с чем-то вроде этого:Python: Оценка интеграла для массива

yi=numpy.linspace(-3.0,3.0,100) 
for i, item in enumerate(yi): 
    return integral[i]=integrate.quad(f,0,x,args=(yi,))[0] 

Это не работает, но это правильный путь? Любые другие/лучшие предложения?

ответ

2

Вы можете использовать универсальную функцию (см. https://docs.scipy.org/doc/numpy/reference/ufuncs.html), которая работает с массивами по элементам. Вы можете создать эти универсальные функции из любой функции, используя frompyfunc функции (https://docs.scipy.org/doc/numpy/reference/generated/numpy.frompyfunc.html):

ugau = numpy.frompyfunc(gau,2,1) 
Z=ugau(X,Y) 
+0

работу по этой проблеме, спасибо! – user7248647

0

Это, если ваш f(), который не предоставляет действительного поплавка при передаче массива, а не самого scipy.integral;

Почему вы передаете массив вашему f()?

Смежные вопросы