基于vc++的模糊温度控制Word下载.docx
- 文档编号:18348524
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:19
- 大小:108.47KB
基于vc++的模糊温度控制Word下载.docx
《基于vc++的模糊温度控制Word下载.docx》由会员分享,可在线阅读,更多相关《基于vc++的模糊温度控制Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
前提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
2
4
6
8
论域
de
-80
-60
-40
-20
20
40
60
80
u
-10
-5
-3
3
5
10
等级
-1
1
量化
(2)确定模糊变量的隶属度函数
模糊变量的隶属度函数如表2所示,
表2模糊变量的隶属度函数
PB
0.35
PS
0.4
ZE
0.2
NS
NB
(3)确定模糊规则
设计的模糊规则表如表3所示,
dee
*
下面通过一个简单的例子介绍一下模糊控制规则的应用:
设e=2,de=20,
由上面模糊控制规则可知:
(4)获得系统的模糊表
将e和de在不同量化等级下求出对应的u的量化登记,就得到了一张模糊表,实际应用过程中查表即可获得控制变量。
对于规则1
如果
且
,则
那么输入变量e的模糊子集为:
输入变量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;
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:
//{{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);
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)
//CTemperDlgmessagehandlers
BOOLCTemperDlg:
OnInitDialog()
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);
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'
smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);
//Setbigicon
SetIcon(m_hIcon,FALSE);
//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
OnSysCommand(UINTnID,LPARAMlParam)
if((nID&
0xFFF0)==IDM_ABOUTBOX)
CAboutDlgdlgAbout;
dlgAbout.DoModal();
else
CDialog:
OnSysCommand(nID,lParam);
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
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);
PAINTSTRUCTps;
CDC*pDC=BeginPaint(&
ps);
//PaintFuzzyField(pDC);
PaintTemperChg(pDC);
EndPaint(&
OnPaint();
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCTemperDlg:
OnQueryDragIcon()
return(HCURSOR)m_hIcon;
OnAck()//获得初始化数据
UpdateData(TRUE);
//获取对话框控件的数据
4;
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);
PaintFuzzyField(CDC*pDC)
floatoff=0.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(&
//pDC->
MoveTo(rect.left,(rect.top+rect.bottom)/2);
LineTo(rect.right,(rect.top+rect.bottom)/2);
MoveTo((rect.left+rect.right)/2,rect.top);
LineTo((rect.left+rect.right)/2,rect.bottom);
if(start==1)
for(i=0;
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
LineTo(b[i]/off+(rect.left+rect.right)/2,rect.bottom-10);
MoveTo(b[i]/off+(rect.left+rect.right)/2,rect.top+20);
if(b[i]-m_a-b[0]>
-0.001f)
LineTo((b[i]-m_a)/off+(rect.left+rect.right)/2,rect.bottom);
LineTo((b[0])/off+(rect.left+rect.right)/2,rect.bottom-(m_a-(b[i]-b[0]))/m_a*(rect.bottom-rect.top-20));
if(b[i]+m_a-b[4]<
0.001f)
LineTo((b[i]+m_a)/off+(rect.left+rect.right)/2,rect.bottom);
LineTo((b[4])/off+(rect.left+rect.right)/2,rect.bottom-(m_a-(b[4]-b[i]))/m_a*(rect.bottom-rect.top-20));
SetBkMode(TRANSPARENT);
sprintf(s,"
%.1f"
b[i]);
TextOut(b[i]/off+(rect.left+rect.right)/2-3,rect.bottom-18,s);
SetBkMode(OPAQUE);
voidCTem
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 vc 模糊 温度 控制
![提示](https://static.bdocx.com/images/bang_tan.gif)