⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 els_ro_aicdlg.cpp

📁 实现一次完成增广最小二乘法,主要用于系统模型辨识
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ELS_RO_AICDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ELS_RO_AIC.h"
#include "ELS_RO_AICDlg.h"

#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define A 179
#define PAI 3.1415926

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CELS_RO_AICDlg dialog

CELS_RO_AICDlg::CELS_RO_AICDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CELS_RO_AICDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CELS_RO_AICDlg)
	m_dwnVAR = 0.1;
	m_dwnMEAN = 0.0;
	m_nwnLEN = 600;
	m_nmVALn = 10;
	m_nmLOC = 103;
	m_nmLEN = 1023;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CELS_RO_AICDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CELS_RO_AICDlg)
	DDX_Control(pDX, IDC_EDIT_mLOC, m_CEdit_MLOC);
	DDX_Control(pDX, IDC_SPIN_MLOC, m_ctrMLOC);
	DDX_Text(pDX, IDC_EDIT_wnVAR, m_dwnVAR);
	DDX_Text(pDX, IDC_EDIT_wnMEAN, m_dwnMEAN);
	DDX_Text(pDX, IDC_EDIT_wnLEN, m_nwnLEN);
	DDX_Text(pDX, IDC_EDIT_mVALn, m_nmVALn);
	DDX_Text(pDX, IDC_EDIT_mLOC, m_nmLOC);
	DDX_Text(pDX, IDC_EDIT_mLEN, m_nmLEN);
	DDX_Control(pDX, IDC_STATIC_IDRefTEXT, m_ctrStaticIDRefText);
	DDX_Control(pDX, IDC_STATIC_ErrTEXT, m_ctrStaticErrText);
	DDX_Control(pDX, IDC_STATIC_GRAPH, m_ctrStaticGraph);
	DDX_Control(pDX, IDC_STATIC_RefTEXT, m_ctrStaticRefText);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CELS_RO_AICDlg, CDialog)
	//{{AFX_MSG_MAP(CELS_RO_AICDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_whitenoiseMAKE, OnBUTTONwhitenoiseMAKE)
	ON_BN_CLICKED(IDC_BUTTON_mSerialMAKE, OnBUTTONmSerialMAKE)
	ON_BN_CLICKED(IDC_BUTTON_ELS_RO_AIC, OnButtonElsRoAic)
	ON_EN_CHANGE(IDC_EDIT_mVALn, OnChangeEDITmVALn)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_RADIO_MODEL1, OnRadioModel1)
	ON_BN_CLICKED(IDC_RADIO_MODEL2, OnRadioModel2)
	ON_WM_LBUTTONDBLCLK()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CELS_RO_AICDlg message handlers

BOOL CELS_RO_AICDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	m_ctrMLOC.SetBuddy(&m_CEdit_MLOC);
	m_ctrMLOC.SetRange(0,m_nmLEN-m_nwnLEN);
	m_tempInt=NULL;
	CButton * pButton = (CButton *) this->GetDlgItem(IDC_RADIO_MODEL1);
	pButton->SetCheck(1);
	model=TRUE;
	ZZZ=NULL;
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CELS_RO_AICDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CELS_RO_AICDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CELS_RO_AICDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}



void CELS_RO_AICDlg::OnBUTTONwhitenoiseMAKE() 
{
	// TODO: Add your control notification handler code here
	//FILE *fp1;
	FILE *fp2;
	int N=m_nwnLEN+1;
	int i;
    double *inta1,*inta2;
	double *x1,*x2,*y1,*y2;
	inta1=(double*)malloc(N*sizeof(double));
	inta2=(double*)malloc(N*sizeof(double));
	x1=(double*)malloc((N+1)*sizeof(double));
	x2=(double*)malloc((N+1)*sizeof(double));
	y1=(double*)malloc(N*sizeof(double));
	y2=(double*)malloc(N*sizeof(double));
	x1[0]=11.0;
	x2[0]=13.0;
    junyun(N-1,x2,y2);
	junyun(N-1,x1,y1);
   if((fp2=fopen("WhiteNoise2.txt","w"))==NULL)
	{ 
		MessageBox("cannot open the file :WhiteNoise2.txt\n");
		return;
	}
    for (i=0;i<N-1;i++)
	{
		inta1[i]=sqrt(-2*log(y1[i]))*cos(2*PAI*y2[i])*sqrt(m_dwnVAR)+m_dwnMEAN;
		inta2[i]=sqrt(-2*log(y1[i]))*sin(2*PAI*y2[i])*sqrt(m_dwnVAR)+m_dwnMEAN;
		if(inta2[i]>0) fprintf(fp2," %3.12f   ",inta2[i]);
		else fprintf(fp2,"%3.12f   ",inta2[i]);
		if (((i+1)%10)==0)  fprintf(fp2,"\n");

    }
	fclose(fp2);
	free(inta1);
	free(inta2);
	free(x1);
	free(x2);
	free(y1);
	free(y2);
	return;
	
}

