基于vc++的模糊温度控制.docx
- 文档编号:5366685
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:19
- 大小:108.47KB
基于vc++的模糊温度控制.docx
《基于vc++的模糊温度控制.docx》由会员分享,可在线阅读,更多相关《基于vc++的模糊温度控制.docx(19页珍藏版)》请在冰豆网上搜索。
基于vc++的模糊温度控制
一模糊控制理论的产生及发展
模糊逻辑控制(FuzzyLogicControl)简称模糊控制(FuzzyControl),是以模糊集合论、模糊语言变量和模糊逻辑推理为基础的一种计算机数字控制技术。
1965年,美国的L.A.Zadeh创立了模糊集合论;1973年他给出了模糊逻辑控制的定义和相关的定理。
1974年,英国的E.H.Mamdani首先用模糊控制语句组成模糊控制器,并把它应用于锅炉和蒸汽机的控制,在实验室获得成功。
这一开拓性的工作标志着模糊控制论的诞生。
模糊控制实质上是一种非线性控制,从属于智能控制的范畴。
模糊控制的一大特点是既具有系统化的理论,又有着大量实际应用背景。
模糊控制的发展最初在西方遇到了较大的阻力;然而在东方尤其是在日本,却得到了迅速而广泛的推广应用。
近20多年来,模糊控制不论从理论上还是技术上都有了长足的进步,成为自动控制领域中一个非常活跃而又硕果累累的分支。
其典型应用的例子涉及生产和生活的许多方面,例如在家用电器设备中有模糊洗衣机、空调、微波炉、吸尘器、照相机和摄录机等;在工业控制领域中有水净化处理、发酵过程、化学反应釜、水泥窑炉等的模糊控制;在专用系统和其它方面有地铁靠站停车、汽车驾驶、电梯、自动扶梯、蒸汽引擎以及机器人的模糊控制等。
二模糊控制原理
1模糊控制器的基本结构
如下图所示,模糊控制器的基本结构包括知识库、模糊推理、输入量模糊化、输出量精确化四部分。
2知识库
知识库包括模糊控制器参数库和模糊控制规则库。
模糊控制规则建立在语言变量的基础上。
语言变量取值为“大”、“中”、“小”等这样的模糊子集,各模糊子集以隶属函数表明基本论域上的精确值属于该模糊子集的程度。
因此,为建立模糊控制规则,需要将基本论域上的精确值依据隶属函数归并到各模糊子集中,从而用语言变量值(大、中、小等)代替精确值。
这个过程代表了人在控制过程中对观察到的变量和控制量的模糊划分。
由于各变量取值范围各异,故首先将各基本论域分别以不同的对应关系,映射到一个标准化论域上。
通常,对应关系取为量化因子。
为便于处理,将标准论域等分离散化,然后对论域进行模糊划分,定义模糊子集,如NB、PZ、PS等。
同一个模糊控制规则库,对基本论域的模糊划分不同,控制效果也不同。
具体来说,对应关系、标推论域、模糊子集数以及各模糊子集的隶属函数都对控制效果有很大影响。
这3类参数与模糊控制规则具有同样的重要性,因此把它们归并为模糊控制器的参数库,与模糊控制规则库共同组成知识库。
模糊控制规则的来源有3条途径:
基于专家经验和实际操作,基于模糊模型,基于模糊控制的自学习。
3模糊化
将精确的输入量转化为模糊量F的两种方法:
(1)将精确量转化为标准论域上的模糊单点集。
精确量x经过对应关系G转换为标准论域x上的基本元素,则该元素的模糊单点集F为
(2)将精确量转换为标准论域上的模糊子集。
精确量经对应关系转换为标准论域上的基本元素,在该元素上具有最大隶属度的模糊子集,即为该精确量对应的模糊子集。
4模糊推理
最基本的模糊推理形式为:
前提1IFATHENB
前提2IFA’
结论THENB’
其中,A、A′为论域U上的模糊子集,B、B′为论域V上的模糊子集。
前提1称为模糊蕴涵关系,记为A→B。
在实际应用中,一般先针对各条规则进行推理,然后将各个推理结果总合而得到最终推理结果。
5精确化
推理得到的模糊子集要转换为精确值,以得到最终控制量输出y。
目前常用两种精确化方法:
(1)最大隶属度法。
在推理得到的模糊子集中,选取隶属度最大的标准论域元素的平均值作为精确化结果。
(2)重心法。
将推理得到的模糊子集的隶属函数与横坐标所围面积的重心所对应的标准论域元素作为精确化结果。
在得到推理结果精确值之后还应按对应关系得到最终控制量输出y。
三课程设计流程
(1)定义模糊变量
模糊变量就是检测的状态变量及控制动作。
在此温度模糊控制系统中,模糊变量定义为温度的输入偏差
以及温度的变化量de,输出量为u,
模糊变量的论域及其量化如表1所示,
表1语言变量的论域及其量化
e
-8
-6
-4
-2
0
2
4
6
8
论域
de
-80
-60
-40
-20
0
20
40
60
80
u
-10
-6
-5
-3
0
3
5
6
10
等级
-4
-3
-2
-1
0
1
2
3
4
量化
(2)确定模糊变量的隶属度函数
模糊变量的隶属度函数如表2所示,
表2模糊变量的隶属度函数
等级
-4
-3
-2
-1
0
1
2
3
4
PB
0
0
0
0
0
0
0
0.35
1
PS
0
0
0
0
0
0.4
1
0.4
0
ZE
0
0
0
0.2
1
0.2
0
0
0
NS
0
0.4
1
0.4
0
0
0
0
0
NB
1
0.35
0
0
0
0
0
0
0
(3)确定模糊规则
设计的模糊规则表如表3所示,
dee
NB
NS
ZE
PS
PB
NB
*
PB
PB
PS
NB
NS
PB
PS
PS
ZE
NB
ZE
PB
PS
ZE
NS
NB
PS
PB
ZE
NS
NS
NB
PB
PB
NS
NB
NB
*
下面通过一个简单的例子介绍一下模糊控制规则的应用:
设e=2,de=20,
由上面模糊控制规则可知:
(4)获得系统的模糊表
将e和de在不同量化等级下求出对应的u的量化登记,就得到了一张模糊表,实际应用过程中查表即可获得控制变量。
对于规则1
如果
且
,则
那么输入变量e的模糊子集为:
输入变量de的模糊子集为:
输入变量de的模糊子集为:
则a、b的笛卡尔乘积为
系统的关系矩阵为:
根据现在的输入状态,
,
其模糊自己为:
则,
模糊控制器的输出为:
即输出模糊子集为:
用同样的方法,对于规则2,可得
对这两个模糊子集进行并运算可得:
采用重心法求输出
.
将e和de在不同量化等级下求出对应的u的量化等级,从而得到一张“模糊表”,实际应用时查表即可得到控制变量。
四仿真结果
基于vc++的模糊温度控制结果如下图
1.输入的参数数据有:
温度负的最大值NB
温度负的较小值NS
温度零ZO
温度正的较小值PS
温度正的最大值PB
模糊域的大小 a
当前温度 currenttemperature
目标温度TargetTemperature
当前温度变化率TheRate
温控柔和度调整值AdjustmentK
2.计算并显示温度模糊控制的全过程
按下START键,左边框图开始分析温度变化的波形。
按下Pause/Restart键,系统重新暂停/重新载入。
3.实现纵向拉伸和横向拉伸温度的时间图。
按下程序右下角的四个箭头,可以实现已显示的图形横向和纵向的拉伸或挤压。
五附录程序
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CTemperDlgdialog
CTemperDlg:
:
CTemperDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CTemperDlg:
:
IDD,pParent)
{
inti=0;
for(i=0;i<5;i++)
b[i]=0.0f;
start=0;//shart=0,不开始演示。
start=1开始
//{{AFX_DATA_INIT(CTemperDlg)
m_curDE=0.0f;//设置初始化参数
m_a=2.0f;
m_curTemper=5.0f;
m_desTemper=2.0f;
m_nb=-4.0f;
m_ns=-2.0f;
m_pb=4.0f;
m_ps=2.0f;
m_zo=0.0f;
m_k=0.2f;
//}}AFX_DATA_INIT
b[0]=m_nb;
b[1]=m_ns;
b[2]=m_zo;
b[3]=m_ps;
b[4]=m_pb;
time=0;
oldTemper=0;
PIX_PER_MS=2;//单位时间表示的像素
PIX_PER_T=20;//单位温度表示的像素
TEMPNUM=155;
temper=newfloat[500];
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCTemperDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTemperDlg)
DDX_Text(pDX,IDC_CURDE,m_curDE);
DDX_Text(pDX,IDC_A,m_a);
DDX_Text(pDX,IDC_CURTEMP,m_curTemper);
DDX_Text(pDX,IDC_DESTEMP,m_desTemper);
DDX_Text(pDX,IDC_NB,m_nb);
DDX_Text(pDX,IDC_NS,m_ns);
DDX_Text(pDX,IDC_PB,m_pb);
DDX_Text(pDX,IDC_PS,m_ps);
DDX_Text(pDX,IDC_ZO,m_zo);
DDX_Text(pDX,IDC_K,m_k);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTemperDlg,CDialog)
//{{AFX_MSG_MAP(CTemperDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_ACK,OnAck)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_PAUSE,OnPause)
ON_BN_CLICKED(IDC_UP,OnUp)
ON_BN_CLICKED(IDC_DOWN,OnDown)
ON_BN_CLICKED(IDC_LEFT,OnLeft)
ON_BN_CLICKED(IDC_RIGHT,OnRight)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CTemperDlgmessagehandlers
BOOLCTemperDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCTemperDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCTemperDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
PAINTSTRUCTps;
CDC*pDC=BeginPaint(&ps);
//PaintFuzzyField(pDC);
PaintTemperChg(pDC);
EndPaint(&ps);
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCTemperDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCTemperDlg:
:
OnAck()//获得初始化数据
{
inti=0;
UpdateData(TRUE);//获取对话框控件的数据
PIX_PER_MS=2;//单位时间表示的像素
PIX_PER_T=20;//单位温度表示的像素
TEMPNUM=155;
b[0]=m_nb;
b[1]=m_ns;
b[2]=m_zo;
b[3]=m_ps;
b[4]=m_pb;
for(i=0;i<4;i++)
{
if(b[i]+m_a<=b[i+1]-m_a)
{
MessageBox("ERROR!
FuzzyFieldmustcoverallelements!
","ERROR",MB_ICONERROR|MB_OK);
return;
}
}
start=1;
curDE=m_curDE;
curTemper=m_curTemper;
oldTemper=m_curTemper;
desTemper=m_desTemper;
OnPaint();
RedrawWindow();
SetTimer(TIMER_1,10,NULL);
time=0;
}
voidCTemperDlg:
:
PaintFuzzyField(CDC*pDC)
{
floatoff=0.0;
inti=0;
chars[10];
off=Fabs(m_nb)>Fabs(m_pb)?
Fabs(m_nb):
Fabs(m_pb);
RECTrect={7,7,325,150};
off=off/((rect.right-rect.left)/2-10);
pDC->Rectangle(&rect);
//pDC->MoveTo(rect.left,(rect.top+rect.bottom)/2);
//pDC->LineTo(rect.right,(rect.top+rect.bottom)/2);
pDC->MoveTo((rect.left+rect.right)/2,rect.top);
pDC->LineTo((rect.left+rect.right)/2,rect.bottom);
if(start==1)
{
for(i=0;i<5;i++)
{
pDC->MoveTo(b[i]/off+(rect.left+rect.right)/2,rect.bottom);
if(i==0||i==4)
{
pDC->LineTo(b[i]/off+(rect.left+rect.right)/2,rect.top+20);
}
else
{
pDC->LineTo(b[i]/off+(rect.left+rect.right)/2,rect.bottom-10);
}
pDC->MoveTo(b[i]/off+(rect.left+rect.right)/2,rect.top+20);
if(b[i]-m_a-b[0]>-0.001f)
{
pDC->LineTo((b[i]-m_a)/off+(rect.left+rect.right)/2,rect.bottom);
}
else
{
pDC->LineTo((b[0])/off+(rect.left+rect.right)/2,rect.bottom-(m_a-(b[i]-b[0]))/m_a*(rect.bottom-rect.top-20));
}
pDC->MoveTo(b[i]/off+(rect.left+rect.right)/2,rect.top+20);
if(b[i]+m_a-b[4]<0.001f)
{
pDC->LineTo((b[i]+m_a)/off+(rect.left+rect.right)/2,rect.bottom);
}
else
{
pDC->LineTo((b[4])/off+(rect.left+rect.right)/2,rect.bottom-(m_a-(b[4]-b[i]))/m_a*(rect.bottom-rect.top-20));
}
pDC->SetBkMode(TRANSPARENT);
sprintf(s,"%.1f",b[i]);
pDC->TextOut(b[i]/off+(rect.left+rect.right)/2-3,rect.bottom-18,s);
pDC->SetBkMode(OPAQUE);
}
}
}
voidCTem
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 vc 模糊 温度 控制