python - 计算积分的有效方法?

标签 python python-2.7 numpy integral

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

例如集成 e**-x**2 > y 我可以像这样使用蒙特卡洛方法:

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,我想创建一个函数,那么我认为上面的方法不是真的高效,至少我是这么认为的。

所以,我的问题是,我能否将一个连续函数(例如 cos(x)/x)集成到一个函数中,例如 [a,b]梯形规则?

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

欢迎大家提出建议。

最佳答案

只需使用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 )。

关于python - 计算积分的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50395475/

相关文章:

Python 本地更新不起作用

python - 数据帧非零列的平均值和标准差

python - linux : during downloading anaconda jupyter i got these errors

python - Pandas 以某种模式向前提供日间范围而不是向后

numpy - 分两步训练数据,精度相同吗?

python - 依赖于 numpy 中 2 个数组的函数的矢量化

python - 使用枕头时出错 : ImportError: cannot import name _imaging

python - 从 HTML 中提取标签之间的特定文本部分

python - 从父级获取变量

python - Pandas 。按索引分组并为列应用最大值