Problemas y soluciones encontrados en rtklib posicionamiento de un solo punto spp usando estimación robusta

Descripción del problema
Al aplicar una estimación robusta en spp, al calcular la matriz de covarianza del residuo posterior a la prueba v del valor de observación, hay un problema y Qvv tiene un valor negativo para el elemento diagonal.
En primer lugar, sospecho que hay un problema con mi propio código y luego con la depuración. Depurar la matriz en VS es realmente abrumador.
En segundo lugar, imprimí la matriz de coeficientes H, la matriz constante l, la matriz de covarianza Qxx, el vector de parámetros dx en spp y verifiqué la comparación en matlab.
1. Imprima la matriz anterior en matlab

>> H=[       0.497179       -0.767231        0.405178        1.000000        0.000000        0.000000        0.000000;
       0.954274        0.112689       -0.276879        1.000000        0.000000        0.000000        0.000000;
       0.387339       -0.481553       -0.786178        1.000000        0.000000        0.000000        0.000000;
      -0.580737       -0.519400       -0.626872        1.000000        0.000000        0.000000        0.000000;
      -0.287620       -0.601084       -0.745636        1.000000        0.000000        0.000000        0.000000;
       0.394442       -0.847597       -0.354957        1.000000        0.000000        0.000000        0.000000;
       0.479621       -0.224119       -0.848371        1.000000        0.000000        0.000000        0.000000;
      -0.266211       -0.887121        0.377026        1.000000        0.000000        0.000000        0.000000;
       0.000000        0.000000        0.000000        0.000000        1.000000        0.000000        0.000000;
       0.000000        0.000000        0.000000        0.000000        0.000000        1.000000        0.000000;
       0.000000        0.000000        0.000000        0.000000        0.000000        0.000000        1.000000];
>> Q=[       1.444742       -1.205538       -0.559907       -1.256723        0.000000        0.000000        0.000000;
      -1.205538        4.239855        1.510516        3.308947        0.000000        0.000000        0.000000;
      -0.559907        1.510516        1.847995        1.891790        0.000000        0.000000        0.000000;
      -1.256723        3.308947        1.891790        3.215663        0.000000        0.000000        0.000000;
       0.000000        0.000000        0.000000        0.000000        0.010000        0.000000        0.000000;
       0.000000        0.000000        0.000000        0.000000        0.000000        0.010000        0.000000;
       0.000000        0.000000        0.000000        0.000000        0.000000        0.000000        0.010000];
>> dx=[       0.000009
      -0.000020
      -0.000022
      -0.000041
       0.000000
       0.000000
       0.000000];
>>  l=[0.123075
       0.433912
       0.828791
       0.067140
       0.026320
      -0.289038
      -0.862615
      -0.198928
       0.000000
       0.000000
       0.000000];
>> H'

ans =

  Columns 1 through 8

   0.497179000000000   0.954274000000000   0.387339000000000  -0.580737000000000  -0.287620000000000   0.394442000000000   0.479621000000000  -0.266211000000000
  -0.767231000000000   0.112689000000000  -0.481553000000000  -0.519400000000000  -0.601084000000000  -0.847597000000000  -0.224119000000000  -0.887121000000000
   0.405178000000000  -0.276879000000000  -0.786178000000000  -0.626872000000000  -0.745636000000000  -0.354957000000000  -0.848371000000000   0.377026000000000
   1.000000000000000   1.000000000000000   1.000000000000000   1.000000000000000   1.000000000000000   1.000000000000000   1.000000000000000   1.000000000000000
                   0                   0                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0                   0                   0

  Columns 9 through 11

                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
   1.000000000000000                   0                   0
                   0   1.000000000000000                   0
                   0                   0   1.000000000000000

>> H*Q*H'

ans =

  Columns 1 through 8

   1.332860500714645   0.645546014871716  -0.098580562413659  -0.064031507548390  -0.165752578512155   0.396295832699334  -0.141008818175153   1.168889713304825
   0.645546014871717   1.968804844653495   0.053246247795955  -0.005468449432181  -0.265950607478022  -0.319534503408733   0.574091433817809   0.243277031690377
  -0.098580562413659   0.053246247795955   0.357273653443425  -0.021840446651663   0.164659427109121   0.283415207166032   0.318871615198842  -0.284958778729781
  -0.064031507548390  -0.005468449432181  -0.021840446651663   1.072132904685670   0.641476084869937  -0.226446903091478   0.079281778351138   0.679077103029250
  -0.165752578512155  -0.265950607478023   0.164659427109121   0.641476084869937   0.515321629013082   0.067397424711531   0.125308500906703   0.247806596987045
   0.396295832699334  -0.319534503408734   0.283415207166032  -0.226446903091478   0.067397424711531   0.647339251042735   0.015423699735895   0.151774558340723
  -0.141008818175153   0.574091433817809   0.318871615198843   0.079281778351138   0.125308500906704   0.015423699735896   0.481685375510297  -0.331346855770643
   1.168889713304826   0.243277031690377  -0.284958778729780   0.679077103029250   0.247806596987045   0.151774558340723  -0.331346855770643   1.674731658216493
                   0                   0                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0                   0                   0

  Columns 9 through 11

                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
   0.010000000000000                   0                   0
                   0   0.010000000000000                   0
                   0                   0   0.010000000000000

>> 

2. Imprima la matriz anterior en vs
2.1 Imprima
Q_matrix Tengo un problema al calcular HQH 'en vs. El código es el siguiente:

printf("**********************\n");
				Q_ = mat(nv, nv);
				matmul("TN", nv, NX, NX, 1.0, H_, Q, 0.0, Q);
				matmul("NN", nv, nv, NX, 1.0, Q, H_, 0.0, Q);
				printmat(Q, nv, nv, "Q");

Entre ellos, matmul es la función de multiplicación de matrices, T significa transponer, N significa no transponer; H_ es la matriz de coeficientes, la matriz de coeficientes no ponderados es la copia de H devuelta directamente por la función rescode y Q es el valor de retorno de lsq, Q_ significa HQH ', entonces el resultado de impresión obtenido de acuerdo con el código anterior es como se muestra en la figura siguiente:
Inserte la descripción de la imagen aquí
el elemento diagonal tiene un valor negativo, y no es una matriz diagonal. Obviamente está mal. Jajaja
2.2. La matriz de coeficientes de impresión H está
en rescode En la función, H se coloca en una matriz o matriz de acuerdo con [-e1 -e2 -e3 1.0 0.0 0.0 0.0], que es nv * NX elementos. Lo imprimo de acuerdo con NX * nv definido por mat, y luego siga nv * NX para imprimir, el resultado es el siguiente. Se
Inserte la descripción de la imagen aquí
dice que la matriz de coeficientes H es NX * nv. El resultado impreso muestra que la disposición de datos internos debe ser la forma transpuesta de la segunda matriz de impresión arriba, lo que significa que la forma de H es en realidad la forma de H'in matlab en la forma de
2.3, imprima H '* H
para verificar la conclusión anterior 2.2, a la derecha H' * H imprima los resultados, como se muestra a continuación:
Inserte la descripción de la imagen aquí
2.4, 2.1 para la verificación de revisión de la operación de multiplicación de matrices
antes de la fase H y la matriz Multiplique, calcule H 'y luego realice la operación H'QH

				// 3、根据协方差传播定律可知,Qvv=Qll-B*Q*B',Q=(B'PB)^-1
				// lsq:  n<m,n=NX m=nv
				//      matmul("NN",n,1,m,1.0,A,y,0.0,Ay); /* Ay=A*y */
				//		matmul("NT", n, n, m, 1.0, A, A, 0.0, Q);  /* Q=A*A' */

				
				printf("**********************\n");
				Q_ = mat(nv, nv);
				double *eyeI;
				double *tH;
				eyeI = mat(NX, NX);
				tH = mat(nv, NX);
				for (j = 0; j < NX;j++)
				{
					for (k = 0; k < NX;k++)
					{
						eyeI[j + k*NX] = (j==k)?1.0:0.0;
					}
				}
				matmul("TN", nv, NX, NX, 1.0, H_, eyeI, 0.0, tH); /* 求转置矩阵H' */
				printmat(tH, NX, nv, "tH");// 打印转置矩阵
				double *Q1,*Q2;
				Q1 = mat(nv, NX);
				Q2 = mat(nv, nv);
				matmul("NN", nv, NX, NX, 1.0, tH, Q, 0.0, Q1);
				matmul("NN", nv, nv, NX, 1.0, Q1, H_, 0.0, Q_);
				printmat(Q_, nv, nv, "Q_"); 

El resultado de la impresión es el siguiente:
Inserte la descripción de la imagen aquí
De hecho, esta tH es la forma transpuesta de H en Matlab. Una vez más, se han utilizado métodos de depuración para verificar que la matriz rtklib está en la primera y la segunda columna. . . Llenar la matriz en forma de enésima columna es diferente de nuestro hábito habitual de escribir código por nosotros mismos. El resultado impreso es consistente con Matlab.

Código
robusto Se agregó el código robusto spp también terminado, la próxima validación de prueba, más anti-pobre de hecho rms y std sin robusto que pequeño, así que puse el comentario más un buen código, probaré datos + código + gráfico de resultado Déjelo salir, hablemos sobre eso.

Supongo que te gusta

Origin blog.csdn.net/weixin_43074576/article/details/109591852
Recomendado
Clasificación