1实验01建立数学模型(4学时)(第1章建立数学模型)教材中给出原始数据,结合模型,得到结果。但如何求得结果这一过程没有给出,实际上要用MATLAB软件编写程序来求得,这应该交给实验课来完成。考虑到上学期同学们刚学习MATLAB语言,编程能力不强,所以有关的程序给出来供同学们进行验证。要求同学们要读懂程序。1.(求解,编程)如何施救药物中毒p10~11人体胃肠道和血液系统中的药量随时间变化的规律(模型):d,(0)1100d(,0)d,(0)0dxxxtyxyyt其中,x(t)为t时刻胃肠道中的药量,y(t)为t时刻血液系统中的药量,t=0为服药时刻。1.1(求解)模型求解p10~11要求:①用MATLAB求解微分方程函数dsolve求解该微分方程(符号运算)。②用MATLAB的化简函数simplify化简所得结果。③结果与教材P11上的内容比较。提示:dsolve和simplify的用法可用help查询。建议在命令窗口中操作。★求解的语句及运行结果:[x,y]=dsolve('Dx=-a*x','Dy=a*x-b*y','x(0)=1100','y(0)=0');disp([x,y])[1100*exp(-a*t),exp(-a*t)*exp(-b*t)*((1100*a*exp(a*t))/(a-b)-(1100*a*exp(b*t))/(a-b))]disp(simplify([x,y]));[1100*exp(-a*t),(1100*a*exp(-t*(a+b))*(exp(a*t)-exp(b*t)))/(a-b)]1.2(编程)结果分析p11已知λ=0.1386,μ=0.1155,将上题中得到x(t)和y(t)两条曲线画在同一个图形窗口内。参考图形如下。20510152025020040060080010001200t/hx,y/mgx(t)y(t)参考答案提示:MATLAB命令plot,fplot,holdon/off,gridon/off,xlabel,ylabel,text。★编写的程序和运行结果:程序1:用plotclc;clear;a=0.1386;b=0.1155;t=0:0.01:25;x=1100./exp(a*t);y=-(1100*a*(1./exp(a*t)-1./exp(b*t)))/(a-b);plot(t,x,t,y);gridon;xlabel('{\itt}/h');ylabel('{\itx},{\ity}/mg');text(2,1100/exp(a*2),'{\itx}({\itt})');text(3,-(1100*a*(1/exp(a*3)-1/exp(b*3)))/(a-b),'{\ity}({\itt})');程序2:用fplot和匿名函数clc;clear;a=0.1386;b=0.1155;fplot(@(t)[1100/exp(a*t),-(1100*a*(1/exp(a*t)-1/exp(b*t)))/(a-b)],[025]);gridon;xlabel('{\itt}/h');ylabel('{\itx},{\ity}/mg');text(2,1100/exp(a*2),'{\itx}({\itt})');text(3,-(1100*a*(1/exp(a*3)-1/exp(b*3)))/(a-b),'{\ity}({\itt})');32.(编程,验证)商人们怎样安全过河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[多步决策问题]求dkD(k=1,2,,n),使skS,并按转移律由s1=(3,3)到达sn+1=(0,0)。2.1(编程)求允许决策集合D和允许状态集合SD是2行多列矩阵,每一列是一个决策。S是2行多列矩阵,每一列是一种状态。要求:①编写程序求D和S,并输出。②S的第一列是[3,3]',最后一列是[0,0]'。★编写的程序和运行结果:程序:clear;clc;%求允许决策集合D(2×n1,n1种决策)D=[];foru=0:2forv=0:2ifu+v==1||u+v==2D=[D,[u;v]];endend4end%求允许状态集合S(2×n2,n2种状态)S=[];forx=3:-1:0fory=3:-1:0ifx==0||x==3||x==yS=[S,[x;y]];endendend%首列状态(商人数,仆从数)'=(3,3)',末列为(0,0)'D,S运行结果: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。程序如下(输入时,不必把注释也输入):5程序运行结果(参考):要求:①将程序接在上题的程序之后(去掉最后多余的输出语句),程序最后给出显示SS和A的语句。②运行程序,输出SS和A。对照参考答案,如数值不一致,请检查程序。6MATLAB函数all的用法见提示。★运行的完整程序和运行结果:程序:clear;clc;%求允许决策集合D(2×n1,n1种决策)D=[];foru=0:2forv=0:2ifu+v==1||u+v==2D=[D,[u;v]];endendend%求允许状态集合S(2×n2,n2种状态)S=[];forx=3:-1:0fory=3:-1:0ifx==0||x==3||x==yS=[S,[x;y]];endendend%首列状态(商人数,仆从数)'=(3,3)',末列为(0,0)'%动态允许状态集合SS(3×n3,n3种状态)%-1,从此岸渡河前此岸的允许状态%1,从彼岸渡河前此岸的允许状态SS=[[S;-ones(1,size(S,2))],[S;ones(1,size(S,2))]];SSnum=size(SS,2);%状态总数,SS中的列下标对应状态的编号%SS(:,1)=[3,3,-1]'(起点),SS(:,end)=[0,0,1]'(终点)%状态转移矩阵A,A(i,j)=1表示存在决策使状态i转到j,其它为0A=zeros(SSnum);fori=1:SSnumforj=1:SSnumford=D%顺序取D的每一列给ds=[SS(1:2,i)+SS(3,i)*d;-SS(3,i)];ifall(s==SS(:,j))%所有元素不为0时为真A(i,j)=1;break;endendendendSS,A运行结果:72.3(验证)给出一个商人们安全过河的方案程序如下(输入时,不必把注释也输入):程序运行结果:要求:8①读懂以上程序,掌握all和any函数的应用。②将程序接在之前的程序后(去掉最后多余的输出语句),运行程序。对照答案,如不一致,请检查程序。MATLAB函数any的用法见提示。★给出运行的完整程序和运行结果:程序:clear;clc;%求允许决策集合D(2×n1,n1种决策)D=[];foru=0:2forv=0:2ifu+v==1||u+v==2D=[D,[u;v]];endendend%求允许状态集合S(2×n2,n2种状态)S=[];forx=3:-1:0fory=3:-1:0ifx==0||x==3||x==yS=[S,[x;y]];endendend%首列状态(商人数,仆从数)'=(3,3)',末列为(0,0)'%动态允许状态集合SS(3×n3,n3种状态)%-1,从此岸渡河前此岸的允许状态%1,从彼岸渡河前此岸的允许状态SS=[[S;-ones(1,size(S,2))],[S;ones(1,size(S,2))]];SSnum=size(SS,2);%状态总数,SS中的列下标对应状态的编号%SS(:,1)=[3,3,-1]'(起点),SS(:,end)=[0,0,1]'(终点)%状态转移矩阵A,A(i,j)=1表示存在决策使状态i转到j,其它为0A=zeros(SSnum);fori=1:SSnumforj=1:SSnumford=D%顺序取D的每一列给ds=[SS(1:2,i)+SS(3,i)*d;-SS(3,i)];ifall(s==SS(:,j))%所有元素不为0时为真A(i,j)=1;break;endendend9end%SK为多行SSnum列的矩阵,第i列对应SS的第i列的状态。%第i行表示第i次渡河前有那些状态,1表示有对应下标列号的状态,0则无。%第i+1行是第i行状态转移过来的状态%当第SSnum状态出现时停止,表示有解。%或者新行的元素全0时停止,表示无解。%新行不允许出现之前出现过的状态。s=[1,zeros(1,SSnum-1)];%从状态[3,3,-1]'开始SK=s;whileany(s)&&s(SSnum)~=1k=find(s);%求最后一行为1的列下标s=any(A(k,:),1);%得到新行,元素值为1或0s=s&~any(SK,1);%去掉新行中之前出现的状态SK=[SK;s];%新行加入,作为SK的末行end%多步决策,直到找到目标。有难度!ifany(s)==0%新行全0disp('无解!');return;end%最后一行的第SSnum状态(j)开始往回找转换到它的状态(i),直到状态1。%得到一个状态号的顺序sk(行向量),为一个解。sk=zeros(1,size(SK,1));sk(1)=1;sk(1,end)=SSnum;j=SSnum;fork=size(SK,1)-1:-1:2fori=find(SK(k,:))ifA(i,j)==1sk(k)=i;j=i;break;endendenddisp([1:length(sk);SS(1:2,sk)]);%输出结果给出程序的运行结果:3.(求解)商人们怎样安全过河(修改)p9对第2题的问题改动,用类似的方法求解。3.1在第2题中修改商人数和随从数有四名商人各带一个随从,其它同第2题。修改第2题中的程序求解。★修改的程序部分和完整程序的运行结果(安全过河的方案):%求允许状态集合S(2×n2,n2种状态)S=[];forx=4:-1:010fory=4:-1:0ifx==0||x==4||x==yS=[S,[x;y]];endendend%首列状态(商人数,仆从数)'=(4,4)',末列为(0,0)'3.2在3.1题中修改船容纳的人数船能容纳3人。修改3.1题中的程序求解。★修改的程序部分和完整程序的运行结果(安全过河的方案):%求允许决策集合D(2×n1,n1种决策)D=[];foru=0:3forv=0:3ifu+v=1&&u+v=3D=[D,[u;v]];endendend4.(编程