Python 上的集成

问题描述 投票:0回答:3

嗨,我的讲师向我提出了一个问题,要求通过 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

不确定这是否正确。

python numerical-integration
3个回答
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 包。


1
投票

嗯,你的积分有一个解析解,你可以用 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)

0
投票

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

首先绘制函数

在开始之前知道答案也有帮助。

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

接下来您需要一个可以处理无穷远边界条件的积分方案。寻找对数求积方案。

天真的欧拉积分不会是我的第一个想法。

© www.soinside.com 2019 - 2024. All rights reserved.