matlab系统仿真课设.docx

上传人:b****4 文档编号:3695888 上传时间:2022-11-24 格式:DOCX 页数:13 大小:647.71KB
下载 相关 举报
matlab系统仿真课设.docx_第1页
第1页 / 共13页
matlab系统仿真课设.docx_第2页
第2页 / 共13页
matlab系统仿真课设.docx_第3页
第3页 / 共13页
matlab系统仿真课设.docx_第4页
第4页 / 共13页
matlab系统仿真课设.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

matlab系统仿真课设.docx

《matlab系统仿真课设.docx》由会员分享,可在线阅读,更多相关《matlab系统仿真课设.docx(13页珍藏版)》请在冰豆网上搜索。

matlab系统仿真课设.docx

matlab系统仿真课设

《系统仿真与matlab》综合试题

 

题目:

香烟过滤嘴问题

编号:

11

姓名:

班级:

学号:

联系方式:

成绩:

 

1.1、问题描述………………………………………………………………………………………1

1.2、模型假设及要求………………………………………………………………………………1

2.1、模型构建………………………………………………………………………………………2

2.2、模型实现………………………………………………………………………………………3

3.1、运行指南………………………………………………………………………………………4

3.2、实例分析………………………………………………………………………………………5

4.程序代码………………………………………………………………………………………….7

 

1.1问题描述

香烟制造商既要满足瘾君子的需要,又要顺应减少吸烟危害的潮流.还要获取丰厚的利润.于是普遍地在香烟上安装了过滤嘴.过滤嘴的作用倒底有多大,与使用的材料和过滤嘴的长度有什么关系,要从定量的角度回答这些问题就要建立一个描述吸烟过程的数学模型.

吸烟时毒物吸入人体的过程大致是这样的:

毒物基本上均匀地分布在烟草中.吸烟时点燃处的烟草大部分化为烟雾,毒物由烟雾携带着一部分直接进入空中,另一部分沿香烟穿行.在穿行过程中又部分地被未点燃的烟草和过滤嘴吸收而沉积下来,剩下的进入人体.被烟草吸收而沉积下来的那一部分毒物,当香烟燃烧到那里的时候又通过烟雾部分进入空气,部分沿香烟穿行,这个过程一直继续到香烟燃烧至过滤嘴处为止.于是我们看到,原来分布在烟草中的毒物除了进入空气和被过滤嘴吸收的一部分外,剩下的全都被人体吸入。

实际的吸烟过程非常复杂并且因人而异.为了能建立一个初步的模型,可以认为毒物随烟雾进入空气和沿香烟穿行的数量比例、烟雾穿行的速度、过滤嘴和烟草对毒物的吸收率等在吸烟过程中都是常数.

1.2模型假设及要求

模型假设:

1.烟草和过滤嘴的长度分别是l1和l2,香烟总长l=l1+l2.毒物M(毫克)均匀分布在烟草中.密度为w0=M/l1.

2.点燃处毒物随烟雾进入空气和沿香烟穿行的数量比例是a’:

a,a’+a=1.

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

设距离烟草前端距离为x的界面为q(x,t),设各点烟雾毒物的密度为p(x,t),在点燃的瞬间有如下:

b∫p(x,0)dx0

q(x,0)-q(x+△x,0)=此式由物质守恒定律得

β∫p(x,0)dxl1

取△x趋近于0并将q(x,0)=v*p(x,0)带入可得:

bp(x)/v0

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

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

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{:

});

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.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 水产渔业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1