我已经接受过编码练习,以帮助我快速掌握MATLAB,但我在解决我需要的问题时遇到了一些问题。
我试图在给定的间隔(变量区间)上数值积分高斯概率函数。我试图通过使用梯形规则来做到这一点。我希望所有这些积分的总和接近于1,但是我在结果中得到的变小(例如,当我将变量bin设置为100时,达到0.5的值)。
我基本上做的是将x轴细分为" bins",并沿着箱内包含的点获取高斯PDF的积分。所以,例如,假设我的x轴从0到19.9运行,递增0.1,所以我有200"点"。现在,说我想要十个箱子。然后,每个bin将包含20个点,我需要在每个bin中的每个点之间执行整数近似。
现在,我到目前为止已经发生了以下情况;
clear
%Sets location of the Gaussian PDF
s_1 = 5;
s_2 = 15;
%Sets the domain of the x-axis
x = [0:0.1:19.9];
%Sets the number of bins, and the size of each bin
b = 100;
points = numel(x);
binsize = (points)/b;
%Arranges all of the prescribed x-values into their necessary bins
t = reshape(x,binsize,b);
%Calculates p(r_n|s_n)
for i = 1:b
r_s1(i) = trapz(t(:,i),normpdf(t(:,i),s_1));
r_s2(i) = trapz(t(:,i),normpdf(t(:,i),s_2));
end
现在,对于少量的二进制位(比如说10),近似得到很好的结果,并且r_s1和r_s2的元素之和都相对接近1(因为高斯PDF的积分应该是是1)。然而,当我开始增加我的箱子的大小时,这个总和的价值开始下降。考虑到所有事情,我预计它会保持在同一个值附近。
这是我在解决我所提出的问题的数学方法中的错误,还是我搞砸了我的代码?
答案 0 :(得分:1)
您正在使用的bins
不要对间隔[0, 19.9]
进行分区。
查看变量t
:
t =
0 0.2000 0.4000 0.6000 ...
0.1000 0.3000 0.5000 0.7000 ...
您看到第一个bin以0.1
结束,但第二个bin仅在0.2
处开始,所以在这种情况下,您只积累了超过一半的间隔,结果{{1} }。
更改代码最少的解决方案可能是添加
~0.5
在t = [x(1), t(end,1:end-1); t];
重塑一行之后。