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

📄 sy2.cpp

📁 系统辨识高效程序
💻 CPP
字号:
#include <iostream.h>
#include <math.h>
#include <stdio.h>
#include <conio.h>
#define N 534
#define L 500
#define Nm 5
#define a 1
#define T0 1
#define sigma 1.0
#define Nv 12
#define mu 1

void mulmat(double* aa,double* b,double* c,int m,int n,int l)
{  int i,j,k;
   for(i=0;i<m;i++)
      for(j=0;j<l;j++)
	aa[i*l+j]=0;
   for(i=0;i<m;i++)
      for(j=0;j<l;j++)
       for(k=0;k<n;k++)
	  aa[i*l+j]+=b[i*n+k]*c[k*l+j];
}
void addmat(double*aa,double* b,double* c,int m,int n)
{  int i,j;
   for(i=0;i<m;i++)
      for(j=0;j<n;j++)
	aa[i*n+j]=0;
   for(i=0;i<m;i++)
      for(j=0;j<n;j++)
	  aa[i*n+j]=b[i*n+j]+c[i*n+j];

}
void kmulmat(double* aa,double* b,double k,int m,int n)
{  int i,j;
double xx,yy;
   for(i=0;i<m;i++)
      for(j=0;j<n;j++)
	aa[i*n+j]=0;
   for(i=0;i<m;i++)
      for(j=0;j<n;j++)
	 aa[i*n+j]=b[i*n+j]*k;
}
void submat(double* aa,double* b,double* c,int m,int n)
{  int i,j,k;
   double d[10*10];
   kmulmat(d,c,-1,m,n);
   addmat(aa,b,d,m,n);
}

void M_serial(double* u)
    { int i,k,m[Nm]={1,0,1,0,1};
//      FILE *fp;
//      fp=fopen("\\data.txt","a");
//      fprintf(fp,"%s","\n%the output of M_serial(u):\n");
      for(i=0;i<L;i++)
       { m[0]=(m[4]+m[1])%2;
	 for(k=Nm-1;k>0;k--) m[k]=m[k-1];
	 if(m[0]==0)   u[i]=1*a;
	 if(m[0]==1)   u[i]=-1*a;
//	 fprintf(fp,"%1.0f",u[i]);
//	 fputc(' ',fp);
//	 if(i%7==6) fprintf(fp,"%s","...\n");
       }
//      fclose(fp);
    }
void rand_N(double* u)
    { double kesi,sum;
      long x0,M;
      int i,k,A;
      M=32768;
      A=179;
      x0=11;
//      FILE *fp;
//      fp=fopen("\\data.txt","a");
//      fprintf(fp,"%s","\n%the output of rand_N(v):\n");
      for(k=0;k<L;k++)
	{ sum=0;
	  for(i=0;i<Nv;i++)
	   { x0=A*x0;
	     x0%=M;
	     kesi=double(x0)/M;
	     sum+=kesi;
	   }
      u[k]=0+sigma*(sum-6.0);
//      fprintf(fp,"%5.8f",u[k]);
//      fputc(' ',fp);
//      if(k%7==6)      fprintf(fp,"%s","...\n");
	}
//      fclose(fp);
    }
void gsout(double* u,double* z,double* v)
     {  double y[N],e[N];
	int k;
//	FILE *fp;
//	fp=fopen("\\data.txt","a");
//	fprintf(fp,"%s","\n%the output of gsout(G):\n");
	y[0]=0;e[0]=v[0];
	y[1]=u[0];e[1]=1.5*e[0]+v[1];
	for(k=2;k<L;k++)
	   {  y[k]=1.5*y[k-1]-0.7*y[k-2]+u[k-1]+0.5*u[k-2];
	      e[k]=1.5*e[k-1]-0.7*e[k-2]+v[k];
	   }
	for(k=0;k<L;k++)
	   {  z[k]=y[k]+e[k];
//	      fprintf(fp,"%5.8f",z[k]);
//	      fputc(' ',fp);
//	      if(k%7==6)  fprintf(fp,"%s","...\n");
	   }
//	fclose(fp);
     }
void makeh(double* h,double* z,double* u,int n,int k)
    { int i;
      for(i=0;i<n;i++)
	if(k-i-1>=0)
	{  h[i]=-z[k-i-1];
	   h[i+n]=u[k-i-1];
	}
	else
	{  h[i]=0;
	   h[i+n]=0;
	}
    }

void RFF(double* z,double* u,int n,double* sita,double* J)
    {int i,j,k;
     double P[400],K[20],h[20],eye[400],t1[400],t2[400],temp;
     for(i=0;i<2*n;i++)
	{ sita[i]=0.00001;
	  h[i]=0;
	  for(j=0;j<2*n;j++)
	      if(i==j)
	      {eye[i*2*n+j]=1;
	       P[i*2*n+j]=1000000;/*P(0)*/
	      }
	      else
	      {eye[i*2*n+j]=0;
	       P[i*2*n+j]=0;/*P(0)*/
	      }
	}
    (*J)=0;
     for(k=0;k<L;k++)
	{makeh(h,z,u,n,k);
	 mulmat(t1,h,sita,1,2*n,2*n);
	 (*J)+=(z[k]-(*t1))*(z[k]-(*t1));}
     makeh(h,z,u,n,0);
     for(k=1;k<L;k++)
	{  makeh(h,z,u,n,k);
	   /*-----J-----*/
	   mulmat(t1,h,sita,1,2*n,1);
	   temp=z[k]-(*t1);
	   mulmat(t1,h,P,1,2*n,2*n);
	   mulmat(t2,t1,h,1,2*n,1);
	   (*J)+=mu*temp*temp/(*t2+mu);
	   /*-----K-----*/
	   mulmat(t1,h,P,1,2*n,2*n);
	   mulmat(t2,t1,h,1,2*n,1);
	   temp=1.0/(*t2+mu);
	   mulmat(t1,P,h,2*n,2*n,1);
	   kmulmat(K,t1,temp,2*n,1);
	   /*-----P-----*/
	   mulmat(t1,K,h,2*n,1,2*n);
	   submat(t2,eye,t1,2*n,2*n);
	   mulmat(t1,t2,P,2*n,2*n,2*n);
	   kmulmat(P,t1,1.0/mu,2*n,2*n);
	   /*----sita----*/
	   mulmat(t1,h,sita,1,2*n,1);
	   temp=z[k]-(*t1);
	   kmulmat(t1,K,temp,2*n,1);
	   addmat(t2,sita,t1,2*n,1);
	   for(i=0;i<2*n;i++) sita[i]=t2[i];
	}
    }
void jamtosignal()
    {   double eita,sgmy,a0,a1,a2,b0,b1,b2;
	a0=1;	a1=-1.5;a2=0.7;
	b0=0;	b1=1;	b2=0.5;
	sgmy=pow(b0-b1,2)/(a0-a1);
	sgmy+=pow(b1*b1-pow(b2*a1/a0,2),2)/(a0*a0-pow(a2*a2/a0,2));
	sgmy+=b2*b2/a0;
	sgmy/=a0;
	eita=sqrt(sigma*sigma/sgmy);
	FILE *fp;
	fp=fopen("\\data.txt","a");
	fprintf(fp,"%s","\n%the output of jamtosignal(eita):\n");
	fprintf(fp,"%5.8f",eita);
	fclose(fp);
    }

void index(double* sita,int n)
    {int i;
     double k,ke,t1,t2,delta1,delta2,deltak,sita1[20]={-1.5,0.7,1,0.5,0,0,0,0,0,0,0,0};
     delta1=0;t1=0;t2=0;
     for(i=0;i<2*n;i++)
     {delta1+=pow((sita[i]-sita1[i])/sita1[i],2);
      t1+=pow(sita[i]-sita1[i],2);
      t2+=pow(sita1[i],2);
     }
     delta1=sqrt(delta1);
     delta2=sqrt(t1/t2);
     k=(1+0.5)/(1-1.5+0.7);
     t1=0;t2=0;
     for(i=0;i<n;i++)
     { t1+=sita[i+n];
       t2+=sita[i];
     }
     ke=t1/(1+t2);
     deltak=sqrt(fabs(k-ke)/k);
     FILE *fp;
     fp=fopen("\\data.txt","a");
     fprintf(fp,"%s","\n%the output of index(delta1):\n");
     fprintf(fp,"%5.8f",delta1);
     fprintf(fp,"%s","\n%the output of index(delta2):\n");
     fprintf(fp,"%5.8f",delta2);
     fprintf(fp,"%s","\n%the output of index(deltak):\n");
     fprintf(fp,"%5.8f",deltak);
     fprintf(fp,"%s","\n%the output of index(ke):\n");
     fprintf(fp,"%5.8f",ke);

     fclose(fp);
    }

void main()
    {   double u[N],z[N],v[N],tf,t,J1,J2;
	double sita[20]={0,0,0,0,0,0,0,0,0,0,0},tempsita[20],ramida;
	int i,n;
	FILE *fp;
	fp=fopen("\\data.txt","w+");
	fprintf(fp,"%s","\n%the output of pragramme:\n");
	fprintf(fp,"%s","\n%周超 200328014604111\n");
	fclose(fp);
	switch(L){
	case 100:tf=3.09;break;
	case 300:tf=3.03;break;
	case 500:tf=3.01;break;
	default: break;}
	rand_N(v);
	M_serial(u);
	gsout(u,z,v);
	J1=J2=1e10;n=1;
	t=tf+1;
	while(n<10 && t>tf)
	{  J1=J2;
	   for(i=0;i<2*n;i++) tempsita[i]=sita[i];
	   RFF(z,u,n,sita,&J2);
	   t=(J1-J2)/J2*(L-2*n)/2;
	   ramida=sqrt(J2/(L-2*n));
	   fp=fopen("\\data.txt","a");
	   fprintf(fp,"%s","\n%the output of RFF(J):\n");
	   fprintf(fp,"%s%d%s%5.8f%s%5.8f","  n=",n, "   J=",J2,"  t=",t);
	   fprintf(fp,"%s%5.8f","  ranmida=",ramida);
	   fprintf(fp,"%s","\n%the output of RFF(sita):\n");
	   for(i=0;i<2*n;i++)
	     { fprintf(fp,"%5.8f",sita[i]);
	       fputc(' ',fp); }
	    fputc('\n',fp);
	   fclose(fp);
	   n++;
	}
	jamtosignal();
	index(tempsita,2);
//	getch();

    }

⌨️ 快捷键说明

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