Python 3.4 scipy integrate.quad 下降
Python 3.4 scipy integrate.quad dropoff
我正在尝试计算 python 中的高斯积分,如下所示:
from math import exp
from scipy import stats, integrate
import scipy.interpolate as interpolate
from numpy import cumsum, random, histogram, linspace, zeros, inf, pi,sqrt
import matplotlib.pyplot as plt
A = 1
mu = 0
sigma = 1
p = lambda x: A * exp(-(((x-mu)**2))/(2*(sigma**2)))
F = lambda x: integrate.quad(p, -inf, x)[0]
Ns = 1000;
x = linspace(-50,50,Ns);
y = zeros(Ns)
yy = zeros(Ns)
for i in range(Ns):
y[i] = F(x[i])
yy[i]= p(x[i])
plt.plot(x,y)
plt.plot(x,yy)
plt.show()
但如果看图,在 21.0 到 22 之间和 38+ 之后会下降到零。
有谁知道为什么要这样做?可能有舍入误差?
谢谢!!
我认为理解这个问题的关键是回忆一下数值积分方法计算特定节点处函数值的加权和。
当您偏离均值时,高斯分布会迅速变为零,因此基本上在 (-50, 50) 之间的区间内,大多数函数值都为零。如果积分方法无法从函数非零的小区域采样点,它将把整个函数视为完全平坦的,从而得到积分 0。
那你能做什么?
不要选择 (-50,50) 的固定区间,而是选择基于较小 sigma 值的区间,以避免在过大的零区间上积分。
如果您只向左和向右移动 5、10 或 20 个标准差,您将不会看到此问题,并且您仍然可以获得非常准确的积分结果。
这是从 10 个标准差向左和向右积分的结果。
我正在尝试计算 python 中的高斯积分,如下所示:
from math import exp
from scipy import stats, integrate
import scipy.interpolate as interpolate
from numpy import cumsum, random, histogram, linspace, zeros, inf, pi,sqrt
import matplotlib.pyplot as plt
A = 1
mu = 0
sigma = 1
p = lambda x: A * exp(-(((x-mu)**2))/(2*(sigma**2)))
F = lambda x: integrate.quad(p, -inf, x)[0]
Ns = 1000;
x = linspace(-50,50,Ns);
y = zeros(Ns)
yy = zeros(Ns)
for i in range(Ns):
y[i] = F(x[i])
yy[i]= p(x[i])
plt.plot(x,y)
plt.plot(x,yy)
plt.show()
但如果看图,在 21.0 到 22 之间和 38+ 之后会下降到零。 有谁知道为什么要这样做?可能有舍入误差?
谢谢!!
我认为理解这个问题的关键是回忆一下数值积分方法计算特定节点处函数值的加权和。
当您偏离均值时,高斯分布会迅速变为零,因此基本上在 (-50, 50) 之间的区间内,大多数函数值都为零。如果积分方法无法从函数非零的小区域采样点,它将把整个函数视为完全平坦的,从而得到积分 0。
那你能做什么?
不要选择 (-50,50) 的固定区间,而是选择基于较小 sigma 值的区间,以避免在过大的零区间上积分。
如果您只向左和向右移动 5、10 或 20 个标准差,您将不会看到此问题,并且您仍然可以获得非常准确的积分结果。
这是从 10 个标准差向左和向右积分的结果。