Помогите понять окончательный интеграл - PullRequest
1 голос
/ 05 сентября 2010

Я пытаюсь перевести функцию из книги в код, используя MATLAB и C #.

Сначала я пытаюсь заставить функцию работать должным образом в MATLAB.

Вот инструкции:

alt text

Переменные:

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)

Я написал первую формулу N (zkt; zkt *, oHit) в MATLAB следующим образом:

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, со всем остальным так же, и строю график вероятности, которую он должен вывести.)

Ответы [ 3 ]

4 голосов
/ 05 сентября 2010

Вы должны использовать функцию ошибки ERF (доступно в базовой MATLAB)


EDIT1:

Как упоминалось @ Джим Бриссом , накопительная функция распределения (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')

alt text

2 голосов
/ 05 сентября 2010

N в вашем коде - это просто хорошо известное гауссовское или нормальное распределение.Я упоминаю об этом, потому что, поскольку вы повторно реализовали его в Matlab, кажется, вы упустили это, видя, как это, очевидно, уже реализовано в Matlab.Matlab для нормального распределения через normcdf.Ncdf можно записать в терминах erf, о чем, вероятно, говорил Amro.

Использование normcdf позволяет избежать интеграции вручную.

0 голосов
/ 05 сентября 2010

В случае, если вам все еще нужен результат для интеграла.

От 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 [] - функция ошибки

НТН!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...