计算积分的有效方法?

时间:2018-05-17 15:38:55

标签: python python-2.7 numpy integral

我知道如何使用Monte-Carlo来计算积分,但我想知道是否可以使用梯形法则结合numpy来获得相同积分的效率,我不确定哪一个是最快的或者后者可能吗?

例如整合e**-x**2 > y我可以像这样使用monte-carlo方法:

import numpy as np
import matplotlib.pyplot as plt

X = np.random.rand(500000,2)
X[:,0] = X[:,0]*4-2
J = np.where(X[:,1] < np.exp(-X[:,0]**2))[0]
Xp = X[:2000]
Ip = [i for i in range(len(Xp)) if i in J]
Inp = [i for i in range(len(Xp)) if i not in J]
plt.plot(Xp[Ip,0],Xp[Ip,1], 'bd', Xp[Inp,0],Xp[Inp,1], 'rd')
plt.show()

这很容易计算出来:

print len(J) / 500000.0 * 4

给出了:

1.767784

在这种情况下很简单,但是如果没有像[a,b] , n那样指定间隔,并且我想创建一个函数,那么我认为上面的方法效率不高,至少我是这么认为的。< / p>

所以,我的问题是我可以在具有梯形规则的函数中将像cos(x)/x这样的连续函数集成到[a,b]这样的确定区间吗?

它比我在这里使用的方法更好吗?

欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

只需使用scipy.integrate.quad

from scipy import integrate
from np import inf
from math import exp, sqrt, pi

res, errEstimate = integrate.quad(lambda x: exp(-x**2), -inf, +inf)

print(res)       #output: 1.7724538509055159
print(sqrt(pi))  #output: 1.7724538509055159

最后一行只是检查评估的积分是否确实是Pi的平方根(它是Gaussian integral)。

答案 1 :(得分:0)

您还可以使用黎曼近似。下面的代码是用Java

class MyClass {
    static pacman; // undefined
    pacman = this.pacman; // undefined
    this.pacman = pacman; // Syntax error: unexpected token .
    pacman = this.pacman.bind(this); // Cannot read property 'bind' of undefined
}
...
const myInstance = new MyClass({food:'........'});

在上一类中,它将计算从-infinity到Infinity的高斯积分,等于PI的平方根(1.772)