数学建模 实验一.docx
《数学建模 实验一.docx》由会员分享,可在线阅读,更多相关《数学建模 实验一.docx(21页珍藏版)》请在冰点文库上搜索。
数学建模实验一
实验01建立数学模型(4学时)
(第1章建立数学模型)
教材中给出原始数据,结合模型,得到结果。
但如何求得结果这一过程没有给出,实际上要用MATLAB软件编写程序来求得,这应该交给实验课来完成。
考虑到上学期同学们刚学习MATLAB语言,编程能力不强,所以有关的程序给出来供同学们进行验证。
要求同学们要读懂程序。
1.(求解,编程)如何施救药物中毒p10~11
人体胃肠道和血液系统中的药量随时间变化的规律(模型):
其中,x(t)为t时刻胃肠道中的药量,y(t)为t时刻血液系统中的药量,t=0为服药时刻。
1.1(求解)模型求解p10~11
①用MATLAB求解微分方程函数dsolve求解该微分方程(符号运算)。
②用MATLAB的化简函数simplify化简所得结果。
③结果与教材P11上的内容比较。
提示:
dsolve和simplify的用法可用help查询。
建议在命令窗口中操作。
★求解的语句及运行结果。
1.2(编程)结果分析p11
已知λ=0.1386,μ=0.1155,将上题中得到x(t)和y(t)两条曲线画在同一个图形窗口内。
图形如P11中的图1。
提示:
MATLAB命令plot,fplot,holdon/off,gridon/off,xlabel,ylabel,text。
★编写的程序。
★运行结果。
2.(编程,验证)商人们怎样安全过河p8~9
三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行。
随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货。
但是如何乘船的大权掌握在商人们手中。
商人们怎样才能安全渡河呢?
[模型构成]
决策:
每一步(此岸到彼岸或彼岸到此岸)船上的人员。
要求:
在安全的前提下(两岸的随从数不比商人多),经有限步使全体人员过河。
xk第k次渡河前此岸的商人数
yk第k次渡河前此岸的随从数xk,yk=0,1,2,3;k=1,2,¼
过程的状态sk=(xk,yk)
允许状态集合S={(x,y)|x=0,y=0,1,2,3;x=3,y=0,1,2,3;x=y=1,2}
uk第k次渡船上的商人数
vk第k次渡船上的随从数uk,vk=0,1,2;k=1,2,¼
决策dk=(uk,vk)
允许决策集合D={(u,v)|u+v=1,2}
状态转移律sk+1=sk+(-1)kdk
[多步决策问题]
求dkÎD(k=1,2,¼,n),使skÎS,并按转移律由s1=(3,3)到达sn+1=(0,0)。
2.1(编程)求允许决策集合D和允许状态集合S
D是2行多列矩阵,每一列是一个决策。
S是2行多列矩阵,每一列是一种状态。
①编写程序求D和S,并输出。
②S的第一列是[3,3]',最后一列是[0,0]'。
★编写的程序。
★输出结果。
★
2.2(验证)求动态允许状态集合SS和状态转移矩阵A
上面允许状态集合S没有指明当时船是在此岸还是在彼岸,应该将S中的每一种状态再分为两种状态,需增加一个元素(值为-1或1)放在第三行。
定义动态允许状态集合
SS={(x,y,z)'|x=0,y=0,1,2,3;x=3,y=0,1,2,3;x=y=1,2;z=-1,1}
(x,y,-1),表示从此岸渡河前此岸的允许状态(x,y)。
(x,y,1),表示从彼岸渡河前此岸的允许状态(x,y)。
SS是三行多列矩阵,每一列表示一种状态,列下标为其编号。
定义状态转移矩阵A,其中,A(i,j)=1表示D中存在决策使状态i转到j,否则A(i,j)=0。
程序如下(输入时,不必把注释也输入):
要求:
①将程序接在上题的程序之后(去掉最后多余的输出语句),程序最后给出显示SS和A的语句。
②运行程序,输出SS和A。
[提示:
all]
对于向量v,all(v)当v的所有元素都非0时,返回true(值为1);否则返回false(值为0)。
(类似v的所有元素“与”)
对于矩阵X,all(X)返回一个行向量,每一个元素值为all作用于X对应列的结果。
all(X,1)作用于列(同all(X)),all(X,2)作用于行。
★运行的完整程序。
★运行结果。
2.3(验证)给出一个商人们安全过河的方案
程序如下(输入时,不必把注释也输入):
要求:
①读懂以上程序,掌握all和any函数的应用。
②将程序接在之前的程序(去掉最后多余的输出语句)后,运行程序。
[提示:
any]
对于向量v,any(v)当v中有元素非0时,返回true(值为1);否则返回false(值为0)。
(类似v的所有元素“或”)
对于矩阵X,any(X)返回一个行向量,每一个元素值为any作用于X对应列的结果。
any(X,1)作用于列(同any(X)),any(X,2)作用于行。
★运行的完整程序。
D=[];
foru=0:
2
forv=0:
2
ifu+v==1||u+v==2
D=[D[u;v]];
end
end
end
S=[];
forx=3:
-1:
0
fory=3:
-1:
0
ifx==0||x==3||x==y
S=[S,[x;y]];
end
end
end
SS=[[S;-ones(1,size(S,2))],[S;ones(1,size(S,2))]];
SSnum=size(SS,2);
A=zeros(SSnum);
fori=1:
SSnum
forj=1:
SSnum
ford=D
s=[SS(1:
2,i)+SS(3,i)*d;-SS(3,i)];
ifall(s==SS(:
j))
A(i,j)=1;break;
end
end
end
end
SS=[[S;-ones(1,size(S,2))],[S;ones(1,size(S,2))]];
SSnum=size(SS,2);
A=zeros(SSnum);
fori=1:
SSnum
forj=1:
SSnum
ford=D
s=[SS(1:
2,i)+SS(3,i)*d;-SS(3,i)];
ifall(s==SS(:
j))
A(i,j)=1;break;
end
end
end
end
s=[1,zeros(1,SSnum-1)];
SK=s;
whileany(s)&&all(SSnum-find(s))
k=find(s);
s=any(A(k,:
),1);
s=s&~any(SK,1);
SK=[SK;s];
end
if~any(s)
disp('Î޽⣡');return;
end
sk=zeros(1,size(SK,1));
sk
(1)=1;sk(1,end)=SSnum;j=SSnum;
fork=size(SK,1)-1:
-1:
2
fori=find(SK(k,:
))
ifA(i,j)==1
sk(k)=i;j=i;break;
end
end
end
disp([1:
length(sk);SS(1:
2,sk)]);
★程序的运行结果。
3.(求解)商人们怎样安全过河(修改)p9
对第2题的问题改动,用类似的方法求解。
3.1在第2题中修改商人数和随从数
有四名商人各带一个随从,其它同第2题。
修改第2题中的程序求解。
★修改的程序部分和运行结果(安全过河的方案)
D=[];
foru=0:
2
forv=0:
2
ifu+v==1||u+v==2
D=[D[u;v]];
end
end
end
S=[];
forx=4:
-1:
0
fory=4:
-1:
0
ifx==0||x==4||x==y
S=[S,[x;y]];
end
end
end
SS=[[S;-ones(1,size(S,2))],[S;ones(1,size(S,2))]];
SSnum=size(SS,2);
A=zeros(SSnum);
fori=1:
SSnum
forj=1:
SSnum
ford=D
s=[SS(1:
2,i)+SS(3,i)*d;-SS(3,i)];
ifall(s==SS(:
j))
A(i,j)=1;break;
end
end
end
end
SS=[[S;-ones(1,size(S,2))],[S;ones(1,size(S,2))]];
SSnum=size(SS,2);
A=zeros(SSnum);
fori=1:
SSnum
forj=1:
SSnum
ford=D
s=[SS(1:
2,i)+SS(3,i)*d;-SS(3,i)];
ifall(s==SS(:
j))
A(i,j)=1;break;
end
end
end
end
s=[1,zeros(1,SSnum-1)];
SK=s;
whileany(s)&&all(SSnum-find(s))
k=find(s);
s=any(A(k,:
),1);
s=s&~any(SK,1);
SK=[SK;s];
end
if~any(s)
disp('Î޽⣡');return;
end
sk=zeros(1,size(SK,1));
sk
(1)=1;sk(1,end)=SSnum;j=SSnum;
fork=size(SK,1)-1:
-1:
2
fori=find(SK(k,:
))
ifA(i,j)==1
sk(k)=i;j=i;break;
end
end
end
disp([1:
length(sk);SS(1:
2,sk)]);
3.2在3.1题中修改船容纳的人数
船能容纳3人。
修改3.1题中的程序求解。
★修改的程序部分和运行结果(安全过河的方案)
D=[];
foru=0:
3
forv=0:
3
ifu+v==1||u+v==2||u+v==3
D=[D[u;v]];
end
end
end
S=[];
forx=4:
-1:
0
fory=4:
-1:
0
ifx==0||x==4||x==y
S=[S,[x;y]];
end
end
end
SS=[[S;-ones(1,size(S,2))],[S;ones(1,size(S,2))]];
SSnum=size(SS,2);
A=zeros(SSnum);
fori=1:
SSnum
forj=1:
SSnum
ford=D
s=[SS(1:
2,i)+SS(3,i)*d;-SS(3,i)];
ifall(s==SS(:
j))
A(i,j)=1;break;
end
end
end
end
SS=[[S;-ones(1,size(S,2))],[S;ones(1,size(S,2))]];
SSnum=size(SS,2);
A=zeros(SSnum);
fori=1:
SSnum
forj=1:
SSnum
ford=D
s=[SS(1:
2,i)+SS(3,i)*d;-SS(3,i)];
ifall(s==SS(:
j))
A(i,j)=1;break;
end
end
end
end
s=[1,zeros(1,SSnum-1)];
SK=s;
whileany(s)&&all(SSnum-find(s))
k=find(s);
s=any(A(k,:
),1);
s=s&~any(SK,1);
SK=[SK;s];
end
if~any(s)
disp('Î޽⣡');return;
end
sk=zeros(1,size(SK,1));
sk
(1)=1;sk(1,end)=SSnum;j=SSnum;
fork=size(SK,1)-1:
-1:
2
fori=find(SK(k,:
))
ifA(i,j)==1
sk(k)=i;j=i;break;
end
end
end
disp([1:
length(sk);SS(1:
2,sk)]);
4.(编程)安全过河问题(人、猫、鸡、米)p21习题5
人带着猫、鸡、米过河,除需要人划船之外,船至多能载猫、鸡、米三者之一,而当人不在场时猫要吃鸡、鸡要吃米。
试设计一个安全过河方案。
模仿商人过河问题的程序编写程序解决本问题。
★程序
%x1表示人,x2表示猫,x3表示鸡,x4表示米
D=[];
x1=1;
forx2=0:
1
forx3=0:
1
forx4=0:
1
ifx2+x3+x4==1||x2+x3+x4==0
D=[D[x1;x2;x3;x4]];
end
end
end
end
S=[];
forx1=1:
-1:
0
forx2=1:
-1:
0
forx3=1:
-1:
0
forx4=1:
-1:
0
ifx1==0&&(x3+x4~=2)&&(x2+x3~=2)||x1==1&&(x3+x4~=0)&&(x2+x3~=0)
S=[S,[x1;x2;x3;x4]];
end
end
end
end
end
SS=[[S;-ones(1,size(S,2))],[S;ones(1,size(S,2))]];
SSnum=size(SS,2);
A=zeros(SSnum);
fori=1:
SSnum
forj=1:
SSnum
ford=D
s=[SS(1:
4,i)+SS(5,i)*d;-SS(5,i)];
ifall(s==SS(:
j))
A(i,j)=1;break;
end
end
end
end
s=[1,zeros(1,SSnum-1)];
SK=s;
whileany(s)&&all(SSnum-find(s))
k=find(s);
s=any(A(k,:
),1);
s=s&~any(SK,1);
SK=[SK;s];
end
if~any(s)
disp('Î޽⣡');return;
end
sk=zeros(1,size(SK,1));
sk
(1)=1;sk(1,end)=SSnum;j=SSnum;
fork=size(SK,1)-1:
-1:
2
fori=find(SK(k,:
))
ifA(i,j)==1
sk(k)=i;j=i;break;
end
end
end
disp([1:
length(sk);SS(1:
4,sk)]);
★程序的运行结果