我正在尝试使用MATLAB和C#将书中的函数转换为代码。
我首先尝试让函数在MATLAB中正常工作。
以下是说明:
变量是:
xt and m can be ignored.
zMax = Maximum Sensor Range (100)
zkt = Sensor Measurement (49)
zkt* = What sensor measurement should have been (50)
oHit = Std Deviation of my measurement (5)
我在MATLAB中编写了第一个公式N(zkt; zkt *,oHit):
hitProbabilty = (1/sqrt( 2*pi * (oHit^2) ))...
* exp(-0.5 * (((zkt- zktStar) ^ 2) / (oHit^2)) );
这给了我期望的高斯曲线。
我在下面有一个定积分的问题,我不明白如何把它变成一个实数,因为我的代码得到了可怕的值,这就是:
func = @(x) hitProbabilty * zkt * x;
normaliser = quad(func, 0, max) ^ -1;
hitProbabilty = normaliser * hitProbabilty;
有人可以帮我解决这个问题吗?它应该标准化我的曲线,但它只是变得疯狂....(我正在为zkt 0:1:100做这个,其他一切都相同,并绘制它应该输出的概率。)
答案 0 :(得分:4)
您应该使用error function ERF(在基本MATLAB中提供)
<强> EDIT1:强>
如@Jim Brissom所述,累积分布函数(CDF)与误差函数有关:
normcdf(X) = (1 + erf(X/sqrt(2)) / 2 , where X~N(0,1)
请注意,NORMCDF需要统计工具箱
<强> EDIT2:强>
我认为看到评论时出现了一些小小的混淆..上面只计算了归一化因子,所以如果你想计算某个值范围内的最终概率,你应该这样做:
zMax = 100; %# Maximum Sensor Range
zktStar = 50; %# What sensor measurement should have been
oHit = 5; %# Std Deviation of my measurement
%# p(0<z<zMax) = p(z<zMax) - p(z<0)
ncdf = diff( normcdf([0 zMax], zktStar, oHit) );
normaliser = 1 ./ ncdf;
zkt = linspace(0,zMax,500); %# Sensor Measurement, 500 values in [0,zMax]
hitProbabilty = normpdf(zkt, zktStar, oHit) * normaliser;
plot(zkt, hitProbabilty)
xlabel('z^k_t'), ylabel('P_{hit}(z^k_t)'), title('Measurement Probability')
答案 1 :(得分:2)
代码中的N只是众所周知的高斯分布或正态分布。我之所以提到这一点,是因为你在Matlab中重新实现了它,看起来你错过了它,看看它是如何在Matlab中实现的。
对正态分布进行积分将产生累积分布函数,可在Matlab中通过normcdf
进行正态分布。 ncdf可以用erf
来编写,这可能是Amro所说的。
使用normcdf可以避免手动集成。
答案 2 :(得分:0)
如果你仍然需要积分的结果。
来自Mathematica。 Calc是
hitProbabilty[zkt_] := (1/Sqrt[2*Pi*oHit^2])*Exp[-0.5*(((zkt - zktStar)^2)/(oHit^2))];
Integrate[hitProbabilty[zkt], {zkt, 0, zMax}];
结果是(仅用于复制/粘贴)
((1.2533141373155001*oHit*zktStar*Erf[(0.7071067811865476*Sqrt[zktStar^2])/oHit])/
Sqrt[zktStar^2] +
(1.2533141373155001*oHit*(zMax-zktStar)*Erf[(0.7071067811865476*Sqrt[(zMax-zktStar)^2])/oHit])/
Sqrt[(zMax-zktStar)^2])/(2*oHit*Sqrt[2*Pi])
其中Erf []是错误函数
HTH!