【问题标题】:Python: Evaluating Integral for arrayPython:评估数组的积分
【发布时间】:2017-05-16 18:09:02
【问题描述】:
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)

我不断收到错误消息 "Supplied function does not return a valid float.",我认为问题在于我尝试将数组传递给 quad 函数。我考虑过用类似的方法评估数组每个条目的积分:

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]

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

【问题讨论】:

    标签: python scipy integration quad


    【解决方案1】:

    您可以使用一个通用函数(请参阅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)
    

    【讨论】:

      【解决方案2】:

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

      为什么要向 f() 传递一个数组?

      【讨论】:

        【解决方案3】:

        您可以使用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 以一次计算所有数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-01
          • 2017-12-22
          • 2011-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-07
          相关资源
          最近更新 更多