需要帮助编写独立随机变量之和的 Matlab 代码

问题描述 投票:0回答:2

我想为密度函数卷积编写一个 MATLAB 代码。

对于随机变量 X(PDF f_x)和 Y(PDF f_y),它们总和的 PDF X+Y,可以通过以下 MATLAB 代码获得:

function p=sumX_Y(z,mean1,sigma1,mean2,sigma2)
G = @(y)f_x(mean1,sigma1,z-y).*f_y(mean2,sigma2,y);p= integral(G,-Inf,Inf);

现在对于三个随机变量 X+Y+Z 的求和应该是

function p=sumX_Y_Z(z,mean1,sigma1,mean2,sigma2,mean3,sigma3)
    G = @(y)sumX_Y(z-y,mean1,sigma1,mean2,sigma2).*f_z(mean3,sigma3,y);p= integral(G,-Inf,Inf);

但是它不起作用,因为函数 sumX_Y 的第一个输入不是 double 类型。如果您能帮助我解决这个问题,我将不胜感激。

我也想找到超过3个随机变量之和的PDF,但我不知道如何编写算法。非常感谢!

matlab parameters numerical-integration
2个回答
2
投票

执行卷积的一种方法如下:

首先定义

sumX_Y

function p=sumX_Y(z,mean1,sigma1,mean2,sigma2)

f_x = @(x) normpdf(x,mean1,sigma1);
f_y = @(x) normpdf(x,mean2,sigma2);


for ii=1:length(z)

    G = @(y)f_x(z(ii)-y).*f_y(y);
    p(ii)= quad8(G, ...
                 min([mean1,mean2])-3*max([sigma1,sigma2])  ,...
                 max([mean1,mean2])+3*max([sigma1,sigma2])    );
end

上面函数中的循环可以使用

bsxfun
符号进行矢量化。

然后定义

sumX_Y_Z
如下:

function p=sumX_Y_Z(z,mean1,sigma1,mean2,sigma2,mean3,sigma3)

f_z = @(x) normpdf(x,mean3,sigma3);
G = @(y)sumX_Y(z-y,mean1,sigma1,mean2,sigma2).*f_z(y);

p= quad8(G,min([mean1,mean2,mean3])-3*max([sigma1,sigma2,sigma3]),...
           max([mean1,mean2,mean3])+3*max([sigma1,sigma2,sigma3]));

整个事情可以这样称呼:

mean1=1;
sigma1=0.3;
mean2=2;
sigma2=1;
mean3=0;
sigma3=1;

X = 1.4; % <-- value at which to evaluate p

p=sumX_Y(X,mean1,sigma1,mean2,sigma2)
p=sumX_Y_Z(X,mean1,sigma1,mean2,sigma2,mean3,sigma3)

输出:

p =

    0.1181


p =

    0.1494

您可以修改函数以使用

integral
代替“quad8”,当然也可以替换您对
f_z
等的定义。


0
投票

您可以将数字转换为双精度数,如下所示:

numberAsDouble = double(number);

因此,要么在调用

sumX_Y
之前转换数字,要么强制在函数本身中进行转换:

function p=sumX_Y(z,mean1,sigma1,mean2,sigma2)
  G = @(y)f_x(mean1,sigma1,double(z)-y).*f_y(mean2,sigma2,y);p= integral(G,-Inf,Inf);

如果您愿意,您可以对所有输入执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.