故而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{:
});
end
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)
gui_Singleton=1;
gui_State=struct('gui_Name',mfilename,...
'gui_Singleton',gui_Singleton,...
'gui_OpeningFcn',@work11_OpeningFcn,...
'gui_OutputFcn',@work11_OutputFcn,...
'gui_LayoutFcn',[],...
'gui_Callback',[]);
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
functionwork11_OpeningFcn(hObject,eventdata,handles,varargin)
handles.output=hObject;
pic=imread('e.jpg');%读取图片
axes(handles.axes4);%选择坐标轴
image(pic);%显示图片
set(handles.axes4,'visible','off');%隐去坐标轴
axes(handles.axes1);%选择坐标轴
xlabel('t/s');
ylabel('Q/g');%定义XY轴名称
guidata(hObject,handles);
8.
functionvarargout=work11_OutputFcn(hObject,eventdata,handles)
varargout{1}=handles.output;
functionedit1_Callback(hObject,eventdata,handles)
functionedit1_CreateFcn(hObject,eventdata,handles)
ifispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
functionedit2_Callback(hObject,eventdata,handles)
functionedit2_CreateFcn(hObject,eventdata,handles)
ifispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
functionedit3_Callback(hObject,eventdata,handles)
functionedit3_CreateFcn(hObject,eventdata,handles)
ifispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
functionedit4_Callback(hObject,eventdata,handles)
functionedit4_CreateFcn(hObject,eventdata,handles)
ifispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
functionedit5_Callback(hObject,eventdata,handles)
functionedit5_CreateFcn(hObject,eventdata,handles)
ifispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
functionedit6_Callback(hObject,eventdata,handles)
functionedit6_CreateFcn(hObject,eventdata,handles)
ifispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
9.
end
functionedit7_Callback(hObject,eventdata,handles)
functionedit7_CreateFcn(hObject,eventdata,handles)
ifispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
functionedit8_Callback(hObject,eventdata,handles)
functionedit8_CreateFcn(hObject,eventdata,handles)
ifispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
functionedit9_Callback(hObject,eventdata,handles)
functionedit9_CreateFcn(hObject,eventdata,handles)
ifispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
functionpushbutton1_Callback(hObject,eventdata,handles)
if((isempty(get(handles.edit1,'string')))||(isempty(get(handles.edit2,'string')))||(isempty(get(handles.edit3,'string')))...
||(isempty(get(handles.edit4,'string')))||(isempty(get(handles.edit5,'string')))||(isempty(get(handles.edit6,'string')))...
||(isempty(get(handles.edit7,'string')))||(isempty(get(handles.edit8,'string')))||(isempty(get(handles.edit9,'string'))))
msgbox('请确保每个输入框不为空','注意');%判断是否存在空框,若存在则出提示框
else
l1=str2double(get(handles.edit1,'String'));
l2=str2double(get(handles.edit2,'String'));
M=str2double(get(handles.edit3,'String'));
a1=str2double(get(handles.edit4,'String'));
a=str2double(get(handles.edit5,'String'));
b=str2double(get(handles.edit6,'String'));
b1=str2double(get(handles.edit7,'String'));
v=str2double(get(handles.edit8,'String'));
u=str2double(get(handles.edit9,'String'));%输入数据的提取
if(isnan(l1)||isnan(l2)||isnan(M)||isnan(a1)||isnan(a)||...
isnan(b)||isnan(b1)||isnan(v)||isnan(u))
msgbox('请确保每个输入框为数字','注意');%判断输入是否均为数字,若否则出现提示框
10.
elseif(a+a1~=1||a<0||a1<0)
msgbox('请确保为穿行比与散空比为正且和为一','注意');%判断穿行比与散入空气比是否满足要求,不满足则出提示框
elseif(b<0||b>1||b1>1||b1<0)
msgbox('请确保吸附率为小于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,'string',Q);%动态输出相应点的Q值
end
end
end
functionpushbutton2_Callback(hObject,eventdata,handles)
ifisequal(questdlg('确定要退出吗?
','信息:
','确定','取消'...
'确定'),'确定')
closereq;%退出判断确认框,确认则退出,否则返回
end
functionpushbutton3_Callback(hObject,eventdata,handles)
axes(handles.axes1)%选择坐标轴
cla;%清空
11.