如何使用 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启发)涉及两个实变量a
和b
(以及虚数单位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))
我想迭代两个变量 a
和 b
,让我们说在 -10 到 10 的范围内,例如for a in range(-10,11):
后跟一个内部循环 for b in range(-10,11):
然后计算积分,这允许我根据两个变量 a
和 b
.
绘制一个表面
方法如下:
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)
也许它对 a
和 b
的某些值收敛,但对其他值不收敛。
我有以下积分(受this question启发)涉及两个实变量a
和b
(以及虚数单位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))
我想迭代两个变量 a
和 b
,让我们说在 -10 到 10 的范围内,例如for a in range(-10,11):
后跟一个内部循环 for b in range(-10,11):
然后计算积分,这允许我根据两个变量 a
和 b
.
方法如下:
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)
也许它对 a
和 b
的某些值收敛,但对其他值不收敛。