使用MATLAB,如何找到有界CDF的积分?

时间:2013-06-07 14:28:59

标签: matlab probability integral 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集成在.3和.6的相应X值之间(通过使用icdf找到)。但是,c_pd是一个向量而不是实际的cdf函数。有没有人有关于如何找到这个积分的想法,无论分布类型如何(正常,Rician等)?请指教。谢谢。

1 个答案:

答案 0 :(得分:1)

首先,使用random看起来你走错了路。其次,你是正确的,因为Matlab的ProbDist类的文档不是特别好,缺乏例子。

让我们使用与您使用的参数相匹配的这些参数(但是我不确定您的约束,ab是否应该是概率,P(X) , - 你想要整合一系列概率吗? - 在这种情况下,你实际上想要使用逆CDF):

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

根据您的需要,您有多种选择。使用integral函数执行数值积分(quadrature)可能最简单。首先,你可以implement the CDF yourself

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)

有关此新类支持的分发列表,请参阅here。请注意,.cdf(t)不要与上面使用的cdf函数混淆。这是ProbDistUnivParam类的方法。输入help ProbDistUnivParamhelp ProbDistUnivParam/cdf

如果您想尝试解决符号解决方案,那么您可能需要自己实现CDF功能。大多数高级Matlab函数仅支持浮点计算,除非它们是符号工具箱的一部分。以下是使用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

请注意,对于更复杂的发行版,您可能无法始终获得解决方案。此外,我在这里将MUSIGAB全部作为符号。在某些情况下,您可能无法获得具有所有符号参数的解决方案,因此如果您知道这些值是什么,您可以尝试让它们中的一些成为显式值,例如:

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