Во-первых, похоже, что вы ошиблись при использовании 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