【问题标题】:Help understanding a definitive integral帮助理解定积分
【发布时间】:2010-09-06 00:40:43
【问题描述】:

我正在尝试使用 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 这样做,其他一切都相同,并绘制它应该输出的概率。)

【问题讨论】:

    标签: math matlab


    【解决方案1】:

    您应该使用 error function ERF(在基本 MATLAB 中可用)


    EDIT1:

    正如@Jim Brissom 提到的,累积分布函数(CDF)与误差函数的关系是:

    normcdf(X) = (1 + erf(X/sqrt(2)) / 2 ,   where X~N(0,1)
    

    注意NORMCDF 需要统计工具箱


    EDIT2:

    我认为看到 cmets 时会有一点困惑。上面只计算归一化因子,所以如果你想计算某个值范围内的最终概率,你应该这样做:

    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')
    

    【讨论】:

    • 抱歉,我应该用错误函数替换我的代码的哪一部分?你的意思是不是计算规范化器?
    • 我是否应该等到计算完所有 hitProbabilities,然后在该数组上执行 ERF?那么我是否将原始数组乘以 ERF 的输出?
    • n = 1 ./ (normcdf((zMax-zktStar)/oHit) - 0.5);总是给我值 2,对于所有值,0-100? erf() 总是给我 2?
    • 不是真的,试试:plot( 1 ./ (normcdf(([0:zMax]-zktStar)/oHit) - 0.5) ),你会看到一条曲线(Inf 在中间,因为我们除以零!)
    • 它给了我一个非常奇怪的图形,就像一个向上的 L,但同时水平和垂直镜像。
    【解决方案2】:

    代码中的 N 就是众所周知的高斯或正态分布。我之所以提到这一点,是因为您在 Matlab 中重新实现了它,您似乎错过了这一点,因为它显然已经在 Matlab 中实现了。

    积分正态分布将产生一个累积分布函数,可在 Matlab 中通过normcdf 获得正态分布。 ncdf可以写成erf,这大概就是Amro所说的吧。

    使用 normcdf 避免手动集成。

    【讨论】:

    • 我明白了,所以在我的 100 个值的循环中,我应该在数组上使用,这给了我另一个数组。文章将法线乘以值,我应该这样做,还是功能为我做这个? ——你的意思是我也可以重写我的高斯函数吗?我该怎么做呢?我不是真正的数学导向,只是迫不得已,原谅我的无知。
    • 你不需要实现正态分布,至少在 Matlab 中是这样。但是,您必须在 C# 中执行此操作(除非您使用库,但这是另一回事)。至于归一化:一个累积分布函数 f(x) 表示一个随机变量位于区间 (-inf, x] 的概率,这与说随机变量小于或等于 x 基本相同。 normalcdf 已经包括积分部分,但不包括幂减一部分。这部分可能是指百分比点函数,它只是 cdf 的倒数。
    • 我想我明白了,所以我可以将我的代码替换为:measurements = 0:1:100;实际距离 = 50; o命中 = 50; hitProbabilities = normpdf(测量值,实际距离,oHit); normalizedProbabilities = edf(hitProbabilities);绘图(测量值,归一化概率,测量值,归一化概率);
    • 感谢指出指令中的高斯函数是标准的高斯函数,所以我不必在MATLAB和C#中重新编写!
    【解决方案3】:

    如果您仍然需要积分的结果。

    来自 Mathematica。计算是

    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!

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      相关资源
      最近更新 更多