No estoy seguro de lo que estás viendo, pero debes entender los ejemplos que vinculas.
Ninguno de ellos usa el valor de verdad dentro del filtro real. Está ahí para que tenga algo con qué comparar en relación con la salida del filtro.
Aquí está el script simple:
import random
# intial parameters
iteration_count = 500
actual_values = [-0.37727 + j * j * 0.00001 for j in xrange(iteration_count)]
noisy_measurement = [random.random() * 0.6 - 0.3 + actual_val for actual_val in actual_values]
process_variance = 1e-5 # process variance
estimated_measurement_variance = 0.1 ** 2 # estimate of measurement variance, change to see effect
# allocate space for arrays
posteri_estimate_for_graphing = []
# intial guesses
posteri_estimate = 0.0
posteri_error_estimate = 1.0
for iteration in range(1, iteration_count):
# time update
priori_estimate = posteri_estimate
priori_error_estimate = posteri_error_estimate + process_variance
# measurement update
blending_factor = priori_error_estimate / (priori_error_estimate + estimated_measurement_variance)
posteri_estimate = priori_estimate + blending_factor * (noisy_measurement[iteration] - priori_estimate)
posteri_error_estimate = (1 - blending_factor) * priori_error_estimate
posteri_estimate_for_graphing.append(posteri_estimate)
import pylab
pylab.figure()
pylab.plot(noisy_measurement, color='r', label='noisy measurements')
pylab.plot(posteri_estimate_for_graphing, 'b-', label='a posteri estimate')
pylab.plot(actual_values, color='g', label='truth value')
pylab.legend()
pylab.xlabel('Iteration')
pylab.ylabel('Voltage')
pylab.show()
Vamos a descomponerlo:
Primero, cree la matriz de entrada y luego cree la entrada "ruidosa" simulada agregando valores aleatorios a cada elemento de la matriz de entrada.
import random
# intial parameters
iteration_count = 500
actual_values = [-0.37727 + j * j * 0.00001 for j in xrange(iteration_count)]
noisy_measurement = [random.random() * 0.6 - 0.3 + actual_val for actual_val in actual_values]
A continuación, se definen varios parámetros que describen las características de la varianza del sistema. Estos deberán derivarse de su fuente de señal.
process_variance = 1e-5 # process variance
estimated_measurement_variance = 0.1 ** 2 # estimate of measurement variance, change to see effect
# allocate space for arrays
posteri_estimate_for_graphing = []
# intial guesses
posteri_estimate = 0.0
posteri_error_estimate = 1.0
Este es el código de filtrado real:
for iteration in range(1, iteration_count):
# time update
priori_estimate = posteri_estimate
priori_error_estimate = posteri_error_estimate + process_variance
# measurement update
blending_factor = priori_error_estimate / (priori_error_estimate + estimated_measurement_variance)
posteri_estimate = priori_estimate + blending_factor * (noisy_measurement[iteration] - priori_estimate)
posteri_error_estimate = (1 - blending_factor) * priori_error_estimate
posteri_estimate_for_graphing.append(posteri_estimate)
Nota: actual_values
no está referenciado en ninguna parte en el código anterior. El filtro de Kalman opera por completo solo en los datos dentro de la matriz noisy_measurement
.
Finalmente, traza los diversos arreglos.
import pylab
pylab.figure()
pylab.plot(noisy_measurement, color='r', label='noisy measurements')
pylab.plot(posteri_estimate_for_graphing, 'b-', label='a posteri estimate')
pylab.plot(actual_values, color='g', label='truth value')
pylab.legend()
pylab.xlabel('Iteration')
pylab.ylabel('Voltage')
pylab.show()
Básicamente, no necesitas el valor de verdad en absoluto. Necesitas leer tus ejemplos. Está graficado solo para que pueda determinar la eficacia del filtro de Kalman.
Críticamente, particularmente para propósitos de prueba, no puede caracterizar el error producido por un filtro de Kalman con contantes de {n} sin conocer el valor de verdad real. El filtro se filtrará bien, pero no hay manera de determinar si la salida es precisa. La configuración adecuada del filtro requiere poder medir solo el ruido dentro del sistema.