📄 fallfct.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 + -