📄 neurodialog.cpp
字号:
// NeuroDialog.cpp : implementation file
//
#include "stdafx.h"
#include "neuro.h"
#include "NeuroDialog.h"
#include"math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CNeuroDialog dialog
CNeuroDialog::CNeuroDialog(CWnd* pParent /*=NULL*/)
: CDialog(CNeuroDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CNeuroDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CNeuroDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNeuroDialog)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNeuroDialog, CDialog)
//{{AFX_MSG_MAP(CNeuroDialog)
ON_BN_CLICKED(ID_Plot, OnPlot)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNeuroDialog message handlers
void CNeuroDialog::judge()
{//Invalidata();
if (rnadata1=="")
{
MessageBox("请输入k(模糊神经元增益)!");
flag=0;
}
else flag=1;
if (rnadata2=="")
{
MessageBox("请输入ke(模糊因子)!");
flag=0;
}
else flag=1;
if (rnadata3=="")
{
MessageBox("请输入kec(模糊因子)!");
flag=0;
}
else flag=1;
if (rnadata4=="")
{
MessageBox("请输入kf(反模糊化因子)!");
flag=0;
}
else flag=1;
}
BOOL CNeuroDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
flag=1;
rnadata1="";
rnadata2="";
rnadata3="";
rnadata4="";
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CNeuroDialog::OnPlot()
{ Invalidate(TRUE);
//CNeuroDialog::judge();
//CRESULT MsgDlg;
//MsgDlg.DoModal();
// TODO: Add your control notification handler code here
if (flag==1)
{
//CDialog::OnOK();
data1=(CEdit*)GetDlgItem(IDC_EDIT1);
data2=(CEdit*)GetDlgItem(IDC_EDIT2);
data3=(CEdit*)GetDlgItem(IDC_EDIT3);
data4=(CEdit*)GetDlgItem(IDC_EDIT4);
data5=(CEdit*)GetDlgItem(IDC_EDIT5);
data1->GetWindowText(rnadata1);
data2->GetWindowText(rnadata2);
data3->GetWindowText(rnadata3);
data4->GetWindowText(rnadata4);
data5->GetWindowText(rnadata5);
double a1=atof(rnadata1);
double a2=atof(rnadata2);
double a3=atof(rnadata3);
double a4=atof(rnadata4);
double a5=atof(rnadata5);
double Fcm[10000];
double T[10000];
for(int h=0;h<1000;h++)
{T[h]=0;}
double num[3]={0,0.0018,0.0017};
double den[3]={1.0000,-1.9160,0.9194};
double x[2]={0,0};
double y[10]={0,0,0,0,0,0,0,0,0,0};
double e[10]={0,0,0,0,0,0,0,0,0,0};
double u[10]={0,0,0,0,0,0,0,0,0,0};
double f[10]={0,0,0,0,0,0,0,0,0,0};
double Fc[10]={0,0,0,0,0,0,0,0,0,0};
int n=900;
double kf=1533.3;
double p=0.95;
double d[2]={20,20};
double w[2]={0.1,0.1};
int t;
double E;
double EC;
double Uf;
double delte;
double ppp;
double yr[10000];
for(t=0;t<10000;t++)
{
yr[t]=1000;
if (t<2000)
ppp=1.0;
else if (t<4000)
ppp=1.5;
else if (t<6000)
ppp=2.0;
else if (t<8000)
ppp=2.5;
else
ppp=3.0;
e[0]=yr[t]-Fc[0];
delte=e[0]-e[1];
E=floor(a2*e[0]+0.5);
EC=floor(a3*delte+0.5);
Uf=a4*floor(a5*E+(1-a5)*EC+0.5);
x[0]=Uf;x[1]=x[1]+a1*Uf;
for (int z=9;z>=1;z--)
{
u[z]=u[z-1];
y[z]=y[z-1];
f[z]=f[z-1];
e[z]=e[z-1];
Fc[z]=Fc[z-1];
}
double s=0;double ss=0;
for (int i=0;i<=1;i++)
{
s=s+w[i]*x[i];
ss=ss+fabs(w[i]);
}
if (ss==0)
{ss=0.001;}//conversion from 'const double' to 'int', possible loss of data
u[0]=a1*s/ss;
y[0]=-den[1]*y[1]-den[2]*y[2]+num[1]*u[1]+num[2]*u[2];
f[0]=60*y[0]/n;
Fc[0]=ppp*kf*pow(f[0],p);
for (int j=0;j<=1;j++)
{w[j]=w[j]+d[j]*(yr[t]-y[0])*x[j];
}
Fcm[t]=Fc[0];
}
for(t=0;t<10000;t++)
{T[t+1]=T[t]+0.001;}
CPaintDC dc(this); // device context for painting
CDC *pDC=GetDC();
//初始化坐标值
double data_x[10000];
double data_y[10000];
for(int j=0;j<10000;j++)
{data_x[j]=T[j];
data_y[j]=Fcm[j];
}
//double initX[10]={1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0};
//double initY[10]={0.5,2.0,2.8,4.0,5.6,6.0,7.0,9.4,13.8,23.4};
//分别取得X和Y最大值,最小值
double maxX=data_x[0];
double minX=data_x[0];
double maxY=data_y[0];
double minY=data_y[0];
for(int i=0;i<10000;i++)
{
if(data_x[i]>maxX)
maxX=data_x[i];
if(data_x[i]<minX)
minX=data_x[i];
if(data_y[i]>maxY)
maxY=data_y[i];
if(data_y[i]<minY)
minY=data_y[i];
}
//如果原点必须在X轴上,加上下面2行,否则注释掉
if(minX>0)
minX=0;
//如果原点必须在Y轴上,加上下面2行,否则注释掉
if(minY>0)
minY=0;
//确定图象显示大小
//确定坐标图四周预留的空白大小
int width=300;
int height=300;
//确定坐标图四周预留的空白大小
const int mytop=60;
const int mybottom=10;
const int myleft=60;
const int myright=10;
//确定X,Y轴每单位显示宽度
double intervalX=(width-myleft-myright)/(maxX-minX);
double intervalY=(height-mybottom-mytop)/(maxY-minY);
//绘制曲线。由于绘图坐标的Y轴是向下延升,所以这里每个点的Y值是用
//图象高度减去y值大小。
pDC->MoveTo(int(myleft+(data_x[0]-minX)*intervalX),int(height-(mybottom+(data_y[0]-minY)*intervalY)));
for(i=0;i<10000;i++)
{
pDC->LineTo(int(myleft+(data_x[i]-minX)*intervalX),
int(height-(mybottom+(data_y[i]-minY)*intervalY)));
}
//绘制X,Y轴
//X轴从图形区域最左端到最右端
double bottomY=0;
double leftX=0;
//bottomY表示X轴的y值,leftX表示Y轴的x值
if(minY>0)
bottomY=minY;
if(minX>0)
leftX=minX;
pDC->MoveTo(int(myleft),int(height-(mybottom+(bottomY-minY)*intervalY)));
pDC->LineTo(int(width-myright),int(height-(mybottom+(bottomY-minY)*intervalY)));
//Y轴从图形区域最底端到最顶端
pDC->MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-mybottom));
pDC->LineTo(int(myleft+(leftX-minX)*intervalX),int(mytop));
//确定显示刻度个数
const int count=2;const int count1=3;
//确定每个显示刻度之间的宽度
double spaceX=(width-myleft-myright)/count;
double spaceY=(height-mybottom-mytop)/count1;
//绘制刻度和刻度值
CString str;
//X轴
for(i=0;i<=count;i++)
{
str.Format("%.1f",minX+i*(maxX-minX+1)/count);
pDC->MoveTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY)));
pDC->LineTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY+5)));
pDC->TextOut(int(myleft+spaceX*i-10),
int(height-(mybottom+(bottomY-minY)*intervalY-5)),str);
}
//Y轴
for(i=0;i<=count1;i++)
{
str.Format("%.1f",minY+i*(maxY-minY)/count1);
pDC->MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-(mybottom+spaceY*i)));
pDC->LineTo(int(myleft+(leftX-minX)*intervalX+5),int(height-(mybottom+spaceY*i)));
pDC->TextOut(int(myleft+(leftX-minX)*intervalX-50),
int(height-(mybottom+spaceY*i+8)),str);
}
//绘制X,Y轴的变量名
pDC->TextOut((width-myleft)/2,height-5,"t/s");
pDC->TextOut(30,height/2,"Fc/N");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -