我想为密度函数的卷积编写一个 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 的第一个输入不是双精度类型。如果您能帮助我解决此问题,我将不胜感激。
我还想找到超过 3 个随机变量之和的 PDF,但我不知道如何编写算法。多谢!
执行卷积的一种方法如下:
首先定义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
符号 btw 进行矢量化。
然后按如下方式定义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
等的定义。
您可以将数字转换为双精度,如下所示:
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);
如果您愿意,可以对所有输入执行此操作。