void CELS_RO_AICDlg::junyun(int n, double x[], double y[])
{

	int i,b;
	unsigned long c;
	c=4294967;
	for (i=1;i<=n+1;i++)
	{
		b=(int)(A*x[i-1])/c;
		x[i]=(A*x[i-1])-b*c;
		y[i-1]=x[i-1]/c;
    }
    return;

}

void CELS_RO_AICDlg::OnBUTTONmSerialMAKE() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	FILE *fp;
	int i,j;
	int m_nAmpMserial=1;
	m_nmLEN=(int)pow(2,m_nmVALn)-1;
	UpdateData(FALSE);
	int *yita,*u;
	u=(int *)malloc(m_nmLEN*sizeof(int));
	yita=(int *)malloc(m_nmLEN*sizeof(int));
	if((fp=fopen("MSerials.txt","w"))==NULL)
	{
		MessageBox("cannot open the file :MSerials.txt\n");
		return;
	}
	j=0;

	for(i=0;i<m_nmVALn;i++)
	{
		yita[i]=1;
		u[i]=yita[i]*m_nAmpMserial;
		fprintf(fp,"%3d ",u[i]);
		j++;
	}
	for(i=m_nmVALn;i<m_nmLEN;i++)
	{
		switch( m_nmVALn ) 
		{
		case 2:
		yita[i]=yita[i-m_nmVALn]^yita[i-1];
			break;
		case 3 :
		yita[i]=yita[i-m_nmVALn]^yita[i-2];
			break;
		case 4 :
		yita[i]=yita[i-m_nmVALn]^yita[i-3];
			break;
		case 5:
		yita[i]=yita[i-m_nmVALn]^yita[i-3];
			break;
		case 6 :
		yita[i]=yita[i-m_nmVALn]^yita[i-5];
			break;
		case 7 :
		yita[i]=yita[i-m_nmVALn]^yita[i-4];
			break;
		case 8:
		yita[i]=yita[i-m_nmVALn]^yita[i-7]^yita[i-6]^yita[i-1];
			break;
		case 9 :
		yita[i]=yita[i-m_nmVALn]^yita[i-5];
			break;
		case 10 :
		yita[i]=yita[i-m_nmVALn]^yita[i-7];
			break;
		case 11:
		yita[i]=yita[i-m_nmVALn]^yita[i-9];
			break;
		case 12 :
		yita[i]=yita[i-m_nmVALn]^yita[i-8]^yita[i-5]^yita[i-1];
			break;
		case 13 :
		yita[i]=yita[i-m_nmVALn]^yita[i-8]^yita[i-6]^yita[i-1];
			break;
		}
		
		u[i]=(2*yita[i]-1)*m_nAmpMserial;
		fprintf(fp,"%3d ",u[i]);
		j++;
		if(j==20)
		{
			fprintf(fp,"\n");
			j=0;
		}
	}
	fclose(fp);
	free(yita);
	free(u);
	
}

void CELS_RO_AICDlg::brinv(double *a, int n)
{

	int *is,*js,i,j,k,l,u,v;
    double d,p;
    is=(int *)malloc(n*sizeof(int));
    js=(int *)malloc(n*sizeof(int));
    for (k=0; k<=n-1; k++)
	{ d=0.0;
	for (i=k; i<=n-1; i++)
        for (j=k; j<=n-1; j++)
		{ l=i*n+j; p=fabs(a[l]);
		if (p>d) { d=p; is[k]=i; js[k]=j;}
		}
        if (d+1.0==1.0)
		{ free(is); free(js);
		return;
		}
        if (is[k]!=k)
			for (j=0; j<=n-1; j++)
            { u=k*n+j; v=is[k]*n+j;
			p=a[u]; a[u]=a[v]; a[v]=p;
            }
			if (js[k]!=k)
				for (i=0; i<=n-1; i++)
				{ u=i*n+k; v=i*n+js[k];
				p=a[u]; a[u]=a[v]; a[v]=p;
				}
				l=k*n+k;
				a[l]=1.0/a[l];
				for (j=0; j<=n-1; j++)
					if (j!=k)
					{ u=k*n+j; a[u]=a[u]*a[l];}
					for (i=0; i<=n-1; i++)
						if (i!=k)
							for (j=0; j<=n-1; j++)
								if (j!=k)
								{ u=i*n+j;
								a[u]=a[u]-a[i*n+k]*a[k*n+j];
								}
								for (i=0; i<=n-1; i++)
									if (i!=k)
									{ u=i*n+k; a[u]=-a[u]*a[l];}
	}
    for (k=n-1; k>=0; k--)
	{ if (js[k]!=k)
	for (j=0; j<=n-1; j++)
	{ u=k*n+j; v=js[k]*n+j;
	p=a[u]; a[u]=a[v]; a[v]=p;
	}
	if (is[k]!=k)
		for (i=0; i<=n-1; i++)
		{ u=i*n+k; v=i*n+is[k];
		p=a[u]; a[u]=a[v]; a[v]=p;
		}
	}
    free(is); 
	free(js);
    return;

}

void CELS_RO_AICDlg::brmul(double *a, double *b, int m, int n, int k, double *c)
{

	int i,j,l,u;
	for (i=0; i<=m-1; i++)
		for (j=0; j<=k-1; j++)
		{ 
			u=i*k+j; c[u]=0.0;
			for (l=0; l<=n-1; l++)
				c[u]=c[u]+a[i*n+l]*b[l*k+j];
		}
		return;

}

void CELS_RO_AICDlg::WriteMatrix2File(char *filename, double *a, int Length, int column)
{

	FILE *fp;
	int i,j;
	char fileName[30];
	strcpy(fileName,filename);
	strcat(fileName,".txt");
	if((fp=fopen(fileName,"w"))==NULL) return;
	for(i=0;i<Length;i++)
	{
		for(j=0;j<column;j++)
		{
			if(a[i*column+j]>=0)	fprintf(fp," %6.12f  ",a[i*column+j]);
			else fprintf(fp,"%6.12f  ",a[i*column+j]);
		}
		fprintf(fp,"\n");
	}
	fclose(fp);


}

void CELS_RO_AICDlg::OnButtonElsRoAic() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nIndex=3;
	if(m_nmLEN-m_nmLOC<m_nwnLEN)
	{
		MessageBox("所取M序列长度小于白噪声长度,请重新输入!");
		return;
	}

	ZZZ=(int*)calloc(m_nwnLEN*3,sizeof(int));//保存三组输出数据:模型、CAR、CARMA
	zzz=(double*)calloc(m_nwnLEN*3,sizeof(double));//保存三组输出数据:模型、CAR、CARMA

	z=(double*)calloc(m_nwnLEN,sizeof(double));
	u=(double*)calloc(m_nwnLEN+m_nmLOC,sizeof(double));
	e=(double*)calloc(m_nwnLEN,sizeof(double));

	//读入输入u[]和白噪声e[]
	FILE *fp1,*fp2;
	if((fp1=fopen("MSerials.txt","r"))==NULL)return;
	if((fp2=fopen("WhiteNoise2.txt","r"))==NULL)return; 
    for(int i=0;i<m_nwnLEN+m_nmLOC;i++)
    { 
		fscanf(fp1,"%lf ",&u[i]);
	}
    for(i=0;i<m_nwnLEN;i++)
    { 
		u[i]=u[i+m_nmLOC];//根据初始位置重新调整
	}
    for(i=0;i<m_nwnLEN;i++)
    { 
		fscanf(fp2,"%lf ",&e[i]);//此时的e 为程序生成的高斯白噪声
	}
	fclose(fp1);
    fclose(fp2);

	//用下式计算理论输出z[]
	if(model)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -