matlab系统仿真课设Word文档下载推荐.docx
《matlab系统仿真课设Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《matlab系统仿真课设Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
3.未点燃的烟草和过滤嘴对随烟雾穿行的毒物的吸附率(单位时间内毒物被吸收的比例)分别是常数b和β.
4.烟雾沿香烟穿行的速度是常数v,香烟燃烧速度是常数u,且v>
>
u.
5.将一支烟吸完后毒物进入人体的总量(不考虑从空气的烟雾中吸入的)记作Q。
仿真要求:
系统输入为烟草和过滤嘴的长度l1和l2,毒物总质量M,点燃处毒物随烟雾进入空气和沿香烟穿行的数量比例a’:
a,点燃的烟草和过滤嘴对随烟雾穿行的毒物的吸附率b和β,烟雾沿香烟穿行的速度v,香烟燃烧速度u.系统输出为毒物进入人体的量Q。
要求有输入、输出界面及仿真过程。
1.
2.1模型构建
设在t=0的时刻点燃香烟,在过滤嘴末端截面单位时间的流量为q(t),则由题意易得:
Q=∫q(t)dt(0<
t<
l1/u),故而以下对q(t)进行推算。
设距离烟草前端距离为x的界面为q(x,t),设各点烟雾毒物的密度为p(x,t),在点燃的瞬间有如下:
b∫p(x,0)dx0<
x<
l1积分均为由x至x+△x
q(x,0)-q(x+△x,0)=此式由物质守恒定律得
β∫p(x,0)dxl1<
l
取△x趋近于0并将q(x,0)=v*p(x,0)带入可得:
bp(x)/v0<
l1
dp/dx=
βp(x)/vl1<
设各点毒物密度为w(x,t)
由题意知点燃瞬间存在q(0,0)=auw(0,0),故而有p(0,0)=auw(0,0)/v。
由上式微分以及p(0,0)可解得在0<
l1时p(x,0)的表达式:
p(x,0)=(auw(x,0)/v)*exp(-bx/v)0<
由函数连续性可求得p(l1,0)=(auw(x,0)/v)*exp(-bx/v),继而由p(l1,0)与上式微分求l1<
l时的表达式:
p(x,0)=(auw(x,0)/v)*exp((((β-b)*l1-β*x))/v)l1<
故而有过滤嘴端口处:
q(l,0)=v*p(l,0)=auw(l,0)*exp((((β-b)*l1-β*l))/v)
继而求q(l,t):
先设h(t)为t时刻点燃时单位时间内烟草释放的有毒物质的量,h(t)=uw(x,t)=uw(ut,t),
2.
由p(x,0)的表达式变换可得:
(ah(t)/v)*exp((-bx+but)/v)0<
p(x,t)=
(ah(t)/v)*exp(((β-b)*l1+but-βx)/v)l1<
故而q(l,t)=ah(t)*exp(((β-b)*l1+but-βl)/v),因此,求出h(t)即可得到最终的q(l,t)。
h(t)=uw(ut,t),w(x,0)=M/l1,又:
w(x,t+△t)-w(x,t)=bp(x,t)△t即:
dw/dt=bp(x,t)
w(x,0)=M/l1
p(x,t)=(ah(t)/v)*exp((-bx+but)/v)
故而可得w(ut,t)=(M/a’l1)*(1-a*exp(-a’but/v))
故而q(l,t)=au(M/a’l1)*(1-a*exp(-a’but/v))*exp(((β-b)*l1+but-βl)/v)
由于Q(t)=∫q(l,t)dt=(aMv/ba’l1)*exp(-bl1/v)*exp(-βl2/v)*(exp(but/v)-exp(abut/v))此式为积分0-t,对于一根烟抽尽的时间t=l1/u带入可得:
Q=Q(l1/u)=(aMv/a’bl1)*exp(-βl2/v)*(1-exp(-a’bl1/v))
2.2模型实现
要实现界面友好,有输入输出,需利用matlabGUI进行规划,首先建立空白GUI模板,由于本题需要九个输入,一个输出,以及需要展现仿真过程,故而在初始空白模板上建立如下两个界面框架:
3.
其中第一个仅作为欢迎界面,点击进入第二个,图片插入利用imread以及image函数。
第二个界面中包含九个编辑文本框作为输入来源,十一个静态文本框作为显示相关提示文字,一个静态文本框作为显示输出,另两个静态文本框作为拼图,三个按钮作为调动函数的按键,一个坐标轴以及显示输出来体现仿真过程,图片插入利用imread以及image函数。
框架构建完成够开始调用函数的编写。
在开始运算的按钮的callback函数中读入各输入量,用str2double(get(handles.*,'
String'
))语句实现读入且用msgbox进行容错处理,若有错则弹框提示,数据读入后进行运算:
Q(t)=(aMv/ba’l1)*exp(-bl1/v)*exp(-βl2/v)*(exp(but/v)-exp(abut/v))
由于需体现仿真过程,程序中画Q(t)的图像,根据时间的改变逐渐变化,在画图中使用描点,并通过for循环,holdon与pause语句进行动态展现,同时变化的Q将不断展现在输出文本框上,最终在t=l1/u时仿真停止,Q=Q(l1/u)。
在清空图形的callback调动函数中写入:
axes(handles.axes1)cla;
可将坐标轴上图形清空,根据单个展示或多个比较图形进行使用。
在退出程序的callback调用函数中写入:
ifisequal确认窗口根据判断关闭当前窗口程序。
3.1运行指南
进入程序界面如下图:
4.
点击后进入下一界面:
按照提示输入各个数据量,点击开始运算即可观察到仿真过程,仿真过程结束后可看到最终结果。
再进行第二次输入数据时,可根据需要保留上一次的图形或者清除,若不需保留则可先点击清空图形按钮将图形清空再进行下一次的仿真计算。
不需要程序的运行时,点击退出程序即可退出。
3.2实例分析
假设l1=9cm,l2=1cm,a’=0.3,a=0.7,M=30mg,b=0.2,β=0.6,v=10cm/s,u=0.1cm/s。
依次输入程序并显示结果过程如下:
起始输入过程截图
5.
最终结果
若输入数据存在问题,则根据问题弹出相应对盈眶如下:
含有空输入含有非数字输入
所输比例不满足
6.
可根据需要选择是否清空图形,若清空则不保留前一次作图痕迹,不清空则保留,具体效果如下图示:
未清空输入前清空
若退出程序,则有判断:
4、程序代码
wlc.m
functionvarargout=wlc(varargin)
gui_Singleton=1;
gui_State=struct('
gui_Name'
mfilename,...
'
gui_Singleton'
gui_Singleton,...
gui_OpeningFcn'
@wlc_OpeningFcn,...
gui_OutputFcn'
@wlc_OutputFcn,...
gui_LayoutFcn'
[],...
gui_Callback'
[]);
ifnargin&
&
ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
7.
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
functionwlc_OpeningFcn(hObject,eventdata,handles,varargin)
handles.output=hObject;
pic=imread('
w.jpg'
);
%读取图片
image(pic);
%图片显示
set(handles.axes1,'
visible'
'
off'
%隐去坐标轴
guidata(hObject,handles);
functionvarargout=wlc_OutputFcn(hObject,eventdata,handles)
varargout{1}=handles.output;
functionpushbutton2_Callback(hObject,eventdata,handles)
work11;
%打开主界面
close(gcbf);
%关闭当前界面
.
Work11.m
functionvarargout=work11(varargin)
@work11_OpeningFcn,...
@work11_OutputFcn,...
functionwork11_OpeningFcn(hObject,eventdata,handles,varargin)
e.jpg'
%读取图片
axes(handles.axes4);
%选择坐标轴
%显示图片
set(handles.axes4,'
axes(handles.axes1);
xlabel('
t/s'
ylabel('
Q/g'
%定义XY轴名称
8.
functionvarargout=work11_OutputFcn(hObject,eventdata,handles)
functionedit1_Callback(hObject,eventdata,handles)
functionedit1_CreateFcn(hObject,eventdata,handles)
ifispc
set(hObject,'
BackgroundColor'
white'
get(0,'
defaultUicontrolBackgroundColor'
));
functionedit2_Callback(hObject,eventdata,handles)
functionedit2_CreateFcn(hObject,eventdata,handles)
functionedit3_Callback(hObject,eventdata,handles)
functionedit3_CreateFcn(hObject,eventdata,handles)
functionedit4_Callback(hObject,eventdata,handles)
functionedit4_CreateFcn(hObject,eventdata,handles)
functionedit5_Callback(hObject,eventdata,handles)
functionedit5_CreateFcn(hObject,eventdata,handles)
functionedit6_Callback(hObject,eventdata,handles)
functionedit6_CreateFcn(hObject,eventdata,handles)
9.
functionedit7_Callback(hObject,eventdata,handles)
functionedit7_CreateFcn(hObject,eventdata,handles)
functionedit8_Callback(hObject,eventdata,handles)
functionedit8_CreateFcn(hObject,eventdata,handles)
functionedit9_Callback(hObject,eventdata,handles)
functionedit9_CreateFcn(hObject,eventdata,handles)
functionpushbutton1_Callback(hObject,eventdata,handles)
if((isempty(get(handles.edit1,'
string'
)))||(isempty(get(handles.edit2,'
)))||(isempty(get(handles.edit3,'
)))...
||(isempty(get(handles.edit4,'
)))||(isempty(get(handles.edit5,'
)))||(isempty(get(handles.edit6,'
||(isempty(get(handles.edit7,'
)))||(isempty(get(handles.edit8,'
)))||(isempty(get(handles.edit9,'
))))
msgbox('
请确保每个输入框不为空'
注意'
%判断是否存在空框,若存在则出提示框
l1=str2double(get(handles.edit1,'
l2=str2double(get(handles.edit2,'
M=str2double(get(handles.edit3,'
a1=str2double(get(handles.edit4,'
a=str2double(get(handles.edit5,'
b=str2double(get(handles.edit6,'
b1=str2double(get(handles.edit7,'
v=str2double(get(handles.edit8,'
u=str2double(get(handles.edit9,'
%输入数据的提取
if(isnan(l1)||isnan(l2)||isnan(M)||isnan(a1)||isnan(a)||...
isnan(b)||isnan(b1)||isnan(v)||isnan(u))
请确保每个输入框为数字'
%判断输入是否均为数字,若否则出现提示框
10.
elseif(a+a1~=1||a<
0||a1<
0)
请确保为穿行比与散空比为正且和为一'
%判断穿行比与散入空气比是否满足要求,不满足则出提示框
elseif(b<
0||b>
1||b1>
1||b1<
请确保吸附率为小于1的正值'
%判断吸附率是否满足要求,不满足则出提示框
else
q1=a*v*M/(l1*a1*b);
q2=exp(-b*l1/v);
q3=exp(-b1*l2/v);
t1=l1/u;
p4=exp(b*u*t1/v);
p5=exp(a*b*u*t1/v);
P=q1*q2*q3*(p4-p5);
%初步计算最终有害物质的量
axis([0ceil(t1)0ceil(P)]);
%根据初步计算固定坐标轴大小
c=t1/500;
%由于抽烟时间长短不同,仿真需要较少时间,故需适当步长
fort=0:
c:
(l1/u)
q4=exp(b*u*t/v);
q5=exp(a*b*u*t/v);
Q=q1*q2*q3*(q4-q5);
holdon;
plot(t,Q,'
m'
%for循环描点
pause(0.00000001);
%停顿体现动态
set(handles.text11,'
Q);
%动态输出相应点的Q值
end
ifisequal(questdlg('
确定要退出吗?
'
信息:
确定'
'
取消'
...
'
),'
)
closereq;
%退出判断确认框,确认则退出,否则返回
functionpushbutton3_Callback(hObject,eventdata,handles)
axes(handles.axes1)%选择坐标轴
cla;
%清空
11.