1.蒙特卡洛方法
经典列题:π值计算
n=1000000;
a=rand(n,1);
b=rand(n,1);
c=find(a.^2+b.^2<=1);
d=length(c);
pi_value=d/n*4
2.重积分计算方法
解 随机模拟时首先要计算 Ω 的体积,设Ω的体积为 V,区域 Ω 上均匀分布的密度
函数为:
仿真一的程序如下
clc, clear
h=@(x,y,z) (x+y+z).^2; %定义被积函数
n=1000000; %生成随机数的个数
x=unifrnd(-1,1,[1,n]); %生成 n 个区间(-1,1)上均匀分布的随机数
y=unifrnd(-1,1,[1,n]);
z=unifrnd(0,sqrt(2),[1,n]);
f=sum(z>=x.^2+y.^2 & x.^2+y.^2+z.^2<=2); %计算落在区域 V 上的频数 V=f/n*4*sqrt(2) %计算体积 hh=h(x,y,z); %计算被积函数一系列的取值 jifen=V*sum(hh.*(z>=x.^2+y.^2 & x.^2+y.^2+z.^2<=2))/f
仿真二的程序如下
(为了说明和所取的积分区间的无关性)
clc, clear h=@(x,y,z) (x+y+z).^2; %定义被积函数
n=1000000; %生成随机数的个数
x=unifrnd(-sqrt(2),sqrt(2),[1,n]); %生成 n 个区间(-1,1)上均匀分布的随机数 y=unifrnd(-sqrt(2),sqrt(2),[1,n]);
z=unifrnd(-sqrt(2),sqrt(2),[1,n]);
f=sum(z>=x.^2+y.^2 & x.^2+y.^2+z.^2<=2); %计算落在区域 V 上的频数
V=f/n*16 * sqrt(2) %计算体积 hh=h(x,y,z); %计算被积函数一系列的取值 jifen=V*sum(hh.*(z>=x.^2+y.^2 & x.^2+y.^2+z.^2<=2))/f
3.非线性整数规划的随机模拟
例1:已知非线性整数规划为
(1)首先编写 M 文件 mente.m 定义目标函数 f 和约束向量函数 g,程序如下 function [f,g]=mengte(x); f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-8*x(1)-2*x(2)-3*x(3)-... x(4)-2*x(5);
g=[sum(x)-400 x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800 2*x(1)+x(2)+6*x(3)-200 x(3)+x(4)+5*x(5)-200];
(2)编写如下 Matlab 程序求问题的解。
rand('state',sum(clock)); %初始化随机数发生器
p0=0;
tic %计时开始
for i=1:10^6
x=randint(1,5,[1,99]); %产生一行五列的区间[1,99]上的随机整数
[f,g]=mengte(x);
if all(g<=0)
if p0<f
x0=x; p0=f; %记录下当前较好的解
end
end
end
x0, p0
toc %计时结束