Используя 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. Кто-нибудь есть идеи о том, как я могу найти интеграл от этого независимо от типа распределения (например, нормальный, рик и т. Д.)? Пожалуйста, порекомендуйте. Спасибо.

1 ответ

Решение

Во-первых, похоже, что вы не на том шаге, используя random, Во-вторых, вы правы в том, что документация для Matlab's 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
Другие вопросы по тегам