数学模型程序代码Matlab姜启源第一章建立数学模型.docx
- 文档编号:3125008
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:45
- 大小:78.91KB
数学模型程序代码Matlab姜启源第一章建立数学模型.docx
《数学模型程序代码Matlab姜启源第一章建立数学模型.docx》由会员分享,可在线阅读,更多相关《数学模型程序代码Matlab姜启源第一章建立数学模型.docx(45页珍藏版)》请在冰豆网上搜索。
数学模型程序代码Matlab姜启源第一章建立数学模型
第1章建立数学模型
教材中给出原始数据,结合模型,得到结果。
但如何求得结果这一过程没有给出,实际上要用MATLAB软件编写程序来求得,这应该交给实验课来完成。
考虑到上学期同学们刚学习MATLAB语言,编程能力不强,所以有关的程序给出来供同学们进行验证。
要求同学们要读懂程序。
1.(求解,编程)如何施救药物中毒p10~11
人体胃肠道和血液系统中的药量随时间变化的规律(模型):
其中,x(t)为t时刻胃肠道中的药量,y(t)为t时刻血液系统中的药量,t=0为服药时刻。
(求解)模型求解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)]
(编程)结果分析p11
已知λ=,μ=,将上题中得到x(t)和y(t)两条曲线画在同一个图形窗口内。
参考图形如下。
提示:
MATLAB命令plot,fplot,holdon/off,gridon/off,xlabel,ylabel,text。
★编写的程序和运行结果:
程序1:
用plot
clc;clear;
a=;b=;
t=0:
:
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=;b=;
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})');
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
[多步决策问题]
求dkD(k=1,2,,n),使skS,并按转移律由s1=(3,3)到达sn+1=(0,0)。
(编程)求允许决策集合D和允许状态集合S
D是2行多列矩阵,每一列是一个决策。
S是2行多列矩阵,每一列是一种状态。
要求:
①编写程序求D和S,并输出。
②S的第一列是[3,3]',最后一列是[0,0]'。
★编写的程序和运行结果:
程序:
clear;clc;
%求允许决策集合D(2×n1,n1种决策)
D=[];
foru=0:
2
forv=0:
2
ifu+v==1||u+v==2
D=[D,[u;v]];
end
end
end
%求允许状态集合S(2×n2,n2种状态)
S=[];
forx=3:
-1:
0
fory=3:
-1:
0
ifx==0||x==3||x==y
S=[S,[x;y]];
end
end
end%首列状态(商人数,仆从数)'=(3,3)',末列为(0,0)'
D,S
运行结果:
(验证)求动态允许状态集合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。
对照参考答案,如数值不一致,请检查程序。
MATLAB函数all的用法见提示。
★运行的完整程序和运行结果:
程序:
clear;clc;
%求允许决策集合D(2×n1,n1种决策)
D=[];
foru=0:
2
forv=0:
2
ifu+v==1||u+v==2
D=[D,[u;v]];
end
end
end
%求允许状态集合S(2×n2,n2种状态)
S=[];
forx=3:
-1:
0
fory=3:
-1:
0
ifx==0||x==3||x==y
S=[S,[x;y]];
end
end
end%首列状态(商人数,仆从数)'=(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,其它为0
A=zeros(SSnum);
fori=1:
SSnum
forj=1:
SSnum
ford=D%顺序取D的每一列给d
s=[SS(1:
2,i)+SS(3,i)*d;-SS(3,i)];
ifall(s==SS(:
j))%所有元素不为0时为真
A(i,j)=1;break;
end
end
end
end
SS,A
运行结果:
(验证)给出一个商人们安全过河的方案
程序如下(输入时,不必把注释也输入):
程序运行结果:
要求:
①读懂以上程序,掌握all和any函数的应用。
②将程序接在之前的程序后(去掉最后多余的输出语句),运行程序。
对照答案,如不一致,请检查程序。
MATLAB函数any的用法见提示。
★给出运行的完整程序和运行结果:
程序:
clear;clc;
%求允许决策集合D(2×n1,n1种决策)
D=[];
foru=0:
2
forv=0:
2
ifu+v==1||u+v==2
D=[D,[u;v]];
end
end
end
%求允许状态集合S(2×n2,n2种状态)
S=[];
forx=3:
-1:
0
fory=3:
-1:
0
ifx==0||x==3||x==y
S=[S,[x;y]];
end
end
end%首列状态(商人数,仆从数)'=(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,其它为0
A=zeros(SSnum);
fori=1:
SSnum
forj=1:
SSnum
ford=D%顺序取D的每一列给d
s=[SS(1:
2,i)+SS(3,i)*d;-SS(3,i)];
ifall(s==SS(:
j))%所有元素不为0时为真
A(i,j)=1;break;
end
end
end
end
%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)~=1
k=find(s);%求最后一行为1的列下标
s=any(A(k,:
),1);%得到新行,元素值为1或0
s=s&~any(SK,1);%去掉新行中之前出现的状态
SK=[SK;s];%新行加入,作为SK的末行
end%多步决策,直到找到目标。
有难度!
ifany(s)==0%新行全0
disp('无解!
');return;
end
%最后一行的第SSnum状态(j)开始往回找转换到它的状态(i),直到状态1。
%得到一个状态号的顺序sk(行向量),为一个解。
sk=zeros(1,size(SK,1)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数学模型 程序代码 Matlab 姜启源 第一章 建立