Используя 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