用Matlab產生服從任意分佈的數據

文章僅爲個人理解,如有不妥之處歡迎指正。

1、目的
matlab自帶了很多產生特定分佈的函數,但總歸是有限的,學習了一下如何產生服從任意分佈的數據,在此記錄一下。

2、問題
以四自由度卡方(χ2\chi^2)分佈爲例,其概率密度函數爲f(x)=4xhexp[2xh]f(x)=\frac{4x}{h}exp[-\frac{2x}{h}] var(x)=h2/2var(x)=h^2/2 其中,hh爲待產生數據xx的均值。概率密度函數如下圖,在這裏插入圖片描述
3、方法

舍選法:
①選定生成數據範圍[xminxmaxx_{min},x_{max}],並在此範圍生成服從均勻分佈數據xx
②生成服從均勻分佈的數據YY,範圍建議[0,1]即可;
③若Y<f(x)Y<f(x),保留xx,否則捨去。保留的xx即爲生成的數據。

其中前面兩步都好理解,關鍵是第三步Y<f(x)Y<f(x)的如何理解?
我的理解是用Y對x進行甄選。看下面的圖,紅點代表f(x)f(x),用均勻分佈(假設範圍[0,1])的數YYf(x)f(x)比較,xxf(x)f(x)的概率大於YY,即綠色部分,然後保留符合Y<f(x)Y<f(x)xx,對每個xx都這麼操作,這樣就能生成符合概率密度函數輪廓的數據。
在這裏插入圖片描述
4、結果
在這裏插入圖片描述

clear
xmin = 0;
xmax = 40;
num=5000;  %數據數量
n=1;    
h=1;    %均值

data=zeros(1,num);
y = @(x,h)(4*x/h).*exp(-2*x/h);
while n<num
    x = (xmax-xmin)*rand(1)-xmin;
    fx=y(x,h);
    Y = rand(1);
    if Y<=fx
        data(1,n)=x;
        n=n+1;
    end
end
subplot(211);
stem(data,'filled');title('生成結果')
subplot(212);hist(data,100);
hold on
t=0:0.01:5;
plot(t,y(t,h)*300,'r','LineWidth',2);xlabel('x');title('四自由度卡方分佈')

若要產生其他分佈的數據,修改匿名函數就可以了。

參考:

https://www.cnblogs.com/xingshansi/p/6539319.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章