摘要
本节将继续讲解ardupilot的EKF2代码,希望大家可以一起交流,有错的地方欢迎批评指正!!!
目录
1.EKF2的状态方程
(1)24维状态矢量
(2)24维状态方程
两个重要方程
1.我们首先找到程序中对应的状态方程
void NavEKF2_core::UpdateStrapdownEquationsNED()
{
stateStruct.quat.rotate(delAngCorrected - prevTnb * earthRateNED*imuDataDelayed.delAngDT);
stateStruct.quat.normalize();
Vector3f delVelNav;
delVelNav = prevTnb.mul_transpose(delVelCorrected);
delVelNav.z += GRAVITY_MSS*imuDataDelayed.delVelDT;
stateStruct.quat.inverse().rotation_matrix(prevTnb);
velDotNED = delVelNav / imuDataDelayed.delVelDT;
velDotNEDfilt = velDotNED * 0.05f + velDotNEDfilt * 0.95f ;
accNavMag = velDotNEDfilt.length();
accNavMagHoriz = norm(velDotNEDfilt.x , velDotNEDfilt.y);
if ((PV_AidingMode == AID_NONE) && (accNavMagHoriz > 5.0f ))
{
float gain = 5.0f /accNavMagHoriz;
delVelNav.x *= gain;
delVelNav.y *= gain;
}
Vector3f lastVelocity = stateStruct.velocity;
stateStruct.velocity += delVelNav;
stateStruct.position += (stateStruct.velocity + lastVelocity) * (imuDataDelayed.delVelDT*0.5f );
delAngBodyOF += delAngCorrected;
delTimeOF += imuDataDelayed.delAngDT;
ConstrainStates();
}
怎么求解F
我们看下代码怎么求解的F?这里我们先看仿真代码
在这里看仿真的矩阵F
//float F[24 ][24 ];
F[0 ][0 ] = 1;
F[0 ][1 ] = SF[9];
F[0 ][2 ] = SF[11];
F[0 ][3 ] = SF[10];
F[0 ][10 ] = SF[14];
F[0 ][11 ] = SF[15];
F[0 ][12 ] = SF[16];
F[1 ][0 ] = SF[8];
F[1 ][1 ] = 1;
F[1 ][2 ] = SF[7];
F[1 ][3 ] = SF[11];
F[1 ][10 ] = -q0/2;
F[1 ][11 ] = SF[16];
F[1 ][12 ] = -SF[15];
F[2 ][0 ] = SF[6];
F[2 ][1 ] = SF[10];
F[2 ][2 ] = 1;
F[2 ][3 ] = SF[8];
F[2 ][10 ] = -SF[16];
F[2 ][11 ] = -q0/2;
F[2 ][12 ] = SF[14];
F[3 ][0 ] = SF[7];
F[3 ][1 ] = SF[6];
F[3 ][2 ] = SF[9];
F[3 ][3 ] = 1;
F[3 ][10 ] = SF[15];
F[3 ][11 ] = -SF[14];
F[3 ][12 ] = -q0/2;
F[4 ][0 ] = SF[5];
F[4 ][1 ] = SF[3];
F[4 ][2 ] = SF[12] + SF[13] - 2*q2* SF[2];
F[4 ][3 ] = 2*q1* SF[0] - 2*q0* SF[1] - 2*q3* SF[2];
F[4 ][4 ] = 1;
F[4 ][13 ] = SF[17] + SF[18] - SF[19] - SF[20];
F[4 ][14 ] = 2*q0* q3 - 2*q1* q2;
F[4 ][15 ] = - 2*q0* q2 - 2*q1* q3;
F[5 ][0 ] = SF[4];
F[5 ][1 ] = 2*q2* SF[2] - SF[13] - SF[12];
F[5 ][2 ] = SF[3];
F[5 ][3 ] = SF[5];
F[5 ][5 ] = 1;
F[5 ][13 ] = - 2*q0* q3 - 2*q1* q2;
F[5 ][14 ] = SF[17] - SF[18] + SF[19] - SF[20];
F[5 ][15 ] = 2*q0* q1 - 2*q2* q3;
F[6 ][0 ] = SF[12] + SF[13] - 2*q2* SF[2];
F[6 ][1 ] = SF[4];
F[6 ][2 ] = 2*q3* SF[1] - 2*q2* SF[0] - 2*q0* SF[2];
F[6 ][3 ] = SF[3];
F[6 ][6 ] = 1;
F[6 ][13 ] = 2*q0* q2 - 2*q1* q3;
F[6 ][14 ] = - 2*q0* q1 - 2*q2* q3;
F[6 ][15 ] = SF[18] - SF[17] + SF[19] - SF[20];
F[7 ][4 ] = dt;
F[7 ][7 ] = 1;
F[8 ][5 ] = dt;
F[8 ][8 ] = 1;
F[9 ][6 ] = dt;
F[9 ][9 ] = 1;
F[10 ][10 ] = 1;
F[11 ][11 ] = 1;
F[12 ][12 ] = 1;
F[13 ][13 ] = 1;
F[14 ][14 ] = 1;
F[15 ][15 ] = 1;
F[16 ][16 ] = 1;
F[17 ][17 ] = 1;
F[18 ][18 ] = 1;
F[19 ][19 ] = 1;
F[20 ][20 ] = 1;
F[21 ][21 ] = 1;
F[22 ][22 ] = 1;
F[23 ][23 ] = 1;
看到这个F中包含SF,这是什么意思呢,经过仔细的研究,可以知道apm的EKF2进行了优化处理,
代码中用到的
float SF[21 ][1 ];
SF[0 ] = dvz - dvz_b;
SF[1 ] = dvy - dvy_b;
SF[2 ] = dvx - dvx_b;
SF[3 ] = 2 *q1 *SF [2 ] + 2 *q2 *SF [1 ] + 2 *q3 *SF [0 ];
SF[4 ] = 2 *q0 *SF [1 ] - 2 *q1 *SF [0 ] + 2 *q3 *SF [2 ];
SF[5 ] = 2 *q0 *SF [2 ] + 2 *q2 *SF [0 ] - 2 *q3 *SF [1 ];
SF[6 ] = day/2 - day_b/2 ;
SF[7 ] = daz/2 - daz_b/2 ;
SF[8 ] = dax/2 - dax_b/2 ;
SF[9 ] = dax_b/2 - dax/2 ;
SF[10 ] = daz_b/2 - daz/2 ;
SF[11 ] = day_b/2 - day/2 ;
SF[12 ] = 2 *q1 *SF [1 ];
SF[13 ] = 2 *q0 *SF [0 ];
SF[14 ] = q1/2 ;
SF[15 ] = q2/2 ;
SF[16 ] = q3/2 ;
SF[17 ] = s q(q3) ;
SF[18 ] = s q(q2) ;
SF[19 ] = s q(q1) ;
SF[20 ] = s q(q0) ;
apm代码中的SF(void NavEKF2_core::CovariancePrediction())
到这里F已经获取到,具体代码,将在第三讲推导,下面就是求取G
求解G
float G[24 ][6 ];
G[0 ][0 ] = -q1/2;
G[0 ][1 ] = -q2/2;
G[0 ][2 ] = -q3/2;
G[1 ][0 ] = SG[0];
G[1 ][1 ] = -q3/2;
G[1 ][2 ] = q2/2;
G[2 ][0 ] = q3/2;
G[2 ][1 ] = SG[0];
G[2 ][2 ] = -q1/2;
G[3 ][0 ] = -q2/2;
G[3 ][1 ] = q1/2;
G[3 ][2 ] = SG[0];
G[4 ][3 ] = SG[3] - SG[2] - SG[1] + SG[4];
G[4 ][4 ] = SG[7] - 2*q0* q3;
G[4 ][5 ] = SG[6] + 2*q0* q2;
G[5 ][3 ] = SG[7] + 2*q0* q3;
G[5 ][4 ] = SG[2] - SG[1] - SG[3] + SG[4];
G[5 ][5 ] = SG[5] - 2*q0* q1;
G[6 ][3 ] = SG[6] - 2*q0* q2;
G[6 ][4 ] = SG[5] + 2*q0* q1;
G[6 ][5 ] = SG[1] - SG[2] - SG[3] + SG[4];
代码中包含SG,也是优化了
float SG[8 ][1 ];
SG[0 ] = q 0 /2 ;
SG[1 ] = s q(q3) ;
SG[2 ] = s q(q2) ;
SG[3 ] = s q(q1) ;
SG[4 ] = s q(q0) ;
SG[5 ] = 2 *q2 *q3 ;
SG[6 ] = 2 *q1 *q3 ;
SG[7 ] = 2 *q1 *q2 ;
apm代码中
2.新的状态更新方程
3.求解协方差矩阵P
公式:PP = F*P*transpose(F) + Q;
SPP[0 ] = SF[17 ]*( 2 *q0 *q1 + 2 *q2 *q3 ) + SF[18 ]*( 2 *q0 *q2 - 2 *q1 *q3 );
SPP[1 ] = SF[18 ]*( 2 *q0 *q2 + 2 *q1 *q3 ) + SF[16 ]*( SF[24 ] - 2 *q0 *q3 );
SPP[2 ] = 2 *q3 *SF [8 ] + 2 *q1 *SF [11 ] - 2 *q0 *SF [14 ] - 2 *q2 *SF [13 ];
SPP[3 ] = 2 *q1 *SF [7 ] + 2 *q2 *SF [6 ] - 2 *q0 *SF [12 ] - 2 *q3 *SF [10 ];
SPP[4 ] = 2 *q0 *SF [6 ] - 2 *q3 *SF [7 ] - 2 *q1 *SF [10 ] + 2 *q2 *SF [12 ];
SPP[5 ] = 2 *q0 *SF [8 ] + 2 *q2 *SF [11 ] + 2 *q1 *SF [13 ] + 2 *q3 *SF [14 ];
SPP[6 ] = 2 *q0 *SF [7 ] + 2 *q3 *SF [6 ] + 2 *q2 *SF [10 ] + 2 *q1 *SF [12 ];
SPP[7 ] = SF[18 ]*SF [20 ] - SF[16 ]*( 2 *q0 *q1 + 2 *q2 *q3 );
SPP[8 ] = 2 *q1 *SF [3 ] - 2 *q2 *SF [4 ] - 2 *q3 *SF [5 ] + 2 *q0 *SF [9 ];
SPP[9 ] = 2 *q0 *SF [5 ] - 2 *q1 *SF [4 ] - 2 *q2 *SF [3 ] + 2 *q3 *SF [9 ];
SPP[10 ] = SF[17 ]*SF [20 ] + SF[16 ]*( 2 *q0 *q2 - 2 *q1 *q3 );
SPP[11 ] = SF[17 ]*SF [21 ] - SF[18 ]*( SF[24 ] + 2 *q0 *q3 );
SPP[12 ] = SF[17 ]*SF [22 ] - SF[16 ]*( SF[24 ] + 2 *q0 *q3 );
SPP[13 ] = 2 *q0 *SF [4 ] + 2 *q1 *SF [5 ] + 2 *q3 *SF [3 ] + 2 *q2 *SF [9 ];
SPP[14 ] = 2 *q2 *SF [8 ] - 2 *q0 *SF [11 ] - 2 *q1 *SF [14 ] + 2 *q3 *SF [13 ];
SPP[15 ] = SF[18 ]*SF [23 ] + SF[17 ]*( SF[24 ] - 2 *q0 *q3 );
SPP[16 ] = daz*SF [19 ] + daz*sq (q 0 ) + daz*sq (q1) + daz*sq (q3);
SPP[17 ] = day*SF [19 ] + day*sq (q 0 ) + day*sq (q1) + day*sq (q3);
SPP[18 ] = dax*SF [19 ] + dax*sq (q 0 ) + dax*sq (q1) + dax*sq (q3);
SPP[19 ] = SF[16 ]*SF [23 ] - SF[17 ]*( 2 *q0 *q2 + 2 *q1 *q3 );
SPP[20 ] = SF[16 ]*SF [21 ] - SF[18 ]*SF [22 ];
SPP[21 ] = 2 *q0 *q2 + 2 *q1 *q3 ;
SPP[22 ] = SF[15 ];
if (inhibitMagStates) {
zeroRows(P,16 ,21 );
zeroCols(P,16 ,21 );
} else if (inhibitWindStates) {
zeroRows(P,22 ,23 );
zeroCols(P,22 ,23 );
}
nextP[0 ][0 ] = daxNoise*SQ [3 ] + SPP[5 ]*( P[0 ][0 ]*SPP [5 ] - P[1 ][0 ]*SPP [4 ] + P[9 ][0 ]*SPP [22 ] + P[12 ][0 ]*SPP [18 ] + P[2 ][0 ]*( 2 *q1 *SF [3 ] - 2 *q2 *SF [4 ] - 2 *q3 *SF [5 ] + 2 *q0 *SF [9 ])) - SPP[4 ]*( P[0 ][1 ]*SPP [5 ] - P[1 ][1 ]*SPP [4 ] + P[9 ][1 ]*SPP [22 ] + P[12 ][1 ]*SPP [18 ] + P[2 ][1 ]*( 2 *q1 *SF [3 ] - 2 *q2 *SF [4 ] - 2 *q3 *SF [5 ] + 2 *q0 *SF [9 ])) + SPP[8 ]*( P[0 ][2 ]*SPP [5 ] + P[2 ][2 ]*SPP [8 ] + P[9 ][2 ]*SPP [22 ] + P[12 ][2 ]*SPP [18 ] - P[1 ][2 ]*( 2 *q0 *SF [6 ] - 2 *q3 *SF [7 ] - 2 *q1 *SF [10 ] + 2 *q2 *SF [12 ])) + SPP[22 ]*( P[0 ][9 ]*SPP [5 ] - P[1 ][9 ]*SPP [4 ] + P[9 ][9 ]*SPP [22 ] + P[12 ][9 ]*SPP [18 ] + P[2 ][9 ]*( 2 *q1 *SF [3 ] - 2 *q2 *SF [4 ] - 2 *q3 *SF [5 ] + 2 *q0 *SF [9 ])) + SPP[18 ]*( P[0 ][12 ]*SPP [5 ] - P[1 ][12 ]*SPP [4 ] + P[9 ][12 ]*SPP [22 ] + P[12 ][12 ]*SPP [18 ] + P[2 ][12 ]*( 2 *q1 *SF [3 ] - 2 *q2 *SF [4 ] - 2 *q3 *SF [5 ] + 2 *q0 *SF [9 ]));
nextP[0 ][1 ] = SPP[6 ]*( P[0 ][1 ]*SPP [5 ] - P[1 ][1 ]*SPP [4 ] + P[2 ][1 ]*SPP [8 ] + P[9 ][1 ]*SPP [22 ] + P[12 ][1 ]*SPP [18 ]) - SPP[2 ]*( P[0 ][0 ]*SPP [5 ] - P[1 ][0 ]*SPP [4 ] + P[2 ][0 ]*SPP [8 ] + P[9 ][0 ]*SPP [22 ] + P[12 ][0 ]*SPP [18 ]) + SPP[22 ]*( P[0 ][10 ]*SPP [5 ] - P[1 ][10 ]*SPP [4 ] + P[2 ][10 ]*SPP [8 ] + P[9 ][10 ]*SPP [22 ] + P[12 ][10 ]*SPP [18 ]) + SPP[17 ]*( P[0 ][13 ]*SPP [5 ] - P[1 ][13 ]*SPP [4 ] + P[2 ][13 ]*SPP [8 ] + P[9 ][13 ]*SPP [22 ] + P[12 ][13 ]*SPP [18 ]) - (2 *q0 *SF [5 ] - 2 *q1 *SF [4 ] - 2 *q2 *SF [3 ] + 2 *q3 *SF [9 ])*( P[0 ][2 ]*SPP [5 ] - P[1 ][2 ]*SPP [4 ] + P[2 ][2 ]*SPP [8 ] + P[9 ][2 ]*SPP [22 ] + P[12 ][2 ]*SPP [18 ]);
nextP[1 ][1 ] = dayNoise*SQ [3 ] - SPP[2 ]*( P[1 ][0 ]*SPP [6 ] - P[0 ][0 ]*SPP [2 ] - P[2 ][0 ]*SPP [9 ] + P[10 ][0 ]*SPP [22 ] + P[13 ][0 ]*SPP [17 ]) + SPP[6 ]*( P[1 ][1 ]*SPP [6 ] - P[0 ][1 ]*SPP [2 ] - P[2 ][1 ]*SPP [9 ] + P[10 ][1 ]*SPP [22 ] + P[13 ][1 ]*SPP [17 ]) - SPP[9 ]*( P[1 ][2 ]*SPP [6 ] - P[0 ][2 ]*SPP [2 ] - P[2 ][2 ]*SPP [9 ] + P[10 ][2 ]*SPP [22 ] + P[13 ][2 ]*SPP [17 ]) + SPP[22 ]*( P[1 ][10 ]*SPP [6 ] - P[0 ][10 ]*SPP [2 ] - P[2 ][10 ]*SPP [9 ] + P[10 ][10 ]*SPP [22 ] + P[13 ][10 ]*SPP [17 ]) + SPP[17 ]*( P[1 ][13 ]*SPP [6 ] - P[0 ][13 ]*SPP [2 ] - P[2 ][13 ]*SPP [9 ] + P[10 ][13 ]*SPP [22 ] + P[13 ][13 ]*SPP [17 ]);
nextP[0 ][2 ] = SPP[13 ]*( P[0 ][2 ]*SPP [5 ] - P[1 ][2 ]*SPP [4 ] + P[2 ][2 ]*SPP [8 ] + P[9 ][2 ]*SPP [22 ] + P[12 ][2 ]*SPP [18 ]) - SPP[3 ]*( P[0 ][1 ]*SPP [5 ] - P[1 ][1 ]*SPP [4 ] + P[2 ][1 ]*SPP [8 ] + P[9 ][1 ]*SPP [22 ] + P[12 ][1 ]*SPP [18 ]) + SPP[22 ]*( P[0 ][11 ]*SPP [5 ] - P[1 ][11 ]*SPP [4 ] + P[2 ][11 ]*SPP [8 ] + P[9 ][11 ]*SPP [22 ] + P[12 ][11 ]*SPP [18 ]) + SPP[16 ]*( P[0 ][14 ]*SPP [5 ] - P[1 ][14 ]*SPP [4 ] + P[2 ][14 ]*SPP [8 ] + P[9 ][14 ]*SPP [22 ] + P[12 ][14 ]*SPP [18 ]) + (2 *q2 *SF [8 ] - 2 *q0 *SF [11 ] - 2 *q1 *SF [14 ] + 2 *q3 *SF [13 ])*( P[0 ][0 ]*SPP [5 ] - P[1 ][0 ]*SPP [4 ] + P[2 ][0 ]*SPP [8 ] + P[9 ][0 ]*SPP [22 ] + P[12 ][0 ]*SPP [18 ]);
nextP[1 ][2 ] = SPP[13 ]*( P[1 ][2 ]*SPP [6 ] - P[0 ][2 ]*SPP [2 ] - P[2 ][2 ]*SPP [9 ] + P[10 ][2 ]*SPP [22 ] + P[13 ][2 ]*SPP [17 ]) - SPP[3 ]*( P[1 ][1 ]*SPP [6 ] - P[0 ][1 ]*SPP [2 ] - P[2 ][1 ]*SPP [9 ] + P[10 ][1 ]*SPP [22 ] + P[13 ][1 ]*SPP [17 ]) + SPP[22 ]*( P[1 ][11 ]*SPP [6 ] - P[0 ][11 ]*SPP [2 ] - P[2 ][11 ]*SPP [9 ] + P[10 ][11 ]*SPP [22 ] + P[13 ][11 ]*SPP [17 ]) + SPP[16 ]*( P[1 ][14 ]*SPP [6 ] - P[0 ][14 ]*SPP [2 ] - P[2 ][14 ]*SPP [9 ] + P[10 ][14 ]*SPP [22 ] + P[13 ][14 ]*SPP [17 ]) + (2 *q2 *SF [8 ] - 2 *q0 *SF [11 ] - 2 *q1 *SF [14 ] + 2 *q3 *SF [13 ])*( P[1 ][0 ]*SPP [6 ] - P[0 ][0 ]*SPP [2 ] - P[2 ][0 ]*SPP [9 ] + P[10 ][0 ]*SPP [22 ] + P[13 ][0 ]*SPP [17 ]);
nextP[2 ][2 ] = dazNoise*SQ [3 ] - SPP[3 ]*( P[0 ][1 ]*SPP [14 ] - P[1 ][1 ]*SPP [3 ] + P[2 ][1 ]*SPP [13 ] + P[11 ][1 ]*SPP [22 ] + P[14 ][1 ]*SPP [16 ]) + SPP[14 ]*( P[0 ][0 ]*SPP [14 ] - P[1 ][0 ]*SPP [3 ] + P[2 ][0 ]*SPP [13 ] + P[11 ][0 ]*SPP [22 ] + P[14 ][0 ]*SPP [16 ]) + SPP[13 ]*( P[0 ][2 ]*SPP [14 ] - P[1 ][2 ]*SPP [3 ] + P[2 ][2 ]*SPP [13 ] + P[11 ][2 ]*SPP [22 ] + P[14 ][2 ]*SPP [16 ]) + SPP[22 ]*( P[0 ][11 ]*SPP [14 ] - P[1 ][11 ]*SPP [3 ] + P[2 ][11 ]*SPP [13 ] + P[11 ][11 ]*SPP [22 ] + P[14 ][11 ]*SPP [16 ]) + SPP[16 ]*( P[0 ][14 ]*SPP [14 ] - P[1 ][14 ]*SPP [3 ] + P[2 ][14 ]*SPP [13 ] + P[11 ][14 ]*SPP [22 ] + P[14 ][14 ]*SPP [16 ]);
nextP[0 ][3 ] = P[0 ][3 ]*SPP [5 ] - P[1 ][3 ]*SPP [4 ] + P[2 ][3 ]*SPP [8 ] + P[9 ][3 ]*SPP [22 ] + P[12 ][3 ]*SPP [18 ] + SPP[1 ]*( P[0 ][0 ]*SPP [5 ] - P[1 ][0 ]*SPP [4 ] + P[2 ][0 ]*SPP [8 ] + P[9 ][0 ]*SPP [22 ] + P[12 ][0 ]*SPP [18 ]) + SPP[15 ]*( P[0 ][2 ]*SPP [5 ] - P[1 ][2 ]*SPP [4 ] + P[2 ][2 ]*SPP [8 ] + P[9 ][2 ]*SPP [22 ] + P[12 ][2 ]*SPP [18 ]) - SPP[21 ]*( P[0 ][15 ]*SPP [5 ] - P[1 ][15 ]*SPP [4 ] + P[2 ][15 ]*SPP [8 ] + P[9 ][15 ]*SPP [22 ] + P[12 ][15 ]*SPP [18 ]) + (SF[16 ]*SF [23 ] - SF[17 ]*SPP [21 ])*( P[0 ][1 ]*SPP [5 ] - P[1 ][1 ]*SPP [4 ] + P[2 ][1 ]*SPP [8 ] + P[9 ][1 ]*SPP [22 ] + P[12 ][1 ]*SPP [18 ]);
nextP[1 ][3 ] = P[1 ][3 ]*SPP [6 ] - P[0 ][3 ]*SPP [2 ] - P[2 ][3 ]*SPP [9 ] + P[10 ][3 ]*SPP [22 ] + P[13 ][3 ]*SPP [17 ] + SPP[1 ]*( P[1 ][0 ]*SPP [6 ] - P[0 ][0 ]*SPP [2 ] - P[2 ][0 ]*SPP [9 ] + P[10 ][0 ]*SPP [22 ] + P[13 ][0 ]*SPP [17 ]) + SPP[15 ]*( P[1 ][2 ]*SPP [6 ] - P[0 ][2 ]*SPP [2 ] - P[2 ][2 ]*SPP [9 ] + P[10 ][2 ]*SPP [22 ] + P[13 ][2 ]*SPP [17 ]) - SPP[21 ]*( P[1 ][15 ]*SPP [6 ] - P[0 ][15 ]*SPP [2 ] - P[2 ][15 ]*SPP [9 ] + P[10 ][15 ]*SPP [22 ] + P[13 ][15 ]*SPP [17 ]) + (SF[16 ]*SF [23 ] - SF[17 ]*SPP [21 ])*( P[1 ][1 ]*SPP [6 ] - P[0 ][1 ]*SPP [2 ] - P[2 ][1 ]*SPP [9 ] + P[10 ][1 ]*SPP [22 ] + P[13 ][1 ]*SPP [17 ]);
nextP[2 ][3 ] = P[0 ][3 ]*SPP [14 ] - P[1 ][3 ]*SPP [3 ] + P[2 ][3 ]*SPP [13 ] + P[11 ][3 ]*SPP [22 ] + P[14 ][3 ]*SPP [16 ] + SPP[1 ]*( P[0 ][0 ]*SPP [14 ] - P[1 ][0 ]*SPP [3 ] + P[2 ][0 ]*SPP [13 ] + P[11 ][0 ]*SPP [22 ] + P[14 ][0 ]*SPP [16 ]) + SPP[15 ]*( P[0 ][2 ]*SPP [14 ] - P[1 ][2 ]*SPP [3 ] + P[2 ][2 ]*SPP [13 ] + P[11 ][2 ]*SPP [22 ] + P[14 ][2 ]*SPP [16 ]) - SPP[21 ]*( P[0 ][15 ]*SPP [14 ] - P[1 ][15 ]*SPP [3 ] + P[2 ][15 ]*SPP [13 ] + P[11 ][15 ]*SPP [22 ] + P[14 ][15 ]*SPP [16 ]) + (SF[16 ]*SF [23 ] - SF[17 ]*SPP [21 ])*( P[0 ][1 ]*SPP [14 ] - P[1 ][1 ]*SPP [3 ] + P[2 ][1 ]*SPP [13 ] + P[11 ][1 ]*SPP [22 ] + P[14 ][1 ]*SPP [16 ]);
nextP[3 ][3 ] = P[3 ][3 ] + P[0 ][3 ]*SPP [1 ] + P[1 ][3 ]*SPP [19 ] + P[2 ][3 ]*SPP [15 ] - P[15 ][3 ]*SPP [21 ] + dvyNoise*sq (SQ[6 ] - 2 *q0 *q3 ) + dvzNoise*sq (SQ[5 ] + 2 *q0 *q2 ) + SPP[1 ]*( P[3 ][0 ] + P[0 ][0 ]*SPP [1 ] + P[1 ][0 ]*SPP [19 ] + P[2 ][0 ]*SPP [15 ] - P[15 ][0 ]*SPP [21 ]) + SPP[19 ]*( P[3 ][1 ] + P[0 ][1 ]*SPP [1 ] + P[1 ][1 ]*SPP [19 ] + P[2 ][1 ]*SPP [15 ] - P[15 ][1 ]*SPP [21 ]) + SPP[15 ]*( P[3 ][2 ] + P[0 ][2 ]*SPP [1 ] + P[1 ][2 ]*SPP [19 ] + P[2 ][2 ]*SPP [15 ] - P[15 ][2 ]*SPP [21 ]) - SPP[21 ]*( P[3 ][15 ] + P[0 ][15 ]*SPP [1 ] + P[2 ][15 ]*SPP [15 ] - P[15 ][15 ]*SPP [21 ] + P[1 ][15 ]*( SF[16 ]*SF [23 ] - SF[17 ]*SPP [21 ])) + dvxNoise*sq (SG[1 ] + SG[2 ] - SG[3 ] - SQ[7 ]);
nextP[0 ][4 ] = P[0 ][4 ]*SPP [5 ] - P[1 ][4 ]*SPP [4 ] + P[2 ][4 ]*SPP [8 ] + P[9 ][4 ]*SPP [22 ] + P[12 ][4 ]*SPP [18 ] + SF[22 ]*( P[0 ][15 ]*SPP [5 ] - P[1 ][15 ]*SPP [4 ] + P[2 ][15 ]*SPP [8 ] + P[9 ][15 ]*SPP [22 ] + P[12 ][15 ]*SPP [18 ]) + SPP[12 ]*( P[0 ][1 ]*SPP [5 ] - P[1 ][1 ]*SPP [4 ] + P[2 ][1 ]*SPP [8 ] + P[9 ][1 ]*SPP [22 ] + P[12 ][1 ]*SPP [18 ]) + SPP[20 ]*( P[0 ][0 ]*SPP [5 ] - P[1 ][0 ]*SPP [4 ] + P[2 ][0 ]*SPP [8 ] + P[9 ][0 ]*SPP [22 ] + P[12 ][0 ]*SPP [18 ]) + SPP[11 ]*( P[0 ][2 ]*SPP [5 ] - P[1 ][2 ]*SPP [4 ] + P[2 ][2 ]*SPP [8 ] + P[9 ][2 ]*SPP [22 ] + P[12 ][2 ]*SPP [18 ]);
nextP[1 ][4 ] = P[1 ][4 ]*SPP [6 ] - P[0 ][4 ]*SPP [2 ] - P[2 ][4 ]*SPP [9 ] + P[10 ][4 ]*SPP [22 ] + P[13 ][4 ]*SPP [17 ] + SF[22 ]*( P[1 ][15 ]*SPP [6 ] - P[0 ][15 ]*SPP [2 ] - P[2 ][15 ]*SPP [9 ] + P[10 ][15 ]*SPP [22 ] + P[13 ][15 ]*SPP [17 ]) + SPP[12 ]*( P[1 ][1 ]*SPP [6 ] - P[0 ][1 ]*SPP [2 ] - P[2 ][1 ]*SPP [9 ] + P[10 ][1 ]*SPP [22 ] + P[13 ][1 ]*SPP [17 ]) + SPP[20 ]*( P[1 ][0 ]*SPP [6 ] - P[0 ][0 ]*SPP [2 ] - P[2 ][0 ]*SPP [9 ] + P[10 ][0 ]*SPP [22 ] + P[13 ][0 ]*SPP [17 ]) + SPP[11 ]*( P[1 ][2 ]*SPP [6 ] - P[0 ][2 ]*SPP [2 ] - P[2 ][2 ]*SPP [9 ] + P[10 ][2 ]*SPP [22 ] + P[13 ][2 ]*SPP [17 ]);
nextP[2 ][4 ] = P[0 ][4 ]*SPP [14 ] - P[1 ][4 ]*SPP [3 ] + P[2 ][4 ]*SPP [13 ] + P[11 ][4 ]*SPP [22 ] + P[14 ][4 ]*SPP [16 ] + SF[22 ]*( P[0 ][15 ]*SPP [14 ] - P[1 ][15 ]*SPP [3 ] + P[2 ][15 ]*SPP [13 ] + P[11 ][15 ]*SPP [22 ] + P[14 ][15 ]*SPP [16 ]) + SPP[12 ]*( P[0 ][1 ]*SPP [14 ] - P[1 ][1 ]*SPP [3 ] + P[2 ][1 ]*SPP [13 ] + P[11 ][1 ]*SPP [22 ] + P[14 ][1 ]*SPP [16 ]) + SPP[20 ]*( P[0 ][0 ]*SPP [14 ] - P[1 ][0 ]*SPP [3 ] + P[2 ][0 ]*SPP [13 ] + P[11 ][0 ]*SPP [22 ] + P[14 ][0 ]*SPP [16 ]) + SPP[11 ]*( P[0 ][2 ]*SPP [14 ] - P[1 ][2 ]*SPP [3 ] + P[2 ][2 ]*SPP [13 ] + P[11 ][2 ]*SPP [22 ] + P[14 ][2 ]*SPP [16 ]);
nextP[3 ][4 ] = P[3 ][4 ] + SQ[2 ] + P[0 ][4 ]*SPP [1 ] + P[1 ][4 ]*SPP [19 ] + P[2 ][4 ]*SPP [15 ] - P[15 ][4 ]*SPP [21 ] + SF[22 ]*( P[3 ][15 ] + P[0 ][15 ]*SPP [1 ] + P[1 ][15 ]*SPP [19 ] + P[2 ][15 ]*SPP [15 ] - P[15 ][15 ]*SPP [21 ]) + SPP[12 ]*( P[3 ][1 ] + P[0 ][1 ]*SPP [1 ] + P[1 ][1 ]*SPP [19 ] + P[2 ][1 ]*SPP [15 ] - P[15 ][1 ]*SPP [21 ]) + SPP[20 ]*( P[3 ][0 ] + P[0 ][0 ]*SPP [1 ] + P[1 ][0 ]*SPP [19 ] + P[2 ][0 ]*SPP [15 ] - P[15 ][0 ]*SPP [21 ]) + SPP[11 ]*( P[3 ][2 ] + P[0 ][2 ]*SPP [1 ] + P[1 ][2 ]*SPP [19 ] + P[2 ][2 ]*SPP [15 ] - P[15 ][2 ]*SPP [21 ]);
nextP[4 ][4 ] = P[4 ][4 ] + P[15 ][4 ]*SF [22 ] + P[0 ][4 ]*SPP [20 ] + P[1 ][4 ]*SPP [12 ] + P[2 ][4 ]*SPP [11 ] + dvxNoise*sq (SQ[6 ] + 2 *q0 *q3 ) + dvzNoise*sq (SQ[4 ] - 2 *q0 *q1 ) + SF[22 ]*( P[4 ][15 ] + P[15 ][15 ]*SF [22 ] + P[0 ][15 ]*SPP [20 ] + P[1 ][15 ]*SPP [12 ] + P[2 ][15 ]*SPP [11 ]) + SPP[12 ]*( P[4 ][1 ] + P[15 ][1 ]*SF [22 ] + P[0 ][1 ]*SPP [20 ] + P[1 ][1 ]*SPP [12 ] + P[2 ][1 ]*SPP [11 ]) + SPP[20 ]*( P[4 ][0 ] + P[15 ][0 ]*SF [22 ] + P[0 ][0 ]*SPP [20 ] + P[1 ][0 ]*SPP [12 ] + P[2 ][0 ]*SPP [11 ]) + SPP[11 ]*( P[4 ][2 ] + P[15 ][2 ]*SF [22 ] + P[0 ][2 ]*SPP [20 ] + P[1 ][2 ]*SPP [12 ] + P[2 ][2 ]*SPP [11 ]) + dvyNoise*sq (SG[1 ] - SG[2 ] + SG[3 ] - SQ[7 ]);
nextP[0 ][5 ] = P[0 ][5 ]*SPP [5 ] - P[1 ][5 ]*SPP [4 ] + P[2 ][5 ]*SPP [8 ] + P[9 ][5 ]*SPP [22 ] + P[12 ][5 ]*SPP [18 ] + SF[20 ]*( P[0 ][15 ]*SPP [5 ] - P[1 ][15 ]*SPP [4 ] + P[2 ][15 ]*SPP [8 ] + P[9 ][15 ]*SPP [22 ] + P[12 ][15 ]*SPP [18 ]) - SPP[7 ]*( P[0 ][0 ]*SPP [5 ] - P[1 ][0 ]*SPP [4 ] + P[2 ][0 ]*SPP [8 ] + P[9 ][0 ]*SPP [22 ] + P[12 ][0 ]*SPP [18 ]) + SPP[0 ]*( P[0 ][2 ]*SPP [5 ] - P[1 ][2 ]*SPP [4 ] + P[2 ][2 ]*SPP [8 ] + P[9 ][2 ]*SPP [22 ] + P[12 ][2 ]*SPP [18 ]) + SPP[10 ]*( P[0 ][1 ]*SPP [5 ] - P[1 ][1 ]*SPP [4 ] + P[2 ][1 ]*SPP [8 ] + P[9 ][1 ]*SPP [22 ] + P[12 ][1 ]*SPP [18 ]);
nextP[1 ][5 ] = P[1 ][5 ]*SPP [6 ] - P[0 ][5 ]*SPP [2 ] - P[2 ][5 ]*SPP [9 ] + P[10 ][5 ]*SPP [22 ] + P[13 ][5 ]*SPP [17 ] + SF[20 ]*( P[1 ][15 ]*SPP [6 ] - P[0 ][15 ]*SPP [2 ] - P[2 ][15 ]*SPP [9 ] + P[10 ][15 ]*SPP [22 ] + P[13 ][15 ]*SPP [17 ]) - SPP[7 ]*( P[1 ][0 ]*SPP [6 ] - P[0 ][0 ]*SPP [2 ] - P[2 ][0 ]*SPP [9 ] + P[10 ][0 ]*SPP [22 ] + P[13 ][0 ]*SPP [17 ]) + SPP[0 ]*( P[1 ][2 ]*SPP [6 ] - P[0 ][2 ]*SPP [2 ] - P[2 ][2 ]*SPP [9 ] + P[10 ][2 ]*SPP [22 ] + P[13 ][2 ]*SPP [17 ]) + SPP[10 ]*( P[1 ][1 ]*SPP [6 ] - P[0 ][1 ]*SPP [2 ] - P[2 ][1 ]*SPP [9 ] + P[10 ][1 ]*SPP [22 ] + P[13 ][1 ]*SPP [17 ]);
nextP[2 ][5 ] = P[0 ][5 ]*SPP [14 ] - P[1 ][5 ]*SPP [3 ] + P[2 ][5 ]*SPP [13 ] + P[11 ][5 ]*SPP [22 ] + P[14 ][5 ]*SPP [16 ] + SF[20 ]*( P[0 ][15 ]*SPP [14 ] - P[1 ][15 ]*SPP [3 ] + P[2 ][15 ]*SPP [13 ] + P[11 ][15 ]*SPP [22 ] + P[14 ][15 ]*SPP [16 ]) - SPP[7 ]*( P[0 ][0 ]*SPP [14 ] - P[1 ][0 ]*SPP [3 ] + P[2 ][0 ]*SPP [13 ] + P[11 ][0 ]*SPP [22 ] + P[14 ][0 ]*SPP [16 ]) + SPP[0 ]*( P[0 ][2 ]*SPP [14 ] - P[1 ][2 ]*SPP [3 ] + P[2 ][2 ]*SPP [13 ] + P[11 ][2 ]*SPP [22 ] + P[14 ][2 ]*SPP [16 ]) + SPP[10 ]*( P[0 ][1 ]*SPP [14 ] - P[1 ][1 ]*SPP [3 ] + P[2 ][1 ]*SPP [13 ] + P[11 ][1 ]*SPP [22 ] + P[14 ][1 ]*SPP [16 ]);
nextP[3 ][5 ] = P[3 ][5 ] + SQ[1 ] + P[0 ][5 ]*SPP [1 ] + P[1 ][5 ]*SPP [19 ] + P[2 ][5 ]*SPP [15 ] - P[15 ][5 ]*SPP [21 ] + SF[20 ]*( P[3 ][15 ] + P[0 ][15 ]*SPP [1 ] + P[1 ][15 ]*SPP [19 ] + P[2 ][15 ]*SPP [15 ] - P[15 ][15 ]*SPP [21 ]) - SPP[7 ]*( P[3 ][0 ] + P[0 ][0 ]*SPP [1 ] + P[1 ][0 ]*SPP [19 ] + P[2 ][0 ]*SPP [15 ] - P[15 ][0 ]*SPP [21 ]) + SPP[0 ]*( P[3 ][2 ] + P[0 ][2 ]*SPP [1 ] + P[1 ][2 ]*SPP [19 ] + P[2 ][2 ]*SPP [15 ] - P[15 ][2 ]*SPP [21 ]) + SPP[10 ]*( P[3 ][1 ] + P[0 ][1 ]*SPP [1 ] + P[1 ][1 ]*SPP [19 ] + P[2 ][1 ]*SPP [15 ] - P[15 ][1 ]*SPP [21 ]);
nextP[4 ][5 ] = P[4 ][5 ] + SQ[0 ] + P[15 ][5 ]*SF [22 ] + P[0 ][5 ]*SPP [20 ] + P[1 ][5 ]*SPP [12 ] + P[2 ][5 ]*SPP [11 ] + SF[20 ]*( P[4 ][15 ] + P[15 ][15 ]*SF [22 ] + P[0 ][15 ]*SPP [20 ] + P[1 ][15 ]*SPP [12 ] + P[2 ][15 ]*SPP [11 ]) - SPP[7 ]*( P[4 ][0 ] + P[15 ][0 ]*SF [22 ] + P[0 ][0 ]*SPP [20 ] + P[1 ][0 ]*SPP [12 ] + P[2 ][0 ]*SPP [11 ]) + SPP[0 ]*( P[4 ][2 ] + P[15 ][2 ]*SF [22 ] + P[0 ][2 ]*SPP [20 ] + P[1 ][2 ]*SPP [12 ] + P[2 ][2 ]*SPP [11 ]) + SPP[10 ]*( P[4 ][1 ] + P[15 ][1 ]*SF [22 ] + P[0 ][1 ]*SPP [20 ] + P[1 ][1 ]*SPP [12 ] + P[2 ][1 ]*SPP [11 ]);
nextP[5 ][5 ] = P[5 ][5 ] + P[15 ][5 ]*SF [20 ] - P[0 ][5 ]*SPP [7 ] + P[1 ][5 ]*SPP [10 ] + P[2 ][5 ]*SPP [0 ] + dvxNoise*sq (SQ[5 ] - 2 *q0 *q2 ) + dvyNoise*sq (SQ[4 ] + 2 *q0 *q1 ) + SF[20 ]*( P[5 ][15 ] + P[15 ][15 ]*SF [20 ] - P[0 ][15 ]*SPP [7 ] + P[1 ][15 ]*SPP [10 ] + P[2 ][15 ]*SPP [0 ]) - SPP[7 ]*( P[5 ][0 ] + P[15 ][0 ]*SF [20 ] - P[0 ][0 ]*SPP [7 ] + P[1 ][0 ]*SPP [10 ] + P[2 ][0 ]*SPP [0 ]) + SPP[0 ]*( P[5 ][2 ] + P[15 ][2 ]*SF [20 ] - P[0 ][2 ]*SPP [7 ] + P[1 ][2 ]*SPP [10 ] + P[2 ][2 ]*SPP [0 ]) + SPP[10 ]*( P[5 ][1 ] + P[15 ][1 ]*SF [20 ] - P[0 ][1 ]*SPP [7 ] + P[1 ][1 ]*SPP [10 ] + P[2 ][1 ]*SPP [0 ]) + dvzNoise*sq (SG[1 ] - SG[2 ] - SG[3 ] + SQ[7 ]);
nextP[0 ][6 ] = P[0 ][6 ]*SPP [5 ] - P[1 ][6 ]*SPP [4 ] + P[2 ][6 ]*SPP [8 ] + P[9 ][6 ]*SPP [22 ] + P[12 ][6 ]*SPP [18 ] + dt*( P[0 ][3 ]*SPP [5 ] - P[1 ][3 ]*SPP [4 ] + P[2 ][3 ]*SPP [8 ] + P[9 ][3 ]*SPP [22 ] + P[12 ][3 ]*SPP [18 ]);
nextP[1 ][6 ] = P[1 ][6 ]*SPP [6 ] - P[0 ][6 ]*SPP [2 ] - P[2 ][6 ]*SPP [9 ] + P[10 ][6 ]*SPP [22 ] + P[13 ][6 ]*SPP [17 ] + dt*( P[1 ][3 ]*SPP [6 ] - P[0 ][3 ]*SPP [2 ] - P[2 ][3 ]*SPP [9 ] + P[10 ][3 ]*SPP [22 ] + P[13 ][3 ]*SPP [17 ]);
nextP[2 ][6 ] = P[0 ][6 ]*SPP [14 ] - P[1 ][6 ]*SPP [3 ] + P[2 ][6 ]*SPP [13 ] + P[11 ][6 ]*SPP [22 ] + P[14 ][6 ]*SPP [16 ] + dt*( P[0 ][3 ]*SPP [14 ] - P[1 ][3 ]*SPP [3 ] + P[2 ][3 ]*SPP [13 ] + P[11 ][3 ]*SPP [22 ] + P[14 ][3 ]*SPP [16 ]);
nextP[3 ][6 ] = P[3 ][6 ] + P[0 ][6 ]*SPP [1 ] + P[1 ][6 ]*SPP [19 ] + P[2 ][6 ]*SPP [15 ] - P[15 ][6 ]*SPP [21 ] + dt*( P[3 ][3 ] + P[0 ][3 ]*SPP [1 ] + P[1 ][3 ]*SPP [19 ] + P[2 ][3 ]*SPP [15 ] - P[15 ][3 ]*SPP [21 ]);
nextP[4 ][6 ] = P[4 ][6 ] + P[15 ][6 ]*SF [22 ] + P[0 ][6 ]*SPP [20 ] + P[1 ][6 ]*SPP [12 ] + P[2 ][6 ]*SPP [11 ] + dt*( P[4 ][3 ] + P[15 ][3 ]*SF [22 ] + P[0 ][3 ]*SPP [20 ] + P[1 ][3 ]*SPP [12 ] + P[2 ][3 ]*SPP [11 ]);
nextP[5 ][6 ] = P[5 ][6 ] + P[15 ][6 ]*SF [20 ] - P[0 ][6 ]*SPP [7 ] + P[1 ][6 ]*SPP [10 ] + P[2 ][6 ]*SPP [0 ] + dt*( P[5 ][3 ] + P[15 ][3 ]*SF [20 ] - P[0 ][3 ]*SPP [7 ] + P[1 ][3 ]*SPP [10 ] + P[2 ][3 ]*SPP [0 ]);
nextP[6 ][6 ] = P[6 ][6 ] + P[3 ][6 ]*dt + dt*( P[6 ][3 ] + P[3 ][3 ]*dt );
nextP[0 ][7 ] = P[0 ][7 ]*SPP [5 ] - P[1 ][7 ]*SPP [4 ] + P[2 ][7 ]*SPP [8 ] + P[9 ][7 ]*SPP [22 ] + P[12 ][7 ]*SPP [18 ] + dt*( P[0 ][4 ]*SPP [5 ] - P[1 ][4 ]*SPP [4 ] + P[2 ][4 ]*SPP [8 ] + P[9 ][4 ]*SPP [22 ] + P[12 ][4 ]*SPP [18 ]);
nextP[1 ][7 ] = P[1 ][7 ]*SPP [6 ] - P[0 ][7 ]*SPP [2 ] - P[2 ][7 ]*SPP [9 ] + P[10 ][7 ]*SPP [22 ] + P[13 ][7 ]*SPP [17 ] + dt*( P[1 ][4 ]*SPP [6 ] - P[0 ][4 ]*SPP [2 ] - P[2 ][4 ]*SPP [9 ] + P[10 ][4 ]*SPP [22 ] + P[13 ][4 ]*SPP [17 ]);
nextP[2 ][7 ] = P[0 ][7 ]*SPP [14 ] - P[1 ][7 ]*SPP [3 ] + P[2 ][7 ]*SPP [13 ] + P[11 ][7 ]*SPP [22 ] + P[14 ][7 ]*SPP [16 ] + dt*( P[0 ][4 ]*SPP [14 ] - P[1 ][4 ]*SPP [3 ] + P[2 ][4 ]*SPP [13 ] + P[11 ][4 ]*SPP [22 ] + P[14 ][4 ]*SPP [16 ]);
nextP[3 ][7 ] = P[3 ][7 ] + P[0 ][7 ]*SPP [1 ] + P[1 ][7 ]*SPP [19 ] + P[2 ][7 ]*SPP [15 ] - P[15 ][7 ]*SPP [21 ] + dt*( P[3 ][4 ] + P[0 ][4 ]*SPP [1 ] + P[1 ][4 ]*SPP [19 ] + P[2 ][4 ]*SPP [15 ] - P[15 ][4 ]*SPP [21 ]);
nextP[4 ][7 ] = P[4 ][7 ] + P[15 ][7 ]*SF [22 ] + P[0 ][7 ]*SPP [20 ] + P[1 ][7 ]*SPP [12 ] + P[2 ][7 ]*SPP [11 ] + dt*( P[4 ][4 ] + P[15 ][4 ]*SF [22 ] + P[0 ][4 ]*SPP [20 ] + P[1 ][4 ]*SPP [12 ] + P[2 ][4 ]*SPP [11 ]);
nextP[5 ][7 ] = P[5 ][7 ] + P[15 ][7 ]*SF [20 ] - P[0 ][7 ]*SPP [7 ] + P[1 ][7 ]*SPP [10 ] + P[2 ][7 ]*SPP [0 ] + dt*( P[5 ][4 ] + P[15 ][4 ]*SF [20 ] - P[0 ][4 ]*SPP [7 ] + P[1 ][4 ]*SPP [10 ] + P[2 ][4 ]*SPP [0 ]);
nextP[6 ][7 ] = P[6 ][7 ] + P[3 ][7 ]*dt + dt*( P[6 ][4 ] + P[3 ][4 ]*dt );
nextP[7 ][7 ] = P[7 ][7 ] + P[4 ][7 ]*dt + dt*( P[7 ][4 ] + P[4 ][4 ]*dt );
nextP[0 ][8 ] = P[0 ][8 ]*SPP [5 ] - P[1 ][8 ]*SPP [4 ] + P[2 ][8 ]*SPP [8 ] + P[9 ][8 ]*SPP [22 ] + P[12 ][8 ]*SPP [18 ] + dt*( P[0 ][5 ]*SPP [5 ] - P[1 ][5 ]*SPP [4 ] + P[2 ][5 ]*SPP [8 ] + P[9 ][5 ]*SPP [22 ] + P[12 ][5 ]*SPP [18 ]);
nextP[1 ][8 ] = P[1 ][8 ]*SPP [6 ] - P[0 ][8 ]*SPP [2 ] - P[2 ][8 ]*SPP [9 ] + P[10 ][8 ]*SPP [22 ] + P[13 ][8 ]*SPP [17 ] + dt*( P[1 ][5 ]*SPP [6 ] - P[0 ][5 ]*SPP [2 ] - P[2 ][5 ]*SPP [9 ] + P[10 ][5 ]*SPP [22 ] + P[13 ][5 ]*SPP [17 ]);
nextP[2 ][8 ] = P[0 ][8 ]*SPP [14 ] - P[1 ][8 ]*SPP [3 ] + P[2 ][8 ]*SPP [13 ] + P[11 ][8 ]*SPP [22 ] + P[14 ][8 ]*SPP [16 ] + dt*( P[0 ][5 ]*SPP [14 ] - P[1 ][5 ]*SPP [3 ] + P[2 ][5 ]*SPP [13 ] + P[11 ][5 ]*SPP [22 ] + P[14 ][5 ]*SPP [16 ]);
nextP[3 ][8 ] = P[3 ][8 ] + P[0 ][8 ]*SPP [1 ] + P[1 ][8 ]*SPP [19 ] + P[2 ][8 ]*SPP [15 ] - P[15 ][8 ]*SPP [21 ] + dt*( P[3 ][5 ] + P[0 ][5 ]*SPP [1 ] + P[1 ][5 ]*SPP [19 ] + P[2 ][5 ]*SPP [15 ] - P[15 ][5 ]*SPP [21 ]);
nextP[4 ][8 ] = P[4 ][8 ] + P[15 ][8 ]*SF [22 ] + P[0 ][8 ]*SPP [20 ] + P[1 ][8 ]*SPP [12 ] + P[2 ][8 ]*SPP [11 ] + dt*( P[4 ][5 ] + P[15 ][5 ]*SF [22 ] + P[0 ][5 ]*SPP [20 ] + P[1 ][5 ]*SPP [12 ] + P[2 ][5 ]*SPP [11 ]);
nextP[5 ][8 ] = P[5 ][8 ] + P[15 ][8 ]*SF [20 ] - P[0 ][8 ]*SPP [7 ] + P[1 ][8 ]*SPP [10 ] + P[2 ][8 ]*SPP [0 ] + dt*( P[5 ][5 ] + P[15 ][5 ]*SF [20 ] - P[0 ][5 ]*SPP [7 ] + P[1 ][5 ]*SPP [10 ] + P[2 ][5 ]*SPP [0 ]);
nextP[6 ][8 ] = P[6 ][8 ] + P[3 ][8 ]*dt + dt*( P[6 ][5 ] + P[3 ][5 ]*dt );
nextP[7 ][8 ] = P[7 ][8 ] + P[4 ][8 ]*dt + dt*( P[7 ][5 ] + P[4 ][5 ]*dt );
nextP[8 ][8 ] = P[8 ][8 ] + P[5 ][8 ]*dt + dt*( P[8 ][5 ] + P[5 ][5 ]*dt );
nextP[0 ][9 ] = P[0 ][9 ]*SPP [5 ] - P[1 ][9 ]*SPP [4 ] + P[2 ][9 ]*SPP [8 ] + P[9 ][9 ]*SPP [22 ] + P[12 ][9 ]*SPP [18 ];
nextP[1 ][9 ] = P[1 ][9 ]*SPP [6 ] - P[0 ][9 ]*SPP [2 ] - P[2 ][9 ]*SPP [9 ] + P[10 ][9 ]*SPP [22 ] + P[13 ][9 ]*SPP [17 ];
nextP[2 ][9 ] = P[0 ][9 ]*SPP [14 ] - P[1 ][9 ]*SPP [3 ] + P[2 ][9 ]*SPP [13 ] + P[11 ][9 ]*SPP [22 ] + P[14 ][9 ]*SPP [16 ];
nextP[3 ][9 ] = P[3 ][9 ] + P[0 ][9 ]*SPP [1 ] + P[1 ][9 ]*SPP [19 ] + P[2 ][9 ]*SPP [15 ] - P[15 ][9 ]*SPP [21 ];
nextP[4 ][9 ] = P[4 ][9 ] + P[15 ][9 ]*SF [22 ] + P[0 ][9 ]*SPP [20 ] + P[1 ][9 ]*SPP [12 ] + P[2 ][9 ]*SPP [11 ];
nextP[5 ][9 ] = P[5 ][9 ] + P[15 ][9 ]*SF [20 ] - P[0 ][9 ]*SPP [7 ] + P[1 ][9 ]*SPP [10 ] + P[2 ][9 ]*SPP [0 ];
nextP[6 ][9 ] = P[6 ][9 ] + P[3 ][9 ]*dt ;
nextP[7 ][9 ] = P[7 ][9 ] + P[4 ][9 ]*dt ;
nextP[8 ][9 ] = P[8 ][9 ] + P[5 ][9 ]*dt ;
nextP[9 ][9 ] = P[9 ][9 ];
nextP[0 ][10 ] = P[0 ][10 ]*SPP [5 ] - P[1 ][10 ]*SPP [4 ] + P[2 ][10 ]*SPP [8 ] + P[9 ][10 ]*SPP [22 ] + P[12 ][10 ]*SPP [18 ];
nextP[1 ][10 ] = P[1 ][10 ]*SPP [6 ] - P[0 ][10 ]*SPP [2 ] - P[2 ][10 ]*SPP [9 ] + P[10 ][10 ]*SPP [22 ] + P[13 ][10 ]*SPP [17 ];
nextP[2 ][10 ] = P[0 ][10 ]*SPP [14 ] - P[1 ][10 ]*SPP [3 ] + P[2 ][10 ]*SPP [13 ] + P[11 ][10 ]*SPP [22 ] + P[14 ][10 ]*SPP [16 ];
nextP[3 ][10 ] = P[3 ][10 ] + P[0 ][10 ]*SPP [1 ] + P[1 ][10 ]*SPP [19 ] + P[2 ][10 ]*SPP [15 ] - P[15 ][10 ]*SPP [21 ];
nextP[4 ][10 ] = P[4 ][10 ] + P[15 ][10 ]*SF [22 ] + P[0 ][10 ]*SPP [20 ] + P[1 ][10 ]*SPP [12 ] + P[2 ][10 ]*SPP [11 ];
nextP[5 ][10 ] = P[5 ][10 ] + P[15 ][10 ]*SF [20 ] - P[0 ][10 ]*SPP [7 ] + P[1 ][10 ]*SPP [10 ] + P[2 ][10 ]*SPP [0 ];
nextP[6 ][10 ] = P[6 ][10 ] + P[3 ][10 ]*dt ;
nextP[7 ][10 ] = P[7 ][10 ] + P[4 ][10 ]*dt ;
nextP[8 ][10 ] = P[8 ][10 ] + P[5 ][10 ]*dt ;
nextP[9 ][10 ] = P[9 ][10 ];
nextP[10 ][10 ] = P[10 ][10 ];
nextP[0 ][11 ] = P[0 ][11 ]*SPP [5 ] - P[1 ][11 ]*SPP [4 ] + P[2 ][11 ]*SPP [8 ] + P[9 ][11 ]*SPP [22 ] + P[12 ][11 ]*SPP [18 ];
nextP[1 ][11 ] = P[1 ][11 ]*SPP [6 ] - P[0 ][11 ]*SPP [2 ] - P[2 ][11 ]*SPP [9 ] + P[10 ][11 ]*SPP [22 ] + P[13 ][11 ]*SPP [17 ];
nextP[2 ][11 ] = P[0 ][11 ]*SPP [14 ] - P[1 ][11 ]*SPP [3 ] + P[2 ][11 ]*SPP [13 ] + P[11 ][11 ]*SPP [22 ] + P[14 ][11 ]*SPP [16 ];
nextP[3 ][11 ] = P[3 ][11 ] + P[0 ][11 ]*SPP [1 ] + P[1 ][11 ]*SPP [19 ] + P[2 ][11 ]*SPP [15 ] - P[15 ][11 ]*SPP [21 ];
nextP[4 ][11 ] = P[4 ][11 ] + P[15 ][11 ]*SF [22 ] + P[0 ][11 ]*SPP [20 ] + P[1 ][11 ]*SPP [12 ] + P[2 ][11 ]*SPP [11 ];
nextP[5 ][11 ] = P[5 ][11 ] + P[15 ][11 ]*SF [20 ] - P[0 ][11 ]*SPP [7 ] + P[1 ][11 ]*SPP [10 ] + P[2 ][11 ]*SPP [0 ];
nextP[6 ][11 ] = P[6 ][11 ] + P[3 ][11 ]*dt ;
nextP[7 ][11 ] = P[7 ][11 ] + P[4 ][11 ]*dt ;
nextP[8 ][11 ] = P[8 ][11 ] + P[5 ][11 ]*dt ;
nextP[9 ][11 ] = P[9 ][11 ];
nextP[10 ][11 ] = P[10 ][11 ];
nextP[11 ][11 ] = P[11 ][11 ];
nextP[0 ][12 ] = P[0 ][12 ]*SPP [5 ] - P[1 ][12 ]*SPP [4 ] + P[2 ][12 ]*SPP [8 ] + P[9 ][12 ]*SPP [22 ] + P[12 ][12 ]*SPP [18 ];
nextP[1 ][12 ] = P[1 ][12 ]*SPP [6 ] - P[0 ][12 ]*SPP [2 ] - P[2 ][12 ]*SPP [9 ] + P[10 ][12 ]*SPP [22 ] + P[13 ][12 ]*SPP [17 ];
nextP[2 ][12 ] = P[0 ][12 ]*SPP [14 ] - P[1 ][12 ]*SPP [3 ] + P[2 ][12 ]*SPP [13 ] + P[11 ][12 ]*SPP [22 ] + P[14 ][12 ]*SPP [16 ];
nextP[3 ][12 ] = P[3 ][12 ] + P[0 ][12 ]*SPP [1 ] + P[1 ][12 ]*SPP [19 ] + P[2 ][12 ]*SPP [15 ] - P[15 ][12 ]*SPP [21 ];
nextP[4 ][12 ] = P[4 ][12 ] + P[15 ][12 ]*SF [22 ] + P[0 ][12 ]*SPP [20 ] + P[1 ][12 ]*SPP [12 ] + P[2 ][12 ]*SPP [11 ];
nextP[5 ][12 ] = P[5 ][12 ] + P[15 ][12 ]*SF [20 ] - P[0 ][12 ]*SPP [7 ] + P[1 ][12 ]*SPP [10 ] + P[2 ][12 ]*SPP [0 ];
nextP[6 ][12 ] = P[6 ][12 ] + P[3 ][12 ]*dt ;
nextP[7 ][12 ] = P[7 ][12 ] + P[4 ][12 ]*dt ;
nextP[8 ][12 ] = P[8 ][12 ] + P[5 ][12 ]*dt ;
nextP[9 ][12 ] = P[9 ][12 ];
nextP[10 ][12 ] = P[10 ][12 ];
nextP[11 ][12 ] = P[11 ][12 ];
nextP[12 ][12 ] = P[12 ][12 ];
nextP[0 ][13 ] = P[0 ][13 ]*SPP [5 ] - P[1 ][13 ]*SPP [4 ] + P[2 ][13 ]*SPP [8 ] + P[9 ][13 ]*SPP [22 ] + P[12 ][13 ]*SPP [18 ];
nextP[1 ][13 ] = P[1 ][13 ]*SPP [6 ] - P[0 ][13 ]*SPP [2 ] - P[2 ][13 ]*SPP [9 ] + P[10 ][13 ]*SPP [22 ] + P[13 ][13 ]*SPP [17 ];
nextP[2 ][13 ] = P[0 ][13 ]*SPP [14 ] - P[1 ][13 ]*SPP [3 ] + P[2 ][13 ]*SPP [13 ] + P[11 ][13 ]*SPP [22 ] + P[14 ][13 ]*SPP [16 ];
nextP[3 ][13 ] = P[3 ][13 ] + P[0 ][13 ]*SPP [1 ] + P[1 ][13 ]*SPP [19 ] + P[2 ][13 ]*SPP [15 ] - P[15 ][13 ]*SPP [21 ];
nextP[4 ][13 ] = P[4 ][13 ] + P[15 ][13 ]*SF [22 ] + P[0 ][13 ]*SPP [20 ] + P[1 ][13 ]*SPP [12 ] + P[2 ][13 ]*SPP [11 ];
nextP[5 ][13 ] = P[5 ][13 ] + P[15 ][13 ]*SF [20 ] - P[0 ][13 ]*SPP [7 ] + P[1 ][13 ]*SPP [10 ] + P[2 ][13 ]*SPP [0 ];
nextP[6 ][13 ] = P[6 ][13 ] + P[3 ][13 ]*dt ;
nextP[7 ][13 ] = P[7 ][13 ] + P[4 ][13 ]*dt ;
nextP[8 ][13 ] = P[8 ][13 ] + P[5 ][13 ]*dt ;
nextP[9 ][13 ] = P[9 ][13 ];
nextP[10 ][13 ] = P[10 ][13 ];
nextP[11 ][13 ] = P[11 ][13 ];
nextP[12 ][13 ] = P[12 ][13 ];
nextP[13 ][13 ] = P[13 ][13 ];
nextP[0 ][14 ] = P[0 ][14 ]*SPP [5 ] - P[1 ][14 ]*SPP [4 ] + P[2 ][14 ]*SPP [8 ] + P[9 ][14 ]*SPP [22 ] + P[12 ][14 ]*SPP [18 ];
nextP[1 ][14 ] = P[1 ][14 ]*SPP [6 ] - P[0 ][14 ]*SPP [2 ] - P[2 ][14 ]*SPP [9 ] + P[10 ][14 ]*SPP [22 ] + P[13 ][14 ]*SPP [17 ];
nextP[2 ][14 ] = P[0 ][14 ]*SPP [14 ] - P[1 ][14 ]*SPP [3 ] + P[2 ][14 ]*SPP [13 ] + P[11 ][14 ]*SPP [22 ] + P[14 ][14 ]*SPP [16 ];
nextP[3 ][14 ] = P[3 ][14 ] + P[0 ][14 ]*SPP [1 ] + P[1 ][14 ]*SPP [19 ] + P[2 ][14 ]*SPP [15 ] - P[15 ][14 ]*SPP [21 ];
nextP[4 ][14 ] = P[4 ][14 ] + P[15 ][14 ]*SF [22 ] + P[0 ][14 ]*SPP [20 ] + P[1 ][14 ]*SPP [12 ] + P[2 ][14 ]*SPP [11 ];
nextP[5 ][14 ] = P[5 ][14 ] + P[15 ][14 ]*SF [20 ] - P[0 ][14 ]*SPP [7 ] + P[1 ][14 ]*SPP [10 ] + P[2 ][14 ]*SPP [0 ];
nextP[6 ][14 ] = P[6 ][14 ] + P[3 ][14 ]*dt ;
nextP[7 ][14 ] = P[7 ][14 ] + P[4 ][14 ]*dt ;
nextP[8 ][14 ] = P[8 ][14 ] + P[5 ][14 ]*dt ;
nextP[9 ][14 ] = P[9 ][14 ];
nextP[10 ][14 ] = P[10 ][14 ];
nextP[11 ][14 ] = P[11 ][14 ];
nextP[12 ][14 ] = P[12 ][14 ];
nextP[13 ][14 ] = P[13 ][14 ];
nextP[14 ][14 ] = P[14 ][14 ];
nextP[0 ][15 ] = P[0 ][15 ]*SPP [5 ] - P[1 ][15 ]*SPP [4 ] + P[2 ][15 ]*SPP [8 ] + P[9 ][15 ]*SPP [22 ] + P[12 ][15 ]*SPP [18 ];
nextP[1 ][15 ] = P[1 ][15 ]*SPP [6 ] - P[0 ][15 ]*SPP [2 ] - P[2 ][15 ]*SPP [9 ] + P[10 ][15 ]*SPP [22 ] + P[13 ][15 ]*SPP [17 ];
nextP[2 ][15 ] = P[0 ][15 ]*SPP [14 ] - P[1 ][15 ]*SPP [3 ] + P[2 ][15 ]*SPP [13 ] + P[11 ][15 ]*SPP [22 ] + P[14 ][15 ]*SPP [16 ];
nextP[3 ][15 ] = P[3 ][15 ] + P[0 ][15 ]*SPP [1 ] + P[1 ][15 ]*SPP [19 ] + P[2 ][15 ]*SPP [15 ] - P[15 ][15 ]*SPP [21 ];
nextP[4 ][15 ] = P[4 ][15 ] + P[15 ][15 ]*SF [22 ] + P[0 ][15 ]*SPP [20 ] + P[1 ][15 ]*SPP [12 ] + P[2 ][15 ]*SPP [11 ];
nextP[5 ][15 ] = P[5 ][15 ] + P[15 ][15 ]*SF [20 ] - P[0 ][15 ]*SPP [7 ] + P[1 ][15 ]*SPP [10 ] + P[2 ][15 ]*SPP [0 ];
nextP[6 ][15 ] = P[6 ][15 ] + P[3 ][15 ]*dt ;
nextP[7 ][15 ] = P[7 ][15 ] + P[4 ][15 ]*dt ;
nextP[8 ][15 ] = P[8 ][15 ] + P[5 ][15 ]*dt ;
nextP[9 ][15 ] = P[9 ][15 ];
nextP[10 ][15 ] = P[10 ][15 ];
nextP[11 ][15 ] = P[11 ][15 ];
nextP[12 ][15 ] = P[12 ][15 ];
nextP[13 ][15 ] = P[13 ][15 ];
nextP[14 ][15 ] = P[14 ][15 ];
nextP[15 ][15 ] = P[15 ][15 ];
if (stateIndexLim > 15 ) {
nextP[0 ][16 ] = P[0 ][16 ]*SPP [5 ] - P[1 ][16 ]*SPP [4 ] + P[2 ][16 ]*SPP [8 ] + P[9 ][16 ]*SPP [22 ] + P[12 ][16 ]*SPP [18 ];
nextP[1 ][16 ] = P[1 ][16 ]*SPP [6 ] - P[0 ][16 ]*SPP [2 ] - P[2 ][16 ]*SPP [9 ] + P[10 ][16 ]*SPP [22 ] + P[13 ][16 ]*SPP [17 ];
nextP[2 ][16 ] = P[0 ][16 ]*SPP [14 ] - P[1 ][16 ]*SPP [3 ] + P[2 ][16 ]*SPP [13 ] + P[11 ][16 ]*SPP [22 ] + P[14 ][16 ]*SPP [16 ];
nextP[3 ][16 ] = P[3 ][16 ] + P[0 ][16 ]*SPP [1 ] + P[1 ][16 ]*SPP [19 ] + P[2 ][16 ]*SPP [15 ] - P[15 ][16 ]*SPP [21 ];
nextP[4 ][16 ] = P[4 ][16 ] + P[15 ][16 ]*SF [22 ] + P[0 ][16 ]*SPP [20 ] + P[1 ][16 ]*SPP [12 ] + P[2 ][16 ]*SPP [11 ];
nextP[5 ][16 ] = P[5 ][16 ] + P[15 ][16 ]*SF [20 ] - P[0 ][16 ]*SPP [7 ] + P[1 ][16 ]*SPP [10 ] + P[2 ][16 ]*SPP [0 ];
nextP[6 ][16 ] = P[6 ][16 ] + P[3 ][16 ]*dt ;
nextP[7 ][16 ] = P[7 ][16 ] + P[4 ][16 ]*dt ;
nextP[8 ][16 ] = P[8 ][16 ] + P[5 ][16 ]*dt ;
nextP[9 ][16 ] = P[9 ][16 ];
nextP[10 ][16 ] = P[10 ][16 ];
nextP[11 ][16 ] = P[11 ][16 ];
nextP[12 ][16 ] = P[12 ][16 ];
nextP[13 ][16 ] = P[13 ][16 ];
nextP[14 ][16 ] = P[14 ][16 ];
nextP[15 ][16 ] = P[15 ][16 ];
nextP[16 ][16 ] = P[16 ][16 ];
nextP[0 ][17 ] = P[0 ][17 ]*SPP [5 ] - P[1 ][17 ]*SPP [4 ] + P[2 ][17 ]*SPP [8 ] + P[9 ][17 ]*SPP [22 ] + P[12 ][17 ]*SPP [18 ];
nextP[1 ][17 ] = P[1 ][17 ]*SPP [6 ] - P[0 ][17 ]*SPP [2 ] - P[2 ][17 ]*SPP [9 ] + P[10 ][17 ]*SPP [22 ] + P[13 ][17 ]*SPP [17 ];
nextP[2 ][17 ] = P[0 ][17 ]*SPP [14 ] - P[1 ][17 ]*SPP [3 ] + P[2 ][17 ]*SPP [13 ] + P[11 ][17 ]*SPP [22 ] + P[14 ][17 ]*SPP [16 ];
nextP[3 ][17 ] = P[3 ][17 ] + P[0 ][17 ]*SPP [1 ] + P[1 ][17 ]*SPP [19 ] + P[2 ][17 ]*SPP [15 ] - P[15 ][17 ]*SPP [21 ];
nextP[4 ][17 ] = P[4 ][17 ] + P[15 ][17 ]*SF [22 ] + P[0 ][17 ]*SPP [20 ] + P[1 ][17 ]*SPP [12 ] + P[2 ][17 ]*SPP [11 ];
nextP[5 ][17 ] = P[5 ][17 ] + P[15 ][17 ]*SF [20 ] - P[0 ][17 ]*SPP [7 ] + P[1 ][17 ]*SPP [10 ] + P[2 ][17 ]*SPP [0 ];
nextP[6 ][17 ] = P[6 ][17 ] + P[3 ][17 ]*dt ;
nextP[7 ][17 ] = P[7 ][17 ] + P[4 ][17 ]*dt ;
nextP[8 ][17 ] = P[8 ][17 ] + P[5 ][17 ]*dt ;
nextP[9 ][17 ] = P[9 ][17 ];
nextP[10 ][17 ] = P[10 ][17 ];
nextP[11 ][17 ] = P[11 ][17 ];
nextP[12 ][17 ] = P[12 ][17 ];
nextP[13 ][17 ] = P[13 ][17 ];
nextP[14 ][17 ] = P[14 ][17 ];
nextP[15 ][17 ] = P[15 ][17 ];
nextP[16 ][17 ] = P[16 ][17 ];
nextP[17 ][17 ] = P[17 ][17 ];
nextP[0 ][18 ] = P[0 ][18 ]*SPP [5 ] - P[1 ][18 ]*SPP [4 ] + P[2 ][18 ]*SPP [8 ] + P[9 ][18 ]*SPP [22 ] + P[12 ][18 ]*SPP [18 ];
nextP[1 ][18 ] = P[1 ][18 ]*SPP [6 ] - P[0 ][18 ]*SPP [2 ] - P[2 ][18 ]*SPP [9 ] + P[10 ][18 ]*SPP [22 ] + P[13 ][18 ]*SPP [17 ];
nextP[2 ][18 ] = P[0 ][18 ]*SPP [14 ] - P[1 ][18 ]*SPP [3 ] + P[2 ][18 ]*SPP [13 ] + P[11 ][18 ]*SPP [22 ] + P[14 ][18 ]*SPP [16 ];
nextP[3 ][18 ] = P[3 ][18 ] + P[0 ][18 ]*SPP [1 ] + P[1 ][18 ]*SPP [19 ] + P[2 ][18 ]*SPP [15 ] - P[15 ][18 ]*SPP [21 ];
nextP[4 ][18 ] = P[4 ][18 ] + P[15 ][18 ]*SF [22 ] + P[0 ][18 ]*SPP [20 ] + P[1 ][18 ]*SPP [12 ] + P[2 ][18 ]*SPP [11 ];
nextP[5 ][18 ] = P[5 ][18 ] + P[15 ][18 ]*SF [20 ] - P[0 ][18 ]*SPP [7 ] + P[1 ][18 ]*SPP [10 ] + P[2 ][18 ]*SPP [0 ];
nextP[6 ][18 ] = P[6 ][18 ] + P[3 ][18 ]*dt ;
nextP[7 ][18 ] = P[7 ][18 ] + P[4 ][18 ]*dt ;
nextP[8 ][18 ] = P[8 ][18 ] + P[5 ][18 ]*dt ;
nextP[9 ][18 ] = P[9 ][18 ];
nextP[10 ][18 ] = P[10 ][18 ];
nextP[11 ][18 ] = P[11 ][18 ];
nextP[12 ][18 ] = P[12 ][18 ];
nextP[13 ][18 ] = P[13 ][18 ];
nextP[14 ][18 ] = P[14 ][18 ];
nextP[15 ][18 ] = P[15 ][18 ];
nextP[16 ][18 ] = P[16 ][18 ];
nextP[17 ][18 ] = P[17 ][18 ];
nextP[18 ][18 ] = P[18 ][18 ];
nextP[0 ][19 ] = P[0 ][19 ]*SPP [5 ] - P[1 ][19 ]*SPP [4 ] + P[2 ][19 ]*SPP [8 ] + P[9 ][19 ]*SPP [22 ] + P[12 ][19 ]*SPP [18 ];
nextP[1 ][19 ] = P[1 ][19 ]*SPP [6 ] - P[0 ][19 ]*SPP [2 ] - P[2 ][19 ]*SPP [9 ] + P[10 ][19 ]*SPP [22 ] + P[13 ][19 ]*SPP [17 ];
nextP[2 ][19 ] = P[0 ][19 ]*SPP [14 ] - P[1 ][19 ]*SPP [3 ] + P[2 ][19 ]*SPP [13 ] + P[11 ][19 ]*SPP [22 ] + P[14 ][19 ]*SPP [16 ];
nextP[3 ][19 ] = P[3 ][19 ] + P[0 ][19 ]*SPP [1 ] + P[1 ][19 ]*SPP [19 ] + P[2 ][19 ]*SPP [15 ] - P[15 ][19 ]*SPP [21 ];
nextP[4 ][19 ] = P[4 ][19 ] + P[15 ][19 ]*SF [22 ] + P[0 ][19 ]*SPP [20 ] + P[1 ][19 ]*SPP [12 ] + P[2 ][19 ]*SPP [11 ];
nextP[5 ][19 ] = P[5 ][19 ] + P[15 ][19 ]*SF [20 ] - P[0 ][19 ]*SPP [7 ] + P[1 ][19 ]*SPP [10 ] + P[2 ][19 ]*SPP [0 ];
nextP[6 ][19 ] = P[6 ][19 ] + P[3 ][19 ]*dt ;
nextP[7 ][19 ] = P[7 ][19 ] + P[4 ][19 ]*dt ;
nextP[8 ][19 ] = P[8 ][19 ] + P[5 ][19 ]*dt ;
nextP[9 ][19 ] = P[9 ][19 ];
nextP[10 ][19 ] = P[10 ][19 ];
nextP[11 ][19 ] = P[11 ][19 ];
nextP[12 ][19 ] = P[12 ][19 ];
nextP[13 ][19 ] = P[13 ][19 ];
nextP[14 ][19 ] = P[14 ][19 ];
nextP[15 ][19 ] = P[15 ][19 ];
nextP[16 ][19 ] = P[16 ][19 ];
nextP[17 ][19 ] = P[17 ][19 ];
nextP[18 ][19 ] = P[18 ][19 ];
nextP[19 ][19 ] = P[19 ][19 ];
nextP[0 ][20 ] = P[0 ][20 ]*SPP [5 ] - P[1 ][20 ]*SPP [4 ] + P[2 ][20 ]*SPP [8 ] + P[9 ][20 ]*SPP [22 ] + P[12 ][20 ]*SPP [18 ];
nextP[1 ][20 ] = P[1 ][20 ]*SPP [6 ] - P[0 ][20 ]*SPP [2 ] - P[2 ][20 ]*SPP [9 ] + P[10 ][20 ]*SPP [22 ] + P[13 ][20 ]*SPP [17 ];
nextP[2 ][20 ] = P[0 ][20 ]*SPP [14 ] - P[1 ][20 ]*SPP [3 ] + P[2 ][20 ]*SPP [13 ] + P[11 ][20 ]*SPP [22 ] + P[14 ][20 ]*SPP [16 ];
nextP[3 ][20 ] = P[3 ][20 ] + P[0 ][20 ]*SPP [1 ] + P[1 ][20 ]*SPP [19 ] + P[2 ][20 ]*SPP [15 ] - P[15 ][20 ]*SPP [21 ];
nextP[4 ][20 ] = P[4 ][20 ] + P[15 ][20 ]*SF [22 ] + P[0 ][20 ]*SPP [20 ] + P[1 ][20 ]*SPP [12 ] + P[2 ][20 ]*SPP [11 ];
nextP[5 ][20 ] = P[5 ][20 ] + P[15 ][20 ]*SF [20 ] - P[0 ][20 ]*SPP [7 ] + P[1 ][20 ]*SPP [10 ] + P[2 ][20 ]*SPP [0 ];
nextP[6 ][20 ] = P[6 ][20 ] + P[3 ][20 ]*dt ;
nextP[7 ][20 ] = P[7 ][20 ] + P[4 ][20 ]*dt ;
nextP[8 ][20 ] = P[8 ][20 ] + P[5 ][20 ]*dt ;
nextP[9 ][20 ] = P[9 ][20 ];
nextP[10 ][20 ] = P[10 ][20 ];
nextP[11 ][20 ] = P[11 ][20 ];
nextP[12 ][20 ] = P[12 ][20 ];
nextP[13 ][20 ] = P[13 ][20 ];
nextP[14 ][20 ] = P[14 ][20 ];
nextP[15 ][20 ] = P[15 ][20 ];
nextP[16 ][20 ] = P[16 ][20 ];
nextP[17 ][20 ] = P[17 ][20 ];
nextP[18 ][20 ] = P[18 ][20 ];
nextP[19 ][20 ] = P[19 ][20 ];
nextP[20 ][20 ] = P[20 ][20 ];
nextP[0 ][21 ] = P[0 ][21 ]*SPP [5 ] - P[1 ][21 ]*SPP [4 ] + P[2 ][21 ]*SPP [8 ] + P[9 ][21 ]*SPP [22 ] + P[12 ][21 ]*SPP [18 ];
nextP[1 ][21 ] = P[1 ][21 ]*SPP [6 ] - P[0 ][21 ]*SPP [2 ] - P[2 ][21 ]*SPP [9 ] + P[10 ][21 ]*SPP [22 ] + P[13 ][21 ]*SPP [17 ];
nextP[2 ][21 ] = P[0 ][21 ]*SPP [14 ] - P[1 ][21 ]*SPP [3 ] + P[2 ][21 ]*SPP [13 ] + P[11 ][21 ]*SPP [22 ] + P[14 ][21 ]*SPP [16 ];
nextP[3 ][21 ] = P[3 ][21 ] + P[0 ][21 ]*SPP [1 ] + P[1 ][21 ]*SPP [19 ] + P[2 ][21 ]*SPP [15 ] - P[15 ][21 ]*SPP [21 ];
nextP[4 ][21 ] = P[4 ][21 ] + P[15 ][21 ]*SF [22 ] + P[0 ][21 ]*SPP [20 ] + P[1 ][21 ]*SPP [12 ] + P[2 ][21 ]*SPP [11 ];
nextP[5 ][21 ] = P[5 ][21 ] + P[15 ][21 ]*SF [20 ] - P[0 ][21 ]*SPP [7 ] + P[1 ][21 ]*SPP [10 ] + P[2 ][21 ]*SPP [0 ];
nextP[6 ][21 ] = P[6 ][21 ] + P[3 ][21 ]*dt ;
nextP[7 ][21 ] = P[7 ][21 ] + P[4 ][21 ]*dt ;
nextP[8 ][21 ] = P[8 ][21 ] + P[5 ][21 ]*dt ;
nextP[9 ][21 ] = P[9 ][21 ];
nextP[10 ][21 ] = P[10 ][21 ];
nextP[11 ][21 ] = P[11 ][21 ];
nextP[12 ][21 ] = P[12 ][21 ];
nextP[13 ][21 ] = P[13 ][21 ];
nextP[14 ][21 ] = P[14 ][21 ];
nextP[15 ][21 ] = P[15 ][21 ];
nextP[16 ][21 ] = P[16 ][21 ];
nextP[17 ][21 ] = P[17 ][21 ];
nextP[18 ][21 ] = P[18 ][21 ];
nextP[19 ][21 ] = P[19 ][21 ];
nextP[20 ][21 ] = P[20 ][21 ];
nextP[21 ][21 ] = P[21 ][21 ];
if (stateIndexLim > 21 ) {
nextP[0 ][22 ] = P[0 ][22 ]*SPP [5 ] - P[1 ][22 ]*SPP [4 ] + P[2 ][22 ]*SPP [8 ] + P[9 ][22 ]*SPP [22 ] + P[12 ][22 ]*SPP [18 ];
nextP[1 ][22 ] = P[1 ][22 ]*SPP [6 ] - P[0 ][22 ]*SPP [2 ] - P[2 ][22 ]*SPP [9 ] + P[10 ][22 ]*SPP [22 ] + P[13 ][22 ]*SPP [17 ];
nextP[2 ][22 ] = P[0 ][22 ]*SPP [14 ] - P[1 ][22 ]*SPP [3 ] + P[2 ][22 ]*SPP [13 ] + P[11 ][22 ]*SPP [22 ] + P[14 ][22 ]*SPP [16 ];
nextP[3 ][22 ] = P[3 ][22 ] + P[0 ][22 ]*SPP [1 ] + P[1 ][22 ]*SPP [19 ] + P[2 ][22 ]*SPP [15 ] - P[15 ][22 ]*SPP [21 ];
nextP[4 ][22 ] = P[4 ][22 ] + P[15 ][22 ]*SF [22 ] + P[0 ][22 ]*SPP [20 ] + P[1 ][22 ]*SPP [12 ] + P[2 ][22 ]*SPP [11 ];
nextP[5 ][22 ] = P[5 ][22 ] + P[15 ][22 ]*SF [20 ] - P[0 ][22 ]*SPP [7 ] + P[1 ][22 ]*SPP [10 ] + P[2 ][22 ]*SPP [0 ];
nextP[6 ][22 ] = P[6 ][22 ] + P[3 ][22 ]*dt ;
nextP[7 ][22 ] = P[7 ][22 ] + P[4 ][22 ]*dt ;
nextP[8 ][22 ] = P[8 ][22 ] + P[5 ][22 ]*dt ;
nextP[9 ][22 ] = P[9 ][22 ];
nextP[10 ][22 ] = P[10 ][22 ];
nextP[11 ][22 ] = P[11 ][22 ];
nextP[12 ][22 ] = P[12 ][22 ];
nextP[13 ][22 ] = P[13 ][22 ];
nextP[14 ][22 ] = P[14 ][22 ];
nextP[15 ][22 ] = P[15 ][22 ];
nextP[16 ][22 ] = P[16 ][22 ];
nextP[17 ][22 ] = P[17 ][22 ];
nextP[18 ][22 ] = P[18 ][22 ];
nextP[19 ][22 ] = P[19 ][22 ];
nextP[20 ][22 ] = P[20 ][22 ];
nextP[21 ][22 ] = P[21 ][22 ];
nextP[22 ][22 ] = P[22 ][22 ];
nextP[0 ][23 ] = P[0 ][23 ]*SPP [5 ] - P[1 ][23 ]*SPP [4 ] + P[2 ][23 ]*SPP [8 ] + P[9 ][23 ]*SPP [22 ] + P[12 ][23 ]*SPP [18 ];
nextP[1 ][23 ] = P[1 ][23 ]*SPP [6 ] - P[0 ][23 ]*SPP [2 ] - P[2 ][23 ]*SPP [9 ] + P[10 ][23 ]*SPP [22 ] + P[13 ][23 ]*SPP [17 ];
nextP[2 ][23 ] = P[0 ][23 ]*SPP [14 ] - P[1 ][23 ]*SPP [3 ] + P[2 ][23 ]*SPP [13 ] + P[11 ][23 ]*SPP [22 ] + P[14 ][23 ]*SPP [16 ];
nextP[3 ][23 ] = P[3 ][23 ] + P[0 ][23 ]*SPP [1 ] + P[1 ][23 ]*SPP [19 ] + P[2 ][23 ]*SPP [15 ] - P[15 ][23 ]*SPP [21 ];
nextP[4 ][23 ] = P[4 ][23 ] + P[15 ][23 ]*SF [22 ] + P[0 ][23 ]*SPP [20 ] + P[1 ][23 ]*SPP [12 ] + P[2 ][23 ]*SPP [11 ];
nextP[5 ][23 ] = P[5 ][23 ] + P[15 ][23 ]*SF [20 ] - P[0 ][23 ]*SPP [7 ] + P[1 ][23 ]*SPP [10 ] + P[2 ][23 ]*SPP [0 ];
nextP[6 ][23 ] = P[6 ][23 ] + P[3 ][23 ]*dt ;
nextP[7 ][23 ] = P[7 ][23 ] + P[4 ][23 ]*dt ;
nextP[8 ][23 ] = P[8 ][23 ] + P[5 ][23 ]*dt ;
nextP[9 ][23 ] = P[9 ][23 ];
nextP[10 ][23 ] = P[10 ][23 ];
nextP[11 ][23 ] = P[11 ][23 ];
nextP[12 ][23 ] = P[12 ][23 ];
nextP[13 ][23 ] = P[13 ][23 ];
nextP[14 ][23 ] = P[14 ][23 ];
nextP[15 ][23 ] = P[15 ][23 ];
nextP[16 ][23 ] = P[16 ][23 ];
nextP[17 ][23 ] = P[17 ][23 ];
nextP[18 ][23 ] = P[18 ][23 ];
nextP[19 ][23 ] = P[19 ][23 ];
nextP[20 ][23 ] = P[20 ][23 ];
nextP[21 ][23 ] = P[21 ][23 ];
nextP[22 ][23 ] = P[22 ][23 ];
nextP[23 ][23 ] = P[23 ][23 ];
}
}
// Copy upper diagonal to lower diagonal taking advantage of symmetry
for (uint8_t colIndex=0 ; colIndex<=stateIndexLim; colIndex++)
{
for (uint8_t rowIndex=0 ; rowIndex<colIndex; rowIndex++)
{
nextP[colIndex][rowIndex] = nextP[rowIndex][colIndex];
}
}
// add the general state process noise variances
for (uint8_t i=0 ; i<=stateIndexLim; i++)
{
nextP[i][i] = nextP[i][i] + processNoise[i];
}
// if the total position variance exceeds 1 e4 (100 m ), then stop covariance
// growth by setting the predicted to the previous values
// This prevent an ill conditioned matrix from occurring for long periods
// without GPS
if ((P[6 ][6 ] + P[7 ][7 ]) > 1 e4f)
{
for (uint8_t i=6 ; i<=7 ; i++)
{
for (uint8_t j=0 ; j<=stateIndexLim; j++)
{
nextP[i][j] = P[i][j];
nextP[j][i] = P[j][i];
}
}
}
// copy covariances to output
CopyCovariances();
// constrain diagonals to prevent ill-conditioning
ConstrainVariances();
hal.util->perf_end(_perf_CovariancePrediction);
4.观测方程,求解H,得到观测方程,计算KG,得到估计值,更新P
load('StatePrediction.mat' );
VtasPred = sqrt ((vn-vwn)^2 + (ve-vwe)^2 + vd^2 );
H_TAS = jacobian(VtasPred,stateVector);
H_TAS = subs(H_TAS, {'rotErrX' , 'rotErrY' , 'rotErrZ' } , {0 ,0 ,0 } );
[H_TAS,SH_TAS] =OptimiseAlgebra(H_TAS,'SH_TAS' );
K_TAS = (P*transpose(H_TAS))/(H_TAS*P*transpose(H_TAS) + R_TAS);
[K_TAS,SK_TAS] =OptimiseAlgebra(K_TAS,'SK_TAS' );
save('Airspeed.mat' ,'SH_TAS' ,'H_TAS' ,'SK_TAS' ,'K_TAS' );
clear all;
reset(symengine);
load('StatePrediction.mat' );
Vbw = Tbn' *[(vn-vwn);(ve-vwe);vd] ;
BetaPred = Vbw(2 )/Vbw(1 );
H_BETA = jacobian(BetaPred,stateVector);
H_BETA = subs(H_BETA, {'rotErrX' , 'rotErrY' , 'rotErrZ' } , {0 ,0 ,0 } );
[H_BETA,SH_BETA] =OptimiseAlgebra(H_BETA,'SH_BETA' );
K_BETA = (P*transpose(H_BETA))/(H_BETA*P*transpose(H_BETA) + R_BETA);[K_BETA,SK_BETA] =OptimiseAlgebra(K_BETA,'SK_BETA' );
save('Sideslip.mat' ,'SH_BETA' ,'H_BETA' ,'SK_BETA' ,'K_BETA' );
clear all;
reset(symengine);
load('StatePrediction.mat' );
magMeas = transpose(Tbn)*[magN;magE;magD] + [magX;magY;magZ] ;
H_MAG = jacobian(magMeas,stateVector);
H_MAG = subs(H_MAG, {'rotErrX' , 'rotErrY' , 'rotErrZ' } , {0 ,0 ,0 } );
[H_MAG,SH_MAG] =OptimiseAlgebra(H_MAG,'SH_MAG' );
K_MX = (P*transpose(H_MAG(1 ,:)))/(H_MAG(1 ,:)*P*transpose(H_MAG(1 ,:)) + R_MAG);
[K_MX,SK_MX] =OptimiseAlgebra(K_MX,'SK_MX' );
K_MY = (P*transpose(H_MAG(2 ,:)))/(H_MAG(2 ,:)*P*transpose(H_MAG(2 ,:)) + R_MAG);
[K_MY,SK_MY] =OptimiseAlgebra(K_MY,'SK_MY' );
K_MZ = (P*transpose(H_MAG(3 ,:)))/(H_MAG(3 ,:)*P*transpose(H_MAG(3 ,:)) + R_MAG);
[K_MZ,SK_MZ] =OptimiseAlgebra(K_MZ,'SK_MZ' );
这部分太多还没看。。。。。