matlab随机模拟,各种概率论中的离,连续的函数 典型分布函数 以及利用随机模拟的方法进行积分运算,随机打乱数组,蒙特卡洛方法
1.
(1)随机数的产生
A=rand(m,n); %生成m´n随机数矩阵,每个元素的选
取服从[0,1]上的平均分布
B=randn(m,n); %生成m´n随机数矩阵,每个元素的选
取服从标准正态分布
C=randi(nmax,m,n); %生成m´n随机数矩阵,每个元素是1和
nmax之间的随机选取的正整数
D=randi([a,b],m,n); %m´n随机数矩阵,每个元素是[a,b]
上的随机选取的正整数
- 一般的随机数产生函数 random
函数使用方法
y=random(‘name’,A,m,n) %单参数分布的随机数数组产生
y=random(‘name’,A,B,m,n) %双参数分布的随机数数组产生
常用的几种分布的随机数产生
分 布 |
name |
参数A |
参数B |
正态分布 |
Norm 或normal |
mu |
sdeta |
泊松分布 |
Poiss或poisson |
llanbuda |
|
连续均匀分布 |
unif |
a |
b |
离散均匀分布 |
unid |
N |
|
t分布 |
t |
n(自由度个数) |
|
c2分布 |
chi2 |
n(自由度个数) |
|
F分布 |
F |
n1(自由度个数)
|
n2(分母自由度个数) |
- 验证随机性
s=zeros(1,10);
for k=1:100000
s=s+rand(1,10);
end
s/100000
结果:ans =
0.5002 0.5003 0.4993 0.4988 0.4999 0.4990 0.5005 0.4991 0.4999 0.4995
- 随机模拟求解问题:
(1)例4:求圆的面积
x=rand(10000,10000);
y=rand(10000,10000);
z=x.^2+y.^2;
m=find(z<=1);
s=4*length(m)/(10000*10000)*1 (后面这个1是矩形面积)
10000*10000个x和y然后符合条件的数目除以总数目
都是[0,1]上的点所以要乘4
这是半径为1的圆的面积
半径为3的此时就要用到
D=randi([a,b],m,n);
此时要乘的矩形面积为9
x=random('unif',0,3,10000,10000);
>> y=random('unif',0,3,10000,10000);
>> n=find(x.^2+y.^2<=9);
>> s=4*length(n)/(10000*10000)*9
(2)例5:利用蒙特卡洛方法计算积分
考虑二重积分
图片放不出来臆测吧
设 WÍ[a,b]´[c,d],0£f(x,y)£M
在区域[a,b]´[c,d]´[0,M]上选取N个随机数,如果落在区域
0=<z<=f(x,y) (x,y)ÎW
中的点数为S,则
图片放不出来臆测吧
二重积分几何意义f(x,y)是一个高度信息只要我的随机点的代入高度函数后小于等于标准就在他之内就可以算体积占比再乘以总体积即可求出大致积分值,一开始就是算一个比例一般就选[0,1]
例
x=rand(1,1000000);
y=rand(1,1000000);
z=rand(1,1000000);
idx1=find(x.^2+y.^2<1);
idx2=find(z(idx1)<=sqrt(1- …
x(idx1).^2-y(idx1).^2));
V=4*length(idx2)/length(idx1)*pi/4;
disp(V);
% avoid cplx number calculation.
4.向量的随机打乱
S=randperm(n) %把1至n这n个数随机打乱次序得到的序列
练习:将向量
x=[1 3 6 4 7 10 2 4 3 6 40 12 2 2 7 3 7 12 13 15 8 7 6 12 2 2 4 6 3 1 ]
随机打乱
例
x=[1 2 3;4 5 6 ];
%i的末端为行数
for i=1:2
a=randperm(length(x));
x(i,:)=x(i,a);
disp(x);
end