计算两个三角形随机变量的总和(Matlab)

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

我想计算两个三角形随机变量的和,

P(x1 + x2

“

在Matlab中有没有更快的方法来实现两个三角形随机变量之和?

编辑:似乎有一种更简单的方法,如此minitab演示所示。因此,这并非不可能。遗憾的是,它没有解释PDF的计算方式。仍在研究如何在matlab中做到这一点。

EDIT2:遵循建议,我在Matlab中使用conv函数来开发两个随机变量之和的PDF:

clear all;
clc;


pd1 = makedist('Triangular','a',85,'b',90,'c',100);
pd2 = makedist('Triangular','a',90,'b',100,'c',110);

x = linspace(85,290,200);
x1 = linspace(85,100,200);
x2 = linspace(90,110,200);
pdf1 = pdf(pd1,x1);
pdf2 = pdf(pd2,x2);

z = median(diff(x))*conv(pdf1,pdf2,'same');

p1  = trapz(x1,pdf1) %probability P(x1<y)
p2  = trapz(x2,pdf2) %probability P(x2<y)
p12 = trapz(x,z)     %probability P(x1+x2 <y)

hold on;
plot(x1,pdf1) %plot pdf of dist. x1
plot(x2,pdf2) %plot pdf of dist. x2
plot(x,z)     %plot pdf of x1+x2
hold off;

但是此代码有两个问题:

  1. X1 + X2的PDF集成度远远高于1。
  2. X1 + X2的PDF随x的范围而变化很大。直观地,如果X1 + X2大于210(两个单独的三角分布的上限“ c”之和100 + 110),P(X1 + X2 <210)是否不等于1?另外,由于下限“ a”是85和90,因此P(X1 + X2 <85)= 0?

matlab statistics probability convolution probability-distribution
2个回答
1
投票

自变量之和的pdf是变量pdf的卷积。因此,您需要使用三角pdf来计算两个变量的卷积。三角形是分段线性的,因此卷积将是分段二次的。

有几种解决方法。如果数值结果是可接受的:离散化pdf并计算离散化pdf的卷积。我相信在Matlab中有一个函数conv。如果没有,则可以进行快速傅立叶变换(通过fft),逐点计算乘积,然后进行逆变换(如果我没有记错的话,请进行ifft),因为fft(convolution(f,g))= fft (f)fft(g)。如果使用convfft,则需要注意标准化。

如果必须得到精确的结果,则卷积只是一个整数,如果您对积分的限制非常小心,则可以手动进行计算。我不知道您是否可以使用Matlab符号工具箱,如果可以,我也不知道它是否可以处理分段定义的函数的积分。


1
投票

以下是将来用户的正确实现。非常感谢Robert Dodier的指导。

clear all;
clc;

min1 = 85;
max1 = 100;
min2 = 90;
max2 = 110;
y    = 210;

pd1 = makedist('Triangular','a',min1,'b',90,'c',max1);
pd2 = makedist('Triangular','a',min2,'b',100,'c',max2);

dx = 0.01; % to ensure constant spacing
x1 = min1:dx:max1; % Could include some of the region where
x2 = min2:dx:max2; % the pdf is 0, but we don't have to.

x12 = linspace(...
    x1(1)   + x2(1) , ...
    x1(end) + x2(end) , ...
    length(x1)+length(x2)-1);
[c,index] = min(abs(x12-y));
x_short = linspace(min1+min2,x12(index),index);

pdf1 = pdf(pd1,x1);
pdf2 = pdf(pd2,x2);
pdf12 = conv(pdf1,pdf2)*dx;

zz = pdf12(1:index);
zz(index) = 0;

p1  = trapz(x1,pdf1)
p2  = trapz(x2,pdf2)
p12 = trapz(x_short,zz)

plot(x1,pdf1,x2,pdf2,x12,pdf12)
hold on;
fill(x_short,zz,'blue')     % plot x1+x2
hold off;
© www.soinside.com 2019 - 2024. All rights reserved.