Как я могу рассчитать значения DOP для набора спутников GPS в Python 2.7.2?

Я пытаюсь рассчитать значения DOP для набора спутников GPS в Python 2.7.2, используя numpy 1.9.3.

Я нашел руководство о том, как это сделать. но у меня проблемы с переводом на python.

Вот что я пробовал до сих пор:

import numpy as np

# First I defined 3 variables for each satellite as described in the guide.  

sat_1_1 =  np.sin(np.deg2rad(136)) * np.cos(np.deg2rad(14))
sat_1_2 =  np.cos(np.deg2rad(136)) * np.cos(np.deg2rad(14))
sat_1_3 =  np.sin(np.deg2rad(14))

sat_2_1 = np.sin(np.deg2rad(329)) * np.cos(np.deg2rad(48))
sat_2_2 = np.cos(np.deg2rad(329)) * np.cos(np.deg2rad(48))
sat_2_3 = np.sin(np.deg2rad(48))

sat_3_1 = np.sin(np.deg2rad(253)) * np.cos(np.deg2rad(36))
sat_3_2 = np.cos(np.deg2rad(253)) * np.cos(np.deg2rad(36))
sat_3_3 = np.sin(np.deg2rad(36))

sat_4_1 = np.sin(np.deg2rad(188)) * np.cos(np.deg2rad(9))
sat_4_2 = np.cos(np.deg2rad(188)) * np.cos(np.deg2rad(9))
sat_4_3 = np.sin(np.deg2rad(9)) 

# Next I created the line-of-sight matrix: 

LOS_Matrix = np.array([[sat_1_1, sat_1_2, sat_1_3, 1.0], [sat_2_1, sat_2_2, sat_2_3, 1.0], [sat_3_1, sat_3_2, sat_3_3, 1.0], [sat_4_1, sat_4_2, sat_4_3, 1.0]])

# Then its transpose:

LOS_Matrix_t = LOS_Matrix.transpose()

# Next the guide says to compute the covariance matrix which is said to be equal to the inverse of LOS_Matrix * LOS_Matrix_t, so:

cov_matrix = np.linalg.inv(LOS_Matrix * LOS_Matrix_t)

# This should now lets me calculate the DOP values such as GDOP, PDOP, etc

PDOP = np.sqrt(cov_matrix[0, 0] + cov_matrix[1, 1] + cov_matrix[2, 2])

# This comes out as 2.25575033021 which is possbile though it seems suspiciously low

# Also TDOP can't be computed since cov_matrix[3, 3] is a negative number so something must be wrong I guess? 

Я новичок в python, и математика тоже не моя сильная сторона, я зашел так далеко, только погуглив сообщение об ошибке за сообщением об ошибке.

Сейчас я нахожусь в том месте, где он работает без каких-либо сообщений об ошибках, но это тоже не кажется правильным, в противном случае, например, значение TDOP должно быть вычислимым.

Кто-нибудь знает, в чем проблема?

Ваше здоровье


person Sutta    schedule 22.11.2019    source источник


Ответы (1)


cov_matrix = np.linalg.inv(LOS_Matrix * LOS_Matrix_t)

Вероятно, должно быть

cov_matrix = np.linalg.inv(LOS_Matrix.dot(LOS_Matrix_t))

Я знаю, я знаю, это сбивает с толку. Но в numpy у вас есть два разных типа: один - это ndarray, который вы должны использовать, а другой - матрица, которую вы не должны использовать. Для умножения ndarray по умолчанию используется поэлементное умножение.

person iliar    schedule 22.11.2019
comment
Спасибо! Это действительно сбивает с толку. Я попробовал это, и теперь значения кажутся более разумными. Позже я протестирую его с кучей разных азимутов и возвышений, чтобы увидеть, имеет ли все это смысл. - person Sutta; 22.11.2019