0

使用 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)

基本上,我试图在 .3 和 .6 的相应 X 值之间集成 c_pd(通过使用 icdf 找到)。但是, c_pd 是一个向量,而不是实际的 cdf 函数。无论分布类型如何(即 Normal、Rician 等),有没有人知道如何找到积分?请指教。谢谢你。

4

1 回答 1

1

首先,看起来您使用random. 其次,您是正确的,因为 MatlabProbDist类的文档不是特别好并且缺少示例。

让我们使用与您使用的参数相匹配的这些参数(但是我不确定您是否有界限,ab,是否意味着概率,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 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

请注意,对于更复杂的分布,您可能并不总是能够获得解决方案。另外,我在这里留下了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
于 2013-06-08T21:12:17.520 回答