我是靠谱客的博主 着急热狗,最近开发中收集的这篇文章主要介绍用Matlab产生服从任意分布的数据,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章仅为个人理解,如有不妥之处欢迎指正。

1、目的
matlab自带了很多产生特定分布的函数,但总归是有限的,学习了一下如何产生服从任意分布的数据,在此记录一下。

2、问题
以四自由度卡方( χ 2 chi^2 χ2)分布为例,其概率密度函数为 f ( x ) = 4 x h e x p [ − 2 x h ] f(x)=frac{4x}{h}exp[-frac{2x}{h}] f(x)=h4xexp[h2x] v a r ( x ) = h 2 / 2 var(x)=h^2/2 var(x)=h2/2 其中, h h h为待产生数据 x x x的均值。概率密度函数如下图,在这里插入图片描述
3、方法

舍选法:
①选定生成数据范围[ x m i n , x m a x x_{min},x_{max} xminxmax],并在此范围生成服从均匀分布数据 x x x
②生成服从均匀分布的数据 Y Y Y,范围建议[0,1]即可;
③若 Y < f ( x ) Y<f(x) Y<f(x),保留 x x x,否则舍去。保留的 x x x即为生成的数据。

其中前面两步都好理解,关键是第三步 Y < f ( x ) Y<f(x) Y<f(x)的如何理解?
我的理解是用Y对x进行甄选。看下面的图,红点代表 f ( x ) f(x) f(x),用均匀分布(假设范围[0,1])的数 Y Y Y f ( x ) f(x) f(x)比较, x x x f ( x ) f(x) f(x)的概率大于 Y Y Y,即绿色部分,然后保留符合 Y < f ( x ) Y<f(x) Y<f(x) x x x,对每个 x x x都这么操作,这样就能生成符合概率密度函数轮廓的数据。
在这里插入图片描述
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

最后

以上就是着急热狗为你收集整理的用Matlab产生服从任意分布的数据的全部内容,希望文章能够帮你解决用Matlab产生服从任意分布的数据所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部