Python 将多变量函数的积分定义为第二个函数 将多变量函数的积分定义为第二个函数

Python 将多变量函数的积分定义为第二个函数 将多变量函数的积分定义为第二个函数,python,function,scipy,integration,quad,Python,Function,Scipy,Integration,Quad,我使用python只在一个变量上积分多变量函数(它是x和θ的函数,我在θ上积分0到2*pi,因此结果是x的函数)。我尝试了以下几点: import numpy as np import scipy.integrate as inte d=10.0 xvals=np.linspace(-d,d,1000) def aIntegrand(theta,x): return 1/(2*np.pi)*np.sin(2*np.pi*x*np.sin(theta)/d)**2 def A(x):

我使用python只在一个变量上积分多变量函数(它是x和θ的函数,我在θ上积分0到2*pi,因此结果是x的函数)。我尝试了以下几点:

import numpy as np
import scipy.integrate as inte
d=10.0
xvals=np.linspace(-d,d,1000)
def aIntegrand(theta,x):
    return 1/(2*np.pi)*np.sin(2*np.pi*x*np.sin(theta)/d)**2
def A(x):
    return (inte.quad(aIntegrand,0,2*np.pi,args=(x,))[0])**(1/2)

plt.plot(xvals,A(xvals))
plt.xlabel("x")
plt.ylabel("A(x)")
plt.show()
我得到以下错误:

TypeError: only size-1 arrays can be converted to Python scalars
我假设这是因为quad integrator的结果是一个包含两个元素的数组,python不喜欢基于索引数组定义函数?不过,这完全是对问题的猜测。如果有人知道我如何解决这个问题,并能让我知道,那就太好了:)


第二次尝试 我使用以下代码成功地获得了积分图:

import numpy as np
import scipy.integrate as inte
import matplotlib.pyplot as plt
d=10.0
xvals=np.linspace(-d,d,1000)
thetavals=np.linspace(0.0,2*np.pi,1000)
def aIntegrand(theta,x):
    return 1/(2*np.pi)*np.sin(2*np.pi*x*np.sin(theta)/d)**2
def A(x):
    result=np.zeros(len(x))
    for i in range(len(x)):
        result[i]=(inte.quad(aIntegrand,0,2*np.pi,args=(x[i],))[0])**(1/2)
    return result
def f(x,theta):
    return x**2* np.sin(theta)

plt.plot(xvals,A(xvals))
plt.xlabel("x")
plt.ylabel("A(x)")
plt.show()


但这并没有给出一个函数(x),因为我定义它的方式,它需要一个数组形式的输入。我需要函数的形式与aIntegrand相同,当给定参数返回单个值时&因此函数可以重复集成。

我认为Scipy中不存在您所寻求的。但是,您至少有两种选择

  • 首先,可以使用创建插值器。这意味着您最初给出的x值范围决定了您可以调用插值器的范围。然后可以为该间隔内的任何x值调用该插值器
  • 即使没有可调用函数,也可以执行第二个积分。该函数仅需要值及其位置来提供集成过程的估计。否则,您可以在一次调用中使用执行双重集成

  • 首先请注意,积分可以用解析法计算。是的

    0.5 * (1 - J0(4 * pi * x / d))
    
    其中,
    J0
    是第一类贝塞尔函数

    第二,你可以使用(我的一个项目);它完全矢量化了计算

    将numpy导入为np
    导入四边形
    将matplotlib.pyplot作为plt导入
    进口特殊商品
    d=10.0
    x=np.linspace(-d,d,1000)
    def aIntegrand(θ):
    返回(
    1.
    /(2*np.pi)
    *np.sin(2*np.pi*np.multiply.outer(x,np.sin(θ))/d)**2
    )
    Ax2,err=quadpy.quad(aIntegrand,0,2*np.pi)
    Ax=np.sqrt(Ax2)
    plt.绘图(x,Ax,label=“quadpy”)
    plt.xlabel(“x”)
    plt.ylabel(“A(x)”)
    plt.plot(x,np.sqrt(0.5*(1-scipy.special.jv(0,4*np.pi*x/d)),label=“bessel”)
    #plt.show()
    plt.savefig(“out.png”,transparent=True,bbox_inches=“tight”)