Python:评估数组的积分

时间:2017-01-02 16:19:34

标签: python scipy integration quad

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)

我继续收到错误消息"提供的函数没有返回有效的浮点数。" ,我认为问题是我尝试将数组传递给四元组功能。我想过用这样的东西来评估数组的每个条目的积分:

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]

它不起作用,但这是正确的方法吗?还有其他/更好的建议吗?

3 个答案:

答案 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)

答案 1 :(得分:0)

如果你的f()在传递数组时没有提供有效的float,而不是scipy.integral本身;

为什么要将数组传递给f()?

答案 2 :(得分:0)

您可以使用quadpy(我的项目之一)。关于函数范围和域的维数,quadpy已完全矢量化,因此您可以插入返回矢量的函数,并在多个时间间隔内一次集成该函数。您只需要确保输入函数正确处理矢量化输入即可。就您而言,应该是

import numpy
import quadpy


def f(x, y):
    return numpy.multiply.outer(y, x) + numpy.multiply.outer(numpy.ones_like(y), x ** 2)


def integral(x, y):
    scheme = quadpy.line_segment.gauss_legendre(5)
    intervals = numpy.array([numpy.zeros_like(x), x])
    out = scheme.integrate(lambda t: f(t, y), intervals)
    return out


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)
Z = gau(2, ylist)

print(Z)

您还可以在此处插入xlist而不是2来一次全部计算。