使用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等)?请指教。谢谢。
答案 0 :(得分:1)
首先,使用random
看起来你走错了路。其次,你是正确的,因为Matlab的ProbDist
类的文档不是特别好,缺乏例子。
让我们使用与您使用的参数相匹配的这些参数(但是我不确定您的约束,a
和b
是否应该是概率,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 ProbDistUnivParam
和help 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
请注意,对于更复杂的发行版,您可能无法始终获得解决方案。此外,我在这里将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