2014-02-25 31 views
1

嗨,我的讲师给我一个问题,通过python集成了一个函数,他给我们提供的信息非常少。边界是正无穷和负无穷大且功能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 

不知道这是正确的。 亲切的问候

回答

1

那么,你的积分有一个解析解,你可以用sympy来计算它,正如@Bill指出的+1。

但是,我认为问题的关键是如何数值计算这个积分,这就是我在这里讨论的。

被积函数是偶数。我们将域名缩减为[0,+inf],并将乘以2的结果。

我们在无界域上仍然存在振荡积分。这通常是一个讨厌的野兽,但我们知道它是收敛的,并且在+- inf表现良好。换句话说,exp(-x**2)的衰减速度足够快。

诀窍是改变积分变量,x=tan(t),这样dx=(1+x**2)dt。域变成[0,pi/2],它是有界的,数值积分是小菜一碟。

示例与辛普森的rulescipy,与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) 
0

您的计算机将很难代表这些边界限制。

plotting your function开始。

在开始之前,它对know the answer也有帮助。

我建议把它分成两个积分:一个从负无穷到零,另一个从零到正无穷。正如下面的flebool所指出的,这是一个偶数函数。确保你知道这意味着什么以及对你的解决方案的影响。

接下来,您需要一个可以处理无限边界条件的集成方案。寻找一个对数正交方案。

天真的欧拉整合不会是我的第一个想法。

+0

该函数甚至是 – gg349

+0

True - 表示它是从0到无穷大的2 *积分。对你的数字解决方案很好,知道吗,你不同意吗? – duffymo

+1

这确实是点为 – gg349

2

我没有看到它建议多在这个网站,但你可以尝试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的包。

+2

+1为科学,但我怀疑讲师希望看到的第一原则适用... – Will