开发者

Help understanding a definitive integral

开发者 https://www.devze.com 2023-01-14 16:48 出处:网络
I am trying to translate a function in a book into code, using MATLAB and C#. I am first trying to get the function to work properly in MATLAB.

I am trying to translate a function in a book into code, using MATLAB and C#.

I am first trying to get the function to work properly in MATLAB.

Here are the instructions:

Help understanding a definitive integral

The variables are:

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)

I have written the first formula, N(zkt;zkt*,oHit) in MATLAB as this:

h开发者_开发问答itProbabilty = (1/sqrt( 2*pi * (oHit^2) ))...
                * exp(-0.5 * (((zkt- zktStar) ^ 2) / (oHit^2))  );

This gives me the Gaussian curve I expect.

I have an issue with the definite integral below, I do not understand how to turn this into a real number, because I get horrible values out my code, which is this:

func = @(x) hitProbabilty * zkt * x;
normaliser = quad(func, 0, max) ^ -1;  
hitProbabilty = normaliser * hitProbabilty;

Can someone help me with this integral? It is supposed to normalize my curve, but it just goes crazy.... (I am doing this for zkt 0:1:100, with everything else the same, and graphing the probability it should output.)


You should use the error function ERF (available in basic MATLAB)


EDIT1:

As @Jim Brissom mentioned, the cumulative distribution function (CDF) is related to the error function by:

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

Note that NORMCDF requires the Statistics Toolbox


EDIT2:

I think there's been a small confusion seeing the comments.. The above only compute the normalizing factor, so if you want to compute the final probability over a certain range of values, you should do this:

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

Help understanding a definitive integral


The N in your code is just the well-known gaussian or normal distribution. I am mentioning this because since you re-implemented it in Matlab, it seems you missed that, seeing as how it is obviously already implemented in Matlab.

Integrating the normal distribution will yield a cumulative distribution function, available in Matlab for the normal distribution via normcdf. The ncdf can be written in terms of erf, which is probably what Amro was talking about.

Using normcdf avoids integrating manually.


In case you still need the result for the integral.

From Mathematica. The Calc is

hitProbabilty[zkt_] := (1/Sqrt[2*Pi*oHit^2])*Exp[-0.5*(((zkt - zktStar)^2)/(oHit^2))];
Integrate[hitProbabilty[zkt], {zkt, 0, zMax}]; 

The result is (just for copy/paste)

((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])

Where Erf[] is the error function

HTH!

0

精彩评论

暂无评论...
验证码 换一张
取 消