如何使用 SymPy(或类似的 Python 框架)评估涉及虚数单位的不那么简单的二重积分?

How can I evaluate a not so trivial double integral that involves imaginary unit using SymPy (or a similar Python framework)?

我有以下积分(受this question启发)涉及两个实变量ab(以及虚数单位I):

f = integrate(exp((-a*t**2+I*b*t)/(3*t**2+1)+I*t*x)*(x/(3*t**2+1)), (t, -oo, oo), (x, 0, oo))

我想迭代两个变量 ab,让我们说在 -10 到 10 的范围内,例如for a in range(-10,11): 后跟一个内部循环 for b in range(-10,11): 然后计算积分,这允许我根据两个变量 ab.

绘制一个表面

方法如下:

from sympy.abc import a, b, x, t
from sympy import *
from sympy import var, Integral, init_printing
init_printing()

a, b, x, t = symbols('a b x t')

integrand = exp((-a*t**2+I*b*t)/(3*t**2+1)+I*t*x)*(x/(3*t**2+1))

for i in range(-1,1,0.1):
    for j in range(-1,1,0.1):
        print(Integral(integrand.subs(a,i).subs(b,j), (t, -oo, oo), (x, 0, oo)).evalf())

我尝试使用以下方法对其进行评估:

Integral(exp((-a*t**2+I*b*t)/(3*t**2+1)+I*t*x)*(x/(3*t**2+1)), (t, -oo, oo), (x, 0, oo)).evalf()

但没有成功(语法上似乎是正确的)。很高兴知道我们如何进行此类评估。我对任何替代方法持开放态度。我真的很好奇曲面F(a,b)是什么样子的

当您使用 evalf 进行积分时,在后台 SymPy 将使用 mpmath 库中的相应例程:

https://mpmath.org/doc/current/calculus/integration.html

尽管 mpmath 支持对双积分进行数值计算,但 SymPy 只会尝试对单积分进行计算。不过,您可以直接使用 mpmath:

In [46]: import mpmath

In [47]: a = 1

In [48]: b = 1

In [49]: I = mpmath.sqrt(-1)

In [50]: f = lambda x, t: mpmath.exp((-a*t**2+I*b*t)/(3*t**2+1)+I*t*x)*(x/(3*t**2+1))

In [51]: mpmath.quad(f, [0, mpmath.inf], [-mpmath.inf, mpmath.inf])
Out[51]: mpc(real='-1.1728243698636993e+37', imag='0.0')

我认为 -1e37 结果可能只是意味着积分不收敛(或者至少试图计算它的数值算法不收敛)。为外部积分的上限选择有限值表明这不收敛:

In [54]: for c in [1, 10, 100, 1000, 10000]:
    ...:     print(mpmath.quad(f, [0, c], [-mpmath.inf, mpmath.inf]))
    ...: 
(0.496329567173036 + 0.0j)
(3.47061267913388 + 0.0j)
(6.20670960862542 + 0.0j)
(-245.035824572364 + 0.0j)
(149439.86145905 + 0.0j)

也许它对 ab 的某些值收敛,但对其他值不收敛。