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

📄 zuoyeview.cpp

📁 应用RBF网络构建函数模型
💻 CPP
字号:
// ZuoYeView.cpp : implementation of the CZuoYeView class
//

#include "stdafx.h"
#include "ZuoYe.h"

#include "ZuoYeDoc.h"
#include "ZuoYeView.h"
#include <math.h>

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

/////////////////////////////////////////////////////////////////////////////
// CZuoYeView

IMPLEMENT_DYNCREATE(CZuoYeView, CView)

BEGIN_MESSAGE_MAP(CZuoYeView, CView)
	//{{AFX_MSG_MAP(CZuoYeView)
	ON_COMMAND(ID_Fun, OnFun)
	ON_COMMAND(ID_Model, OnModel)
	ON_COMMAND(ID_w_Quan, OnwQuan)
	ON_COMMAND(ID_ModelCheck, OnModelCheck)
	ON_COMMAND(ID_Guiyihua, OnGuiyihua)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CZuoYeView construction/destruction

CZuoYeView::CZuoYeView()
{
	// TODO: add construction code here
	
}

CZuoYeView::~CZuoYeView()
{
}

BOOL CZuoYeView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CZuoYeView drawing

void CZuoYeView::OnDraw(CDC* pDC)
{
	CZuoYeDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CZuoYeView printing

BOOL CZuoYeView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CZuoYeView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CZuoYeView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CZuoYeView diagnostics

#ifdef _DEBUG
void CZuoYeView::AssertValid() const
{
	CView::AssertValid();
}

void CZuoYeView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CZuoYeDoc* CZuoYeView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CZuoYeDoc)));
	return (CZuoYeDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CZuoYeView message handlers

void CZuoYeView::OnFun() 
{
	// TODO: Add your command handler code here
	int i,j;

	X=new double *[NUM];
    if (X == NULL)                         //内存分配失败,终止运行
	{
		delete [] X;
	}
	for(i=0;i<NUM;i++)
	{
		X[i]=new double [WEISHU];
		if(X[i] == NULL)
		{
			delete [] X[i];
		}
	}

	y=new double [NUM];
    if (y == NULL)                         //内存分配失败,终止运行
	{
		delete [] y;
	}

	for(i=0;i<NUM;i++)
	{
		for(j=0;j<WEISHU;j++){
		X[i][j]=0;}
		y[i]=0;
	}

	srand( (unsigned)time( NULL ) ); 
	for(i=0;i<NUM;i++)
	{
		for(j=0;j<WEISHU;j++){
			X[i][j]=myrand(-10.0,10.0);}
	}
	for(i=0;i<NUM;i++)
	{
		y[i]=0.001*(4-2.1*(X[i][0])*(X[i][0])+(X[i][0])*(X[i][0])*(X[i][0])*(X[i][0])/3)*(X[i][0])*(X[i][0])+3.2*(X[i][0])*(X[i][1])+0.012*(-4+4*(X[i][1])*(X[i][1]))*(X[i][1])*(X[i][1])+1.5*(X[i][0]);
	}
//	for(i=0;i<NUM;i++)
//		y[i];
	MessageBox("函数定义完成!");
}


double CZuoYeView::myrand(double a,double b)
{
	double date;

	date= rand();
	date=a+date*(b-a)/32767;
	return date;
}

void CZuoYeView::OnModel() 
{
	// TODO: Add your command handler code here
	double *pianchaD,sum,pianjulibi,temp;
	int i,j,k,kding1,kding;

	yin_out=new double *[NUM];
    if (yin_out == NULL)                         //内存分配失败,终止运行
	{
		delete [] yin_out;
	}
	for (i=0; i<NUM; i++)
    {
       yin_out[i] = new double[YINJIEDIAN]; 
		if (yin_out[i] == NULL)	                 //内存分配失败,终止运行,并释放已经分配的 部分内存
		{
		delete [] yin_out[i];
		}
	}
	for(i=0;i<NUM;i++)
	{
		for(j=0;j<YINJIEDIAN;j++)
		{
			yin_out[i][j]=0;
		}
	}


	Kk=1;
	pianchaD=new double [YINJIEDIAN];
	if(pianchaD==NULL){
		delete [] pianchaD;}
	for(i=0;i<YINJIEDIAN;i++)
		pianchaD[i]=0;

	yin=new double *[YINJIEDIAN];
		if(yin==NULL){
		delete [] yin;}
		
	for(k=0;k<YINJIEDIAN;k++){
		yin[k]=new double [WEISHU];
		if(yin[k]==NULL){
			delete [] yin[k];}
	}
	for(i=0;i<YINJIEDIAN;i++){
		for(j=0;j<WEISHU;j++){
		yin[i][j]=0;}
	}

	for(j=0;j<WEISHU;j++)
		yin[0][j]=X[0][j];
	for(i=0;i<NUM;i++)
	{
		sum=0;
		for(k=0;k<Kk;k++)
		{
			sum=0;
			for(j=0;j<WEISHU;j++)
				sum=sum+(X[i][j]-yin[k][j])*(X[i][j]-yin[k][j]);
			pianchaD[k]=sqrt(sum);
		}
		temp=pianchaD[0];
		kding1=0;
		for(k=0;k<Kk;k++)
		{
			if(temp>pianchaD[k]){
				temp=pianchaD[k];
				kding1=kding;
				kding=k;}
			else 
				kding=kding1;
		}
		if(temp<=DISTANCE){
			pianjulibi=temp/DISTANCE;
			for(j=0;j<WEISHU;j++)
				yin[kding][j]=pianjulibi*yin[kding][j]+X[i][j]*(1-pianjulibi);}
		else if(temp>DISTANCE)
		{
			Kk=Kk+1;
			for(j=0;j<WEISHU;j++)
				yin[Kk-1][j]=X[i][j];
		}
	}
 /*	for(i=0;i<NUM;i++)
	{		
		for(k=0;k<Kk;k++)
		{
			sum=0;
			for(j=0;j<WEISHU;j++){
				sum=sum+(X[i][j]-yin[k][j])*(X[i][j]-yin[k][j]);}
			yin_out[i][k]=exp(-sum/(2*DISTANCE*DISTANCE));
		}
	}*/
 	MessageBox("网络建模完成!");
}

void CZuoYeView::OnwQuan() 
{
	// TODO: Add your command handler code here
	int i,j,k;
	double **tempfi,*tempy,sum=0,temp;

	w_quan=new double [Kk];
    if (w_quan == NULL)                         //内存分配失败,终止运行
	{
		delete [] w_quan;
	}
	for(i=0;i<Kk;i++)
		w_quan[i]=0;
	tempfi=new double *[Kk];
		if(tempfi==NULL){
		delete [] tempfi;}
		
	for(k=0;k<Kk;k++){
		tempfi[k]=new double [Kk*2];
		if(tempfi[k]==NULL){
			delete [] tempfi[k];}
	}
	for(i=0;i<Kk;i++){
		for(j=0;j<Kk*2;j++){
		tempfi[i][j]=0;}
	}
	for(i=0;i<Kk;i++){
		j=(Kk+i);
		tempfi[i][j]=1;}
	tempy=new double [Kk];
		if(tempy==NULL){
		delete [] tempy;}
	for(i=0;i<Kk;i++)
	{
		tempy[i]=0.001*(4-2.1*(yin[i][0])*(yin[i][0])+(yin[i][0])*(yin[i][0])*(yin[i][0])*(yin[i][0])/3)*(yin[i][0])*(yin[i][0])+3.2*(yin[i][0])*(yin[i][1])+0.012*(-4+4*(yin[i][1])*(yin[i][1]))*(yin[i][1])*(yin[i][1])+1.5*(yin[i][0]);
	tempy[i];
	}
	for(i=0;i<Kk;i++)
	{
		for(k=0;k<Kk;k++)
		{
			sum=0;
			for(j=0;j<WEISHU;j++){
				sum=sum+(yin[i][j]-yin[k][j])*(yin[i][j]-yin[k][j]);}
			tempfi[i][k]=exp(-sum/(2*DISTANCE*DISTANCE));
		}
	}

	for(i=1;i<Kk;i++){
		if(tempfi[i][0]!=0){
			for(k=0;k<Kk;k++)
			tempfi[0][k]=tempfi[0][k]+tempfi[i][k];
			break;}
		else
			i++;
	}
	//////////////Kk维单位矩阵求矩阵逆

	for(i=0;i<Kk;i++)
	{
		k=i;
		temp=tempfi[i][k];
		for(j=i;j<(Kk*2-1);j++)
		{
			tempfi[i][j]=tempfi[i][j]/temp;
		}

		for(k=(i+1);k<Kk;k++)
		{
			temp=tempfi[k][i];
			for(j=i;j<(Kk*2-1);j++){
				tempfi[k][j]=tempfi[k][j]-tempfi[i][j]*temp;}
		}
	}
	for(i=0;i<Kk;i++)
		for(k=0;k<(Kk*2-1);k++)
			tempfi[i][k];
	for(i=(Kk-1);i>=0;i--){
		for(k=(i-1);k>=0;k--){
			temp=tempfi[k][i];
			for(j=i;j<(Kk*2-1);j++){
				tempfi[k][j]=tempfi[k][j]-tempfi[i][j]*temp;}
		}
	}
	for(i=0;i<Kk;i++)
		for(k=Kk;k<(Kk*2-1);k++)
			tempfi[i][k];
	for(i=0;i<Kk;i++)
		for(j=Kk;j<(Kk*2-1);j++)
			w_quan[i]=w_quan[i]+tempfi[i][j]*tempy[j-Kk];
	for(i=0;i<Kk;i++)
		w_quan[i];
		
/*	w_quan=new double [YINJIEDIAN];
    if (w_quan == NULL)                         //内存分配失败,终止运行
	{
		delete [] w_quan;
	}	

	srand( (unsigned)time( NULL ) ); 
	for(i=0;i<YINJIEDIAN;i++){
		w_quan[i]=myrand(0,1);}
	for(i=0;i<NUM;i++)
	{
		A=0;
		for(k=0;k<Kk;k++){
			A=A+yin_out[i][k]*yin_out[i][k];}
		tempy=0;
		for(k=0;k<Kk;k++){
			tempy=tempy+yin_out[i][k]*w_quan[k];}
		for(k=0;k<Kk;k++){
			w_quan[k]=w_quan[k]+beita*(y[i]-tempy)*yin_out[i][k]/A;}
	}*/
 		MessageBox("权值调整成功!");
}

void CZuoYeView::OnModelCheck() 
{
	// TODO: Add your command handler code here
	int i ,j,k;
	double *tempy,sum=0;

    tempy= new double[CHECKNUM]; 
		if (tempy == NULL)	                 //内存分配失败,终止运行,并释放已经分配的 部分内存
		{
		delete [] tempy;
		}
		for(i=0;i<CHECKNUM;i++){
			tempy[i]=0;}
	srand( (unsigned)time( NULL ) ); 
	for(i=0;i<CHECKNUM;i++)
	{
		for(j=0;j<WEISHU;j++){
			X[i][j]=myrand(-8.0,8.0);}
	}
	for(i=0;i<CHECKNUM;i++)
	{
		y[i]=0.001*(4-2.1*(X[i][0])*(X[i][0])+(X[i][0])*(X[i][0])*(X[i][0])*(X[i][0])/3)*(X[i][0])*(X[i][0])+3.2*(X[i][0])*(X[i][1])+0.012*(-4+4*(X[i][1])*(X[i][1]))*(X[i][1])*(X[i][1])+1.5*(X[i][0]);
	}
/*	for(i=0;i<CHECKNUM;i++)
	{
		for(j=0;j<WEISHU;j++){		
			X[i][j]=(X[i][j]+10)/20;}
	}*/
 	for(i=0;i<CHECKNUM;i++)
	{		
		for(k=0;k<Kk;k++)
		{
			sum=0;
			for(j=0;j<WEISHU;j++){
				sum=sum+(X[i][j]-yin[k][j])*(X[i][j]-yin[k][j]);}
			yin_out[i][k]=exp(-sum/(2*DISTANCE*DISTANCE));
		}
	}
	for(i=0;i<CHECKNUM;i++)
	{
		for(k=0;k<Kk;k++){
			tempy[i]=tempy[i]+yin_out[i][k]*w_quan[k];}
	}
/*	for(i=0;i<CHECKNUM;i++)
	{
		tempy[i]=tempy[i]*(maxy-miny)+miny;
	}
*/
	CClientDC dc(this);
	dc.TextOut(20,400,"0");
	dc.MoveTo(30,400);
	dc.LineTo(30,20);
	dc.LineTo(25,25);
	dc.MoveTo(30,20);
	dc.LineTo(35,25);

	dc.MoveTo(30,400);
	dc.LineTo(30,750);
	///////////////////////////////
	
	dc.MoveTo(30,400);
	dc.LineTo(900,400);
	dc.LineTo(895,395);
	dc.MoveTo(900,400);
	dc.LineTo(895,405);

	for(i=1;i<10;i++)
	{
		dc.MoveTo(30+i*88,400);
		dc.LineTo(30+i*88,395);
		CString str;
		str.Format("%d",i*1);
		dc.TextOut(20+i*88,406,str);
	}
	CString str;
	str="数据序列";
	dc.TextOut(800,426,str);
	for(i=1;i<=5;i++)
	{
		dc.MoveTo(30,400-i*100);
		dc.LineTo(35,400-i*100);
		CString str;
		str.Format("%d",i*100);
		dc.TextOut(5,395-i*100,str);
	}
//	CString str="y值输出比较";
//	dc.TextOut(5,395-i*100,str);

	dc.MoveTo(30,400-int(tempy[0]));
	for(i=0,j=1;i<10;i++)
	{
		CPen pen(PS_SOLID,1,RGB(0,0,255));
		CPen *pOldpen=dc.SelectObject(&pen);
		dc.LineTo((30+88*j),(400-int(tempy[i])));
		j++;
	}
	dc.MoveTo(30,400-int(y[0]));
	for(i=0,j=1;i<10;i++)
	{
		CPen pen(PS_SOLID,1,RGB(225,0,0));
		CPen *pOldpen=dc.SelectObject(&pen);
		dc.LineTo((30+88*j),400-int(y[i]));
		j++;
	}

}

void CZuoYeView::OnGuiyihua() 
{/*
	// TODO: Add your command handler code here
	int i,j;
	
	maxy=0;
	miny=0;              
	
	for(j=0;j<WEISHU;j++){
		j=WEISHU;
		maxy=y[0];
		miny=y[0];
		for(i=0;i<NUM;i++){
			if(maxy<y[i]){
			maxy=y[i];}
			if(miny>y[i]){
			miny=y[i];}
		}
	}
	for(i=0;i<NUM;i++)
	{
		for(j=0;j<WEISHU;j++)
		{
			X[i][j]=(X[i][j]+10)/20;
		}
		j=WEISHU;
		y[i]=(y[i]-miny)/(maxy-miny);
	}*/
}

⌨️ 快捷键说明

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