嗨,我的讲师向我提出了一个问题,要求通过 python 集成一个函数,但他给了我们很少的信息。边界是+无穷大和-无穷大,函数是
(cos a*x) * (e**-x**2)
到目前为止我已经
def gauss_cosine(a, n):
sum=0.0
dx = ((math.cosine(a*x)*math.exp(-x**2)))
return
for k in range (0,n):
x=a+k*dx
sum=sum+f(x)
return dx*sum
不确定这是否正确。
我在这个网站上没有看到太多推荐,但你可以尝试 sympy:
In [1]: import sympy as sp
In [2]: x, a = sp.symbols(('x', 'a'))
In [3]: f = sp.cos(a*x) * sp.exp(-x**2)
In [4]: res = sp.integrate(f, (x, -sp.oo, sp.oo))
In [5]: res
Out[5]: sqrt(pi) * exp
In [6]: sp.pprint(res)
Out[6]:
2
-a
────
___ 4
╲╱ π ⋅ℯ
对于数值积分,请尝试 scipy 包。
嗯,你的积分有一个解析解,你可以用 sympy 来计算它,正如@Bill 指出的,+1。
但是,我认为问题的重点是如何数值计算这个积分,这就是我在这里讨论的内容。
被积函数是偶数。我们将域减小到
[0,+inf]
,并将结果乘以 2
。
我们在无界域上仍然有一个振荡积分。这通常是一种令人讨厌的野兽,但我们知道它是收敛的,并且在
+- inf
处表现良好。换句话说,exp(-x**2)
足够快地衰减到零。
诀窍是更改积分变量
x=tan(t)
,以便dx=(1+x**2)dt
。域变为 [0,pi/2]
,它是有界的,数值积分就小菜一碟了。
以 scipy
中的辛普森
规则为例,使用
a=2
。只需 100
离散化点,我们就有 5
位数精度!
from scipy.integrate import simps
from numpy import seterr, pi, sqrt, linspace, tan, cos, exp
N = 100
a = 2.
t = linspace(0, pi / 2, N)
x = tan(t)
f = cos(a * x) * exp(-x ** 2) * (1 + x ** 2)
print "numerical solution = ", 2 * simps(f, t)
print "analytical solution = ",sqrt(pi) * exp(-a ** 2 / 4)