实验01讲评、参考答案-建立数学模型(4学时).doc_第1页
实验01讲评、参考答案-建立数学模型(4学时).doc_第2页
实验01讲评、参考答案-建立数学模型(4学时).doc_第3页
实验01讲评、参考答案-建立数学模型(4学时).doc_第4页
实验01讲评、参考答案-建立数学模型(4学时).doc_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验01讲评、参考答案讲 评未交实验报告的同学名单数学:01边清水,09龚昱霏,14黄浦,34谭世韬信科:批改情况:不批改,同学们自己对照参考答案。附参考答案:数学建模实验王平实验01 建立数学模型(4学时)(第1章 建立数学模型)教材中给出原始数据,结合模型,得到结果。但如何求得结果这一过程没有给出,实际上要用MATLAB软件编写程序来求得,这应该交给实验课来完成。考虑到同学们刚学习MATLAB语言,编程能力不强,所以有关的程序给出来供同学们进行验证。要求同学们要读懂程序。1.(求解,编程)如何施救药物中毒p1011人体胃肠道和血液系统中的药量随时间变化的规律(模型):其中,x(t)为t时刻胃肠道中的药量,y(t)为t时刻血液系统中的药量,t=0为服药时刻。1.1(求解)模型求解p1011要求: 用MATLAB求解微分方程函数dsolve求解该微分方程(符号运算)。 用MATLAB的化简函数simplify化简所得结果。提示:dsolve和simplify的用法可用help查询。建议在命令窗口中操作。 求解的语句及运行结果(比较11式(3)、(4)): 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)两条曲线画在同一个图形窗口内(见11图1)。提示:MATLAB命令:plot, fplot, hold on/off, grid on/off, xlabel, ylabel, text。 编写的程序和运行结果(比较11图1):程序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);grid on;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),0 25);grid on;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.(编程,验证)商人们怎样安全过河p89三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行。随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货。但是如何乘船的大权掌握在商人们手中。商人们怎样才能安全渡河呢?模型构成决策: 每一步(此岸到彼岸或彼岸到此岸)船上的人员。要求:在安全的前提下(两岸的随从数不比商人多),经有限步使全体人员过河。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,2uk第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(2n1,n1种决策)D=;for u=0:2 for v=0:2 if u+v=1|u+v=2 D=D,u;v; end endend%求允许状态集合S(2n2,n2种状态)S=;for x=3:-1:0 for y=3:-1:0 if x=0|x=3|x=y S=S,x;y; end endend%首列状态 ( 商人数, 仆从数) = ( 3, 3 ),末列为( 0, 0 )D, S运行结果:2.2(验证)给出一个商人们安全过河的方案程序(输入时,不必把注释也输入):程序运行结果:要求: 读懂以上程序。 将题2.1的程序放到上面的程序中(去掉最后多余的输出语句),运行程序。对照答案,如不一致,请检查程序。 给出运行的完整程序和运行结果(参考9图1):程序:function river()D,S1=DS(); S2=S1; SS=;%初始允许状态集合S1,S2s1=S1(:,1); S1(:,1)=;%始发状态s1=3;3,用过的状态移出i=1; SS(:,i)=s1;%SS存放有效状态转移的路径k=true;%k=true时,从此岸到彼岸;否则从彼岸到此岸while isempty(S2)%目标状态集合非空 s2,S2=fun(s1,S2,k,D); if k&s2(1)=0&s2(2)=0%有解 SS(:,i+1)=s2; disp(1:i+1;SS(:,1:i+1); return; end if s2(1)=-1%新状态s2无效 if i=1%不能再回退 disp(无解!); return; end i=i-1;%回退 s1=SS(:,i); else i=i+1; SS(:,i)=s2;%s1进入路径 s1=s2; end S=S1;S1=S2;S2=S; k=k;enddisp(无解!);end function s2,S2=fun(s1,S2,k,D)%k=true时,从此岸到彼岸;否则从彼岸到此岸for u=D %决策遍历 s2=s1+(-1)k*u; %状态转移s1-s2 for i=1:size(S2,2) if s2=S2(:,i)%是否新允许状态 S2(:,i)=; return; end endends2=-1;-1;%从s1走不通end function D,S=DS()%求允许决策集合D(2n1,n1种决策)D=;for u=0:2 for v=0:2 if u+v=1|u+v=2 D=D,u;v; end endend%求允许状态集合S(2n2,n2种状态)S=;for x=3:-1:0 for y=3:-1:0 if x=0|x=3|x=y S=S,x;y; end endend%首列状态 ( 商人数, 仆从数) = ( 3, 3 ),末列为( 0, 0 )end给出程序的运行结果:3.(求解)商人们怎样安全过河(修改)p9对第2题的问题改动,用类似的方法求解。3.1 在第2题中修改商人数和随从数有四名商人各带一个随从,其它同第2题。修改第2题中的程序求解。 修改的程序部分和完整程序的运行结果(安全过河的方案):%求允许状态集合S(2n2,n2种状态)S=;for x=4:-1:0 for y=4:-1:0 if x=0|x=4|x=y S=S,x;y; end endend%首列状态 (商人数, 仆从数) = ( 4, 4 ),末列为( 0, 0 )3.2 在3.1题中修改船容纳的人数船能容纳3人。修改3.1题中的程序求解。 修改的程序部分和完整程序的运行结果(安全过河的方案):%求允许决策集合D(2n1,n1种决策)D=;for u=0:3 for v=0:3 if u+v=1 & u+v=0) & all(s10& any(s00)%栈未空且s0中至少有一个元素0s0=st(sp,1,2); ss=st(sp,3);%当前状态,ss=-1/1小船停靠此岸/彼岸d=st(sp,4);%之前用过的决策,该决策失败sp=sp-1;%出栈 d=d+1;%试探下一个决策 while d0)s1=s0+ss*D(d,:);%下一个状态,不包括小船停靠状态i=s1(1)+1;j=s1(2)+1;%状态转换为下标if all(s1=0) & all(s1=0&y=0&y0 Snum(k+1)=0;%第k+1次渡河前的状态总数初始化 k1=size(s,2)-Snum(k)+1;k2=size(s,2); for i=k1:k2 xk=s(1,i); yk=s(2,i); for d=D xk1=xk+(-1)k*d(1); yk1=yk+(-1)k*d(2); if (-1)k=1 for j=1:size(SB,2) if xk1=SB(1,j)&yk1=SB(2,j) s=s,SB(:,j); SB(:,j)=; Snum(k+1)=Snum(k+1)+1; break; end end else for j=1:size(SA,2) if xk1=SA(1,j)&yk1=SA(2,j) s=s,SA(:,j); SA(:,j)=; Snum(k+1)=Snum(k+1)+1; break; end end end end end k=k+1;endSnums(:,1:Snum(1)m=Snum(1);for k=1:11 disp(s(:,m+1:m+Snum(k+1); m=m+Snum(k+1);end解4i=1;S=;D=;S(:,i)=3;3;%开始S(:,1)=3,3while S(1,i)=0|S(2,i)=0%当s(:,i)=0,0完成 D(:,i)=round(2*rand(2,1);%随机取0,1,2给决策D(:,i) d=D(:,i); if d(1)+d(2)=1&d(1)+d(2)=2%成立则不是允许决策 continue;%重新选取决策 end S(:,i+1)=S(:,i)+(-1)i*D(:,i);%得到下一个状态S(:,i+1) s=S(:,i+1); if (s(1)=1&s(2)=1)|(s(1)=2&s(2)=2)|(s(1)3|s(1)3|s(2)0)%成立则不是允许状态 continue;%重新选取决策 end i=i+1; if i=105%等于此循环次数判无解 disp(无解);return; endendfor i=1:size(S,2)%添加状态的第3行元素,-1为船在此岸,1时在彼岸 SS(:,i)=S(:,i);(-1)i;end%区分过程中的不同状态for i=1:size(SS,2)-1%去掉状态转移过程中多余的状态 a=0; for j=i+1:size(SS,2)%找出与第i状态相同的最后一个状态 if any(SS(:,i)-SS(:,j)=0 a=j; end end if i=ss(j,:)%保证总人数多的状态每个分量都要大 a(i,j)=2+(-1)k; a(j,i)=(-1)k; end end endenda(1,2)=0;%当第一次由(3,3)变到(3,2)时,下一次必为(3,2) 变到(3,3),避免无用功k=1;dd=1;s0=ss(1,:);%初始状态S=ss(1,:);%储存总的状态转移方案D=;%每一步的决策集合while any(s0)&k1&length(m)=2 m(find(m=dd(k-1)=;%避免走回头路 end ignore,p=sort(rand(1,length(m);%在剩下的状态中随机找一个可行状态 s0=ss(m(p(1),:); k=k+1; dd=dd;m(p(1);S=S;s0;D=D;abs(S(k,:)-S(k-1,:);endSD解6clear; clc;%求允许决策集合D(2n1,n1种决策)D=;for u=0:2 for v=0:2 if u+v=1|u+v=2 D=D,u;v; end endend%求允许状态集合S(2n2,n2种状态)S=;for x=3:-1:0 for y=3:-1:0 if x=0|x=3|x=y S=S,x;y; end endend%首列状态 ( 商人数, 仆从数) = ( 3, 3 ),末列为( 0, 0 )%动态允许状态集合SS(3n3,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);for i=1:SSnum for j=1:SSnum for d=D%顺序取D的每一列给d s=SS(1:2,i)+SS(3,i)*d;-SS(3,i); if all(s=SS(:,j)%所有元素不为0时为真 A(i,j)=1; break; end end endend%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;while any(s) & s(SSnum)=1 k=find(s);%求最后一行为1的列下标 s=any(A(k,:),1);%得到新行,元素值为1或0 s=s&any(SK,1);%去掉新行中之前出现的状态 SK=SK;s;%新行加入,作为SK的末行end%多步决策,直到找到目标。有难度!if any(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;for k=size(SK,1)-1:-1:2 for i=find(SK(k,:) if A(i,j)=1 sk(k)=i; j=i; break; end endenddisp(1:length(sk);SS(1:2,sk);%输出结果44附1:实验提示第2.2题MATLAB函数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题MATLAB函数any的用法:对于向量v,any(v)当v中有元素非0时,返回true(值为1);否则返回false(值为0)。(类似v的所有元素“或”)对于矩阵X,any(X)返回一个行向量,每一个元素值为any作用于X对应列的结果。any(X, 1)作用于列(同any(X)),any(X, 2)作用于行。第3题要给出安全过河的方案。第4题在设计允许状态集合和允许决策集合时,要把“人”考虑进去附2:第1章 建立数学模型11.1 从现实对象到数学模型41.2 数学建模的重要意义61.3 建模示例之一 椅子能在不平的地面上放稳吗8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论