Используя MATLAB, как я могу найти интеграл от ограниченной функции CDF?

Используя MATLAB, я пытаюсь найти интеграл ограниченного диапазона CDF. См. Следующий код:

u = 1;
s = 1;
X = random('Normal',u,s,1,10000);
pd = makedist('Normal','mu',u,'sigma',s);
xAxis = min(X):.0001:max(X);
c_pd = cdf(pd,xAxis);
r = icdf(pd,[.3,.6]);
plot(xAxis,c_pd)

По сути, я пытаюсь интегрировать c_pd между соответствующими значениями X для .3 и .6 (найденных с помощью icdf). Однако c_pd - это вектор, а не фактическая функция cdf. Есть ли у кого-нибудь идеи о том, как я могу найти интеграл этого независимо от типа распределения (например, нормального, рицианского и т. Д.)? Пожалуйста, порекомендуйте. Спасибо.


person enter_display_name_here    schedule 07.06.2013    source источник
comment
Я думаю, вам нужна функция quad в Matlab. Есть несколько похожих функций, которые также выполняют различные типы приближений численного интегрирования.   -  person Suedocode    schedule 07.06.2013
comment
Вам нужны числовые результаты (с плавающей запятой) или символьные (уравнения, формулы)?   -  person horchler    schedule 07.06.2013
comment
На самом деле оба. Я прочитал документы MATLAB, но обнаружил, что сильно запутался. Есть ли у вас предложения?   -  person enter_display_name_here    schedule 07.06.2013


Ответы (1)


Во-первых, похоже, что вы ошиблись при использовании random. Во-вторых, вы правы в том, что документация для классов Matlab ProbDist не очень хороша и в ней отсутствуют примеры.

Давайте использовать эти параметры, которые соответствуют тем, которые вы использовали (однако я не уверен, что ваши границы, a и b, должны быть вероятностями, P(X), -вы хотите интегрировать по диапазону вероятностей? -В в этом случае вы действительно хотите использовать обратный CDF):

mu = 1; sig = 1;
a = 0.3; b = 0.6;

У вас есть несколько вариантов в зависимости от того, что вам нужно. Скорее всего, будет проще использовать функцию integral для выполнения численного интегрирования. (квадратурная). Сначала вы можете самостоятельно реализовать CDF:

normalCDF = @(t,mu,sig)(1+erf((t-mu)./(sqrt(2)*sig)))/2;
q = integral(@(t)normalCDF(t,mu,sig),a,b)

Или используйте одну из функций cdf старого стиля, в этом случае normcdf:

q = integral(@(t)normcdf(t,mu,sig),a,b)

Или используйте общую функцию cdf (введите help cdf, чтобы увидеть список всех поддерживаемые дистрибутивы для CDF старого стиля):

q = integral(@(t)cdf('norm',t,mu,sig),a,b)

Или используйте один из новых методов класса ProbDistUnivParam:

normalPD = ProbDistUnivParam('normal',[mu sig]);
q = integral(@(t)normalPD.cdf(t),a,b)

См. здесь для получения списка дистрибутивов, поддерживаемых этим новым классом. Обратите внимание, что .cdf(t) не следует путать с функцией cdf, используемой просто выше. Это метод класса ProbDistUnivParam. Введите help ProbDistUnivParam и help ProbDistUnivParam/cdf.

Если вы хотите попытаться найти символические решения, вам, вероятно, придется самостоятельно реализовать функции CDF. Большинство функций Matlab высокого уровня поддерживают вычисления с плавающей запятой, только если они не являются частью Symbolic Toolbox. Вот как вы можете решить эти проблемы символически, используя int:

syms t MU SIG A B real
normalCDFsym = (1+erf((t-MU)./(sqrt(2)*SIG)))/2;
qsym = simplify(int(normalCDFsym,t,A,B)); % Solve integral symbolically
pretty(qsym)                              % Print out result
q = subs(qsym,{MU,SIG,A,B},{mu,sig,a,b})  % Plug in numeric values

Обратите внимание, что для более сложных дистрибутивов вы не всегда сможете найти решение. Кроме того, здесь я оставил MU, SIG, A и B как символические. В некоторых случаях вы не сможете получить решение со всеми символьными параметрами, поэтому вы можете попробовать разрешить некоторым из них быть явными значениями, если вы знаете, что это за значения, например:

syms t MU A real
normalCDFsym = (1+erf((t-MU)./(sqrt(2)*sym(1))))/2;
qsym = simplify(int(normalCDFsym,t,A,sym(0.6))); % Solve integral symbolically
pretty(qsym)                                     % Print out result
q = subs(qsym,{MU,A},{mu,a})                     % Plug in numeric values
person horchler    schedule 08.06.2013
comment
О, большое спасибо за вашу помощь! Я был очень запутан тем, как это реализовать, но вся ваша информация определенно помогает в решении моей проблемы. Я очень ценю это. Спасибо! - person enter_display_name_here; 12.06.2013