Python 使用具有可变被积函数成员的SciPy进行积分并放入网格

Python 使用具有可变被积函数成员的SciPy进行积分并放入网格,python,numpy,matplotlib,scipy,Python,Numpy,Matplotlib,Scipy,我想画一个向量场,其中两个分量是通过数值积分确定的,积分是通过绘制向量的空间坐标来计算的 在下面的代码中,我定义了依赖于r和z的被积函数,然后在循环中定义它们的值,并在每个(r,z)处计算两个积分 我有两个问题: 1) 用变量r和z来计算这些积分,有没有更符合python的方法 2) 存储积分值及其坐标以从meshgrids生成quiver图的最佳方法是什么 import scipy.integrate as spi import scipy.special as sps import nump

我想画一个向量场,其中两个分量是通过数值积分确定的,积分是通过绘制向量的空间坐标来计算的

在下面的代码中,我定义了依赖于
r
z
的被积函数,然后在循环中定义它们的值,并在每个(r,z)处计算两个积分

我有两个问题:

1) 用变量
r
z
来计算这些积分,有没有更符合python的方法

2) 存储积分值及其坐标以从
meshgrid
s生成
quiver
图的最佳方法是什么

import scipy.integrate as spi
import scipy.special as sps
import numpy as np

R = 2
V = 10

def Efield_r_integrand(k):
    return np.exp(-k*z)*k*R*V*sps.jv(1,k*r)*sps.jv(1,k*R)

def Efield_z_integrand(k):
    return np.exp(-k*z)*k*R*V*sps.jv(0,k*r)*sps.jv(1,k*R)

x_max = 3.0
z_max = 3.0
n_pts = 20

for i in xrange(n_pts):
    r = float(i)/float(n_pts)*r_max
    for j in xrange(n_pts):
        z = float(j)/float(n_pts)*z_max
        current_Efield_r = spi.quad(Efield_r_integrand,0,np.inf)[]
        current_Efield_z = spi.quad(Efield_z_integrand,0,np.inf)[]

除了构造之外,您的代码已经相当pythonic了

X范围内i的
(n_pts):
r=浮动(i)/浮动(n_点)*r_最大值
这是一些其他编程语言的翻版。在Python中,编写更像Python

for r in np.arange(0, rmax, rmax/n_pts):
因为您不需要中间变量
i

也就是说,对网格上定义的函数的积分求值是我不再编写double for循环的原因,但让便利函数来处理:

导入scipy.integrate作为spi
将scipy.special作为sps导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
def Efield_r_被积函数(k,z,r,r,V):
返回np.exp(-k*z)*k*R*V*sps.jv(1,k*R)*sps.jv(1,k*R)
def Efield_z_被积函数(k,z,r,r,V):
返回np.exp(-k*z)*k*R*V*sps.jv(0,k*R)*sps.jv(1,k*R)
x_max,z_max,n_pts=3.0,3.0,20
R、 V=2,10
Z、 X=np.mgrid[0:Z_max:n_pts*1j,0:X_max:n_pts*1j]#请注意,这将创建一个包含边界(0和3.0)的网格!
def在网格上集成(func、lo、hi、*args):
“”“返回可在网格上计算的可调用项。”“”
返回np.vectorize(lambda n,m:spi.quad(func,lo,hi,(n,m)+args)[0])
Efield_r,Efield_z=[在网格上积分(func,0,np.inf,r,V)(z,X)
对于func in(Efield\u r\u被积函数,Efield\u z\u被积函数)]
plt.箭袋(X,Z,Efield_r,Efield_Z)
最后一行显示了如何轻松使用迄今为止获得的结果生成
quiver
绘图。 还有一些重复可以消除:
Efield\u r\u被积函数
最多有一个因子与
Efield\u z\u被积函数
相同,理想情况下可以通过让
quad
理解,如果调用被积函数的返回值是数组,则意味着对数组的每个元素进行积分来解决。然而,这不是它的工作方式,但我离题了。你可以再创建一个函数,取这些方程中的公因子并调用它,但这取决于个人喜好