3估计脉冲响应程序.docx
- 文档编号:8787248
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:20
- 大小:74.18KB
3估计脉冲响应程序.docx
《3估计脉冲响应程序.docx》由会员分享,可在线阅读,更多相关《3估计脉冲响应程序.docx(20页珍藏版)》请在冰点文库上搜索。
3估计脉冲响应程序
3.估计脉冲响应程序
程序运行界面如图:
运行顺序为:
①产生真值数据;②产生仿真数据;③产生辨识数据;④计算误差;⑤画曲线。
步骤④须在前③步完成后方能执行,步骤⑤最后执行。
模型1
程序共分6个模块。
●构造类CMyMatrix实现对矩阵的初始化、赋值、转置、相乘、求逆操作,代码见文件MyMtrix.h。
●产生真实数据利用系统响应函数
=
产生真实数据51个,保存于数组db_realdata[51]内,同时将数据写到文件中realdata.txt中,其实现代码见CidentifyDlg类的成员函数OnRealdata()。
单击“产生真实数据”按钮运行。
●产生仿真数据利用以下计算公式计算501组仿真数据:
仿真数据保存在数组db_simudata[501]内,同时将数据写到文件中simudata.txt中,其实现代码见CIdentifyDlg类的成员函数OnSimudata()。
单击“产生仿真数据”按钮运行。
●最小二乘辨识
y=[y(p)y(p+1)…y(p+m)]T
V=[v(p)v(p+1)…v(p+m)]T
G=[g(0)g
(1)…g(p)]T
W=
●在该模块内需进行矩阵的转置、相乘、求逆操作,需调用类CMyMatrixM的相关操作函数,其代码见CIdentifyDlg类的成员函数OnIdentidata()。
辨识的数据存于数组db_theata[51]内,同时将数据写到文件中identydata.txt中。
单击“产生辨识数据”按钮运行。
●误差计算error为辨识值与真实值之差的绝对值,将误差保存于数组db_error[51]中,同时将数据写到文件中errordata.txt内。
代码见CIdentifyDlg类的成员函数OnErrordata()。
单击“计算误差”按钮运行。
●绘制曲线程序运行如图所示。
图中绿色曲线为系统的真实响应,蓝色曲线为对该响应的辨识,红色为误差曲线。
画图代码见类CIdentifyDlg成员函数OnGraph()。
单击“显示曲线”按钮运行。
误差分析
误差曲线如图所示,总体误差平方和为:
e2=0.001121
3.估计脉冲响应源程序
//IdentifyDlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"Identify.h"
#include"IdentifyDlg.h"
#include"math.h"
#include"MSerial.h"
#include"WNoise.h"
#include"MyMatrix.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
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()
/////////////////////////////////////////////////////////////////////////////
//CIdentifyDlgdialog
CIdentifyDlg:
:
CIdentifyDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CIdentifyDlg:
:
IDD,pParent),p(51)
{
//{{AFX_DATA_INIT(CIdentifyDlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCIdentifyDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CIdentifyDlg)
//NOTE:
theClassWizardwilladdDDXandDDVcallshere
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CIdentifyDlg,CDialog)
//{{AFX_MSG_MAP(CIdentifyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_REALDATA,OnRealdata)
ON_BN_CLICKED(IDC_SIMUDATA,OnSimudata)
ON_BN_CLICKED(IDC_IDENTIDATA,OnIdentidata)
ON_BN_CLICKED(IDC_GRAPHIC,OnGraphic)
ON_BN_CLICKED(IDC_IDENTIFY,OnIdentify)
ON_BN_CLICKED(IDC_COMPUTEERR,OnComputeerr)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CIdentifyDlgmessagehandlers
BOOLCIdentifyDlg:
:
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
CWnd*pCanvas=GetDlgItem(IDC_CANVAS);
pCanvas->GetWindowRect(&m_nCanvas);
ScreenToClient(&m_nCanvas);
m_nCanvas.DeflateRect(2,2,1,1);
real_complete=FALSE;
simu_complete=FALSE;
theata_complete=FALSE;
error_complete=FALSE;
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCIdentifyDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCIdentifyDlg:
:
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
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCIdentifyDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCIdentifyDlg:
:
OnRealdata()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
doubled_sampletime=1;//采样时间
doublet=0;//时间
CFileDialogdlg(FALSE,"txt","realdata.txt",NULL,"textfiles(*.txt)|*.txt");
if(dlg.DoModal()==IDOK)
{
FILE*pf;
if((pf=fopen(dlg.GetPathName(),"w")))
{
for(inti=0;i<51;i++)
{
t=i*d_sampletime;
//真值数据保存在数组中
db_realdata[i]=0.25*exp(-0.5*t)-exp(-0.25*t)+0.75*exp(-1.0*t/6);
//数据写到文件中
fprintf(pf,"%f\n",db_realdata[i]);
}
}
fclose(pf);
real_complete=TRUE;
}
}
voidCIdentifyDlg:
:
OnSimudata()//产生仿真数据
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CFileDialogdlg(FALSE,"txt","simudata.txt",NULL,"textfiles(*.txt)|*.txt");
if(dlg.DoModal()==IDOK)
{
FILE*pf;
if((pf=fopen(dlg.GetPathName(),"w")))
{
CMSerialmserial(1,10);//m序列
CWNoisewnoise(0,0.1,600);//白噪声
doublesum[551];
for(inti=0;i<551;i++)
{
sum[i]=0;
}
mserial.initarray();
for(i=0;i<551;i++)
{
if(mserial.getserial())//产生M序列
db_u[i]=1;
else
db_u[i]=-1;
}
wnoise.initwhite();
for(i=0;i<551;i++)
{
db_v[i]=wnoise.createwhite(i);//产生白噪声
}
for(intk=0;k<501;k++)
{
for(i=k;i { sum[p+k]+=(0.25*exp(-0.5*(p+k-i))-exp(-0.25*(p+k-i))+0.75*exp(-1.0*(p+k-i)/6))*db_u[i]; } } for(i=0;i<551;i++) { db_simudata[i]=sum[i]+db_v[i]; fprintf(pf,"%f\n",db_simudata[i]); } fclose(pf); simu_complete=TRUE; } } } voidCIdentifyDlg: : OnIdentidata() { //TODO: Addyourcontrolnotificationhandlercodehere //产生矩阵yorz CFileDialogdlg(FALSE,"txt","identydata.txt",NULL,"textfiles(*.txt)|*.txt"); if(dlg.DoModal()==IDOK) { FILE*pf; if((pf=fopen(dlg.GetPathName(),"w"))) { CMyMatrixmatrixY(501,1);//500行 for(inti=0;i<501;i++) { matrixY.pdata[i][0]=db_simudata[p+i]; } //产生矩阵w(k) CMyMatrixmatrixW(501,51);//501行51列 for(i=0;i<501;i++) { for(intj=0;j { matrixW.pdata[i][j]=db_u[p+i-j]; } } CMyMatrixtransW(51,501); transW.Trans(matrixW);//求矩阵的转置Wt CMyMatrixmultiW(51,51); multiW.multi(transW,matrixW);//矩阵相乘Wt*W CMyMatrixinverseW(51,51); inverseW.Inverse(multiW);//矩阵(Wt*W)求逆 CMyMatrixmultiWiWt(51,501); multiWiWt.multi(inverseW,transW); CMyMatrixmultiWZ(51,1); multiWZ.multi(multiWiWt,matrixY); for(i=0;i { db_theata[i]=multiWZ.pdata[i][0]; fprintf(pf,"%f\n",db_theata[i]); } } fclose(pf); theata_complete=TRUE; } } voidCIdentifyDlg: : OnGraphic() { //TODO: Addyourcontrolnotificationhandlercodehere if(real_complete&&simu_complete&&theata_complete&&error_complete) { CClientDCdc(this); dc.SelectStockObject(WHITE_PEN); dc.Rectangle(m_nCanvas); dc.SelectStockObject(BLACK_PEN); CPointptstart(m_nCanvas.left,m_nCanvas.top+(m_nCanvas.bottom-m_nCanvas.top)/2); CPointptend(m_nCanvas.right,m_nCanvas.top+(m_nCanvas.bottom-m_nCanvas.top)/2); dc.MoveTo(ptstart); dc.LineTo(ptend); ptstart.x=m_nCanvas.left+(long)(0.01*(m_nCanvas.right-m_nCanvas.left)); ptstart.y=m_nCanvas.top; ptend.x=ptstart.x; ptend.y=m_nCanvas.bottom; dc.MoveTo(ptstart); dc.LineTo(ptend); CPointzero; zero.x=m_nCanvas.left+(long)(0.01*(m_nCanvas.right-m_nCanvas.left)); zero.y=m_nCanvas.top+(m_nCanvas.bottom-m_nCanvas.top)/2; ptstart=zero; CPenmpen1(0,1,RGB(0,255,0)); dc.SelectObject(mpen1); for(inti=0;i<51;i++) { ptend.x=zero.x+(i+1)*6; ptend.y=zero.y-long(db_realdata[i]*1000); dc.MoveTo(ptstart); dc.LineTo(ptend); ptstart=ptend; } CPenmpen2(0,1,RGB(100,0,255)); dc.SelectObject(mpen2); ptstart=zero; for(i=0;i<51;i++) { ptend.x=zero.x+(i+1)*6; ptend.y=zero.y-long(db_theata[i]*1000); dc.MoveTo(ptstart); dc.LineTo(ptend); ptstart=ptend; } CPenmpen3(0,1,RGB(255,0,0)); dc.SelectObject(mpen3); ptstart=zero; for(i=0;i<51;i++) { ptend.x=zero.x+(i+1)*6; ptend.y=zero.y-long(db_error[i]*1000); dc.MoveTo(ptstart); dc.LineTo(ptend); ptstart=ptend; } } else MessageBox("还有数据未产生,请产生完数据后再画线"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 估计 脉冲响应 程序