Matlab编程和模拟模型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Matlab 编程和模拟模型
1. 编程训练题目
一. 有一个向量()n a a a v ,,,21 =,编程求解下列式子: 2232121
1
21u n
i i i a a a s a s +++==∑=- , 其中u 为不超过n 的最大奇数。

自己给出测试例子,并给出运算结果。

二. 模拟一次扑克牌洗牌过程,输出牌的顺序。

%4*13+2
paihao=[11:23,31:43,51:63,71:83,98,99];
if length(paihao)~=54,
error('error in number')
end
PAIXU=randperm(54);
fapai = paihao(PAIXU)
三. 模拟1000次投币过程,输出出现正面的频率。

程序1:
num_zheng=0;
for i=1:1000,
cur=rand;
if cur<0.5,
num_zheng=num_zheng + 1;
end
end
f = num_zheng/1000
四.问题:现有一个文本文件(mydata.txt),包含了火车的出发和到
达时刻,基本格式如下(实际中该文件超过1000行)
19:35 07:47
19:14 07:12
19:21 07:19
18:53 08:23
19:07 07:05
19:00 06:58
21:37 08:04
20:40 07:40
21:44 07:22
21:30 07:25
19:28 06:48
22:00 07:10
19:21 07:19
18:53 08:23
19:07 07:05
……
要求把时间读取并存为矩阵数据,并且需要将其以0:00时刻记为初始时刻,把奇数行数据转为分钟。

准备知识:
(1)文件打开(fopen),关闭(fclose);
(2)读取各行数据(fgetl)
(3)解析各行数据,并转换数据
注:处理方法不唯一。

文本文件:fopen,fclose,fgetl。

%先初始化矩阵
mat=[];
row = 0;
fid=fopen('mydata.txt');
while 1
tline = fgetl(fid);
if feof(fid), break, end
disp(tline)
cur=str2num(tline);
row = row + 1;
%将当前行的(行)向量保存到mat中
if isempty(mat),
mat=cur;
else
len=length(cur);
mat(row,1:len)=cur;
end
end
fclose(fid);
19 35 7 47 8 31 9 42
19 14 7 12 0 0 0 0
19 21 7 19 0 0 0 0
18 53 8 23 0 0 0 0
19 7 7 5 0 0 0 0
19 0 6 58 0 0 0 0
21 37 8 4 0 0 0 0
20 40 7 40 0 0 0 0
21 44 7 22 0 0 0 0
21 30 7 25 0 0 0 0
19 28 6 48 0 0 0 0
五.(适中)有一个文件mytest.txt,内容如下:
请编程将这个文件中从第2行开始的所有数保存为1个列向量(按行先后顺序排列这些数)
程序
%先初始化矩阵
vec=[];
tline = fgetl(fid);%跳过第1行字符串,不处理
fid=fopen('mytest.txt');
while 1
tline = fgetl(fid);
if feof(fid), break, end
disp(tline)
cur=str2num(tline);
%将当前行的(行)向量保存到vec 中
vec=[vec,cur];
end
fclose(fid);
vec=vec'
%请将此文件中的数值读取为1个向量
1 4 7
2 5 8
3 6 9
vec =
1
4
7
2
5
8
3
6
9
六. (较难)有一个函数
235243211x x x x x x y ++++=,另有一个函数)(x f 定义如下。

5544332211)(x x y x x y x x y x x y x x y x f ∂∂+∂∂+∂∂+∂∂+∂∂=。

编写函数完成计算函数f(x)在任意点的函数值的功能。

1. 创建符号变量x ,编写符号表达式y ;
syms x1 x2 x3 x4 x5
e1=sqrt(x1*x2+x3+x4^2)/(x5+x3^2);
y=sqrt(1+e1);
2. 利用diff 计算偏导并创建f(x)的表达式
funx = diff(y,x1)*x1+ diff(y,x2)*x2+ diff(y,x3)*x3+ diff(y,x4)*x4+ diff(y,x5)*x5;
3. 复制funx 表达式文本,并粘贴到一个程序文件
4. 在命令行输入myfun(1:5)检查语法是否正确
%diff(exp,x) %exp 为符号表达式
2. 模拟模型案例:修理厂的模拟
某修理厂设有3个停车位置,其中一个位置供正在修理的汽车停放. 现以一
. 试问:该停车厂有无必要增加停车位置?并说明理由.
3. 已知非线性整数规划为:
5432125
242322212328 243Max x x x x x x x x x x z -----++++=
s.t. ⎪⎪⎪⎩⎪⎪⎪⎨⎧≤++≤++≤++++≤++++=≤≤200
520062*********)5,,1(990543321
5432154321x x x x x x x x x x x x x x x x i x i
对该题,目前尚无有效方法求出准确解。

如果用显枚举法试探,共需计算10510
)100(=个点,其计算量非常之大。

然而应用蒙特卡洛去随机计算610个点,便可找到满意解,那么
这种方法的可信度究竟怎样呢?
下面就分析随机取样采集6
10个点计算时,应用概率理论来估计一下可信度。

不失一般性,假定一个整数规划的最优点不是孤立的奇点。

假设目标函数落在高值区的概率分别为0.01,0.00001,则当计算610个点后,有任一个点能落在高值区的概率分别为
多位)100(9999.099.011000000 ≈-,
11000000≈
-。

999954602
.0
99999
.0
解(i)首先编写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(1)=sum(x)-400;
g(2)=x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800;
g(3)=2*x(1)+x(2)+6*x(3)-200;
g(4)=x(3)+x(4)+5*x(5)-200;
(ii)编写如下程序求问题的解:
rand('state',sum(clock));
p0=0;
tic
for i=1:10^5
x=99*rand(5,1);
x1=floor(x);x2=ceil(x);
[f,g]=mengte(x1);
if sum(g<=0)==4
if p0<=f
x0=x1;p0=f;
end
end
[f,g]=mengte(x2);
if sum(g<=0)==4
if p0<=f
x0=x2;p0=f;
end
end
end
x0,p0
toc。

相关文档
最新文档