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

📄 fallfct.c

📁 matlab中kalman滤波程序包
💻 C
字号:
int fallobs(matrix *ybar, matrix *xbar, matrix *wmean, int flag);
int falltu(matrix *xbar, matrix *xhat, matrix *u, matrix *vmean, int flag);
int bodydot(matrix *xbar, matrix *xhat, matrix *u, matrix *vmean, int flag);

int fallobs(matrix *y, matrix *x, matrix *w, int flag)
{
   int i, j;
   double tmp;
   static double M, H;
   
   /* Initializations */
   if (flag == -1){
      M = rvget(y,1);
      H = rvget(y,2);
      return 0;
   }
   
   /* Clean up */
   else if (flag == -2){
      return 0;
   }
   
   /* Normal call of function */
   else{
      tmp = cvget(x,0)-H;
      cvput(y,0,sqrt(M*M+tmp*tmp)+cvget(w,0));
      return 0;
   }
}



int falltu(matrix *xbar, matrix *x, matrix *u, matrix *v, int flag)
{
   int i, nx=3;
   double *ptm1, *ptm2, *ptm3, *ptm4;
   static matrix *k, *xtmp;
   static double Ts, mfact;
   
   /* Initializations */
   if (flag == -1){
      Ts   = rvget(xbar,0);
      k    = mmake(nx,1); minit(k);
      xtmp = mmake(nx,1);
      mfact= Ts/6;
      bodydot(xbar,x,u,v,-1);
      return 0;
   }
   
   /* Clean up */
   else if (flag == -2){
      mfree(k); mfree(xtmp);
      return 0;
   }
   
   /* Normal call of function */
   else{
   
      /* Calculate k1, add k1/6 to x and prepare call of k2 */
      bodydot(k,x,u,v,0);
      ptm2=xtmp->mat[0]; ptm3=k->mat[0];
      ptm1=xbar->mat[0]; ptm4=x->mat[0]; 
      for(i=0; i<nx;i++){
         *(ptm1++) = *ptm4 + mfact* *ptm3;          /* xbar = x + k1/6   */ 
	 *(ptm2++) = *(ptm4++) + 0.5*Ts* *(ptm3++); /* xtmp = x + 0.5*k1 */ 
      }
      
      /* Calculate k2, add 2k2/6 to x and prepare call of k3 */
      bodydot(k,xtmp,u,v,0);
      ptm2=xtmp->mat[0]; ptm3=k->mat[0];
      ptm1=xbar->mat[0]; ptm4=x->mat[0]; 
      for(i=0; i<nx;i++){
         *(ptm1++) +=  2*mfact* *ptm3;              /* xbar = xbar + 2*k2/6 */ 
	 *(ptm2++) = *(ptm4++) + 0.5*Ts* *(ptm3++); /* xtmp = x + 0.5*k2    */ 
      }
      
      /* Calculate k3, add 2k3/6 to x and prepare call of k4 */
      bodydot(k,xtmp,u,v,0);
      ptm2=xtmp->mat[0]; ptm3=k->mat[0];
      ptm1=xbar->mat[0]; ptm4=x->mat[0]; 
      for(i=0; i<nx;i++){
         *(ptm1++) +=  2*mfact* *ptm3;              /* xbar = xbar + 2*k3/6 */ 
	 *(ptm2++) = *(ptm4++) + Ts* *(ptm3++);     /* xtmp = x + k3        */ 
      }
      
      /* Calculate k4, add k4/6 to x */
      bodydot(k,xtmp,u,v,0);
      ptm3=k->mat[0]; ptm1=xbar->mat[0]; 
      for(i=0; i<nx;i++){
         *(ptm1++) +=  mfact* *(ptm3++);            /* xbar = xbar + k4/6   */ 
      }
      return 0;
   }
}



int bodydot(matrix *xbar, matrix *x, matrix *u, matrix *v, int flag)
{
   double x2;
   static double gamma;
   
   /* Initializations */
   if (flag == -1){
      gamma = rvget(xbar,3);
      return 0;
   }
   
   /* Clean up */
   else if (flag == -2){
      return 0;
   }
   
   /* Normal call of function */
   else{
      x2 = cvget(x,1);
      cvput(xbar,0,-x2+cvget(v,0));
      cvput(xbar,1,-exp(-gamma*cvget(x,0))*x2*x2*cvget(x,2)+cvget(v,1));
      cvput(xbar,2,cvget(v,2));
      return 0;
   }
}

⌨️ 快捷键说明

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