matlab集训五

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 %计时结束 

猜你喜欢

转载自blog.csdn.net/weixin_42578658/article/details/89817087