Python 虚数的Scipy四次积分

Python 虚数的Scipy四次积分,python,numpy,scipy,quad,Python,Numpy,Scipy,Quad,我想计算包含虚数的隐函数的积分 式中,f(iz)类似于: g(ix)类似于: 我想用数字来计算它。Pythonscipy.quad不计算虚数的积分(在下面的代码1中解释)Quadpy也没有效率,因为它传递整个numpy数组,而不是整数的单个值(在下面的代码2中解释),因此需要额外的操作。所以我想用如下所示的方式来划分积分(Re是实部,Im是虚部): 并展开上述等式: 我可以这样做吗 这里是代码,我展示了两种解决问题的方法 代码1: 第一种方法scipy.quad。根据: 我试着分成实部

我想计算包含虚数的隐函数的积分

式中,f(iz)类似于:

g(ix)类似于:

我想用数字来计算它。Python
scipy.quad
不计算虚数的积分(在下面的代码1中解释)
Quadpy
也没有效率,因为它传递整个numpy数组,而不是整数的单个值(在下面的代码2中解释),因此需要额外的操作。所以我想用如下所示的方式来划分积分(Re是实部,Im是虚部):

并展开上述等式:

我可以这样做吗

这里是代码,我展示了两种解决问题的方法

代码1:

第一种方法
scipy.quad
。根据: 我试着分成实部和虚部,分别计算它们的积分值:

from scipy.integrate import quad
import numpy as np
import scipy
from scipy.special import jv
import math
import quadpy

B=8
m=4
M_x = 0.3
M_T = 1
theta=0.3

def f_D(x, z):
    print("f_D:",z)
    return 1*np.exp(1j*x)*z

def phi_0(z):
    print("phi:",z)
    return 2/(z*M_r(z))

def M_r(z):
    print("M_r",z)
    return np.sqrt(z*z)

def psi_D(z):
    print("psi_D",z)
    return quad(f_D, -0.5, 0.5, limit=50, args=(z))[0]

def integral_P_Vm(z):
    print("Calling function, z=",z)
    return M_r(z)**2*np.exp(1j*(phi_0(z)))*jv(m*B, ((m*B*z*np.sin(theta)/(1-M_x*np.cos(theta)))))*2*psi_D(z)

def integral_P_Vm_real(z):
    print("Calling real function, z=",z)
    # return np.real(2*np.exp(1j*(z))*jv(m*B, (B*z))*2)
    return np.real(M_r(z)**2*np.exp(1j*(phi_0(z)))*jv(m*B, ((m*B*z*np.sin(theta)/(1-M_x*np.cos(theta)))))*2*psi_D(z))

def integral_P_Vm_imag(z):
    print("Calling imag function, z=",z)
    # return np.imag(2*np.exp(1j*(z))*jv(m*B, (B*z))*2)
    return np.imag(M_r(z)**2*np.exp(1j*(phi_0(z)))*jv(m*B, ((m*B*z*np.sin(theta)/(1-M_x*np.cos(theta)))))*2*psi_D(z))


Quad_integral = quad(integral_P_Vm, 0, 1, limit=100)
P_Vm_integral_real = quad(integral_P_Vm_real, 0, 1, limit=100)
P_Vm_integral_imag = quad(integral_P_Vm_imag, 0, 1, limit=100)

print("Quad",Quad_integral)
print("Real part:",P_Vm_integral_real)
print("Imaginary part",P_Vm_integral_imag)
该方法的输出为:

Quad (-5.63500792439988e-12, 1.4665732299181548e-21)
Real part: (-5.63500792439988e-12, 1.4665732299181548e-21)
Imaginary part (9.08758050641791e-12, 3.696603118432144e-22)
如您所见,法线四边形省略了虚部,因此我不确定
def psi_D(z):
中的积分是否也需要划分为虚部和实部

代码2:

第二种方法-
Quadpy.quad
代码是:

from scipy.integrate import quad
import numpy as np
import scipy
from scipy.special import jv
import math
import quadpy

B=8
m=4
M_x = 0.3
M_T = 1
theta=0.3

def f_D(x, z):
    print("f_D:",z)
    return 1*np.exp(1j*x)*z

def phi_0(z):
    print("phi:",z)
    return 2/(z*M_r(z))

def M_r(z):
    print("M_r",z)
    return np.sqrt(z*z)

def psi_D(z):
    print("psi_D",z)
    return quad(f_D, -0.5, 0.5, limit=50, args=(z))[0]

def integral_P_Vm(z):
    print("Calling function, z=",z)
    return M_r(z)**2*np.exp(1j*(phi_0(z)))*jv(m*B, ((m*B*z*np.sin(theta)/(1-M_x*np.cos(theta)))))*2*psi_D(z)

Quadpy_integral = quadpy.quad(integral_P_Vm, 0, 1, limit=100)

print("Quadpy",Quadpy_integral)
错误在第28行:

Exception has occurred: TypeError
only size-1 arrays can be converted to Python scalars
我试图通过modyfing迭代numpy数组z来克服这个错误:

def psi_D(z):
    print("psi_D",z)
    return quad(f_D, -0.5, 0.5, limit=50, args=(z))[0]
进入:

但是迭代在z数组的第一个元素处停止,我有一个错误:

Exception has occurred: TypeError
f_D() argument after * must be an iterable, not numpy.float64

在这种情况下,我不知道如何迭代整个numpy数组。

这是我对积分的解释

关于如何推广积分的答案可以推广到二重积分(由函数提供)

将numpy导入为np
从scipy.integrate导入dblquad
def complex_dblquad(函数、a、b、g、h、**kwargs):
定义实函数(z,x):
返回np.real(func(z,x))
定义imag_func(z,x):
返回np.imag(func(z,x))
实积分=dblquad(实函数,a,b,g,h,**kwargs)
imag_integral=dblquad(imag_func,a,b,g,h,**kwargs)
返回值(实积分[0]+1j*imag积分[0],实积分[1:],imag积分[1:]
然后你计算你的积分如下

complex_dblquad(lambda z,x: np.exp(1j*x*z), 0, 1, 0.3, 0.9)

我很久没有上复杂的数学课了。复积分是什么意思?与将实部和虚部视为二维一样,实际上是
x
y
上的二维积分,还是它们的约束更紧密<代码>np。四元是一个单值积分。有一个
dblquad
你看了吗?谢谢!根据你的答案,我编写了代码并使用了以下等式:
complex_integral=complex_dblquad(lambda z,x:np.sqrt(1+z*z)**2*(2/np.sqrt(1+z*z))**2*H_插值(x)*np exp(1j*2/np.sqrt(1+z*z)*x),0,1,-0.5,0.5)
这是这组等式的正确实现吗?更多详情:
complex_dblquad(lambda z,x: np.exp(1j*x*z), 0, 1, 0.3, 0.9)