Example #1
0
        private void MakeRImpl()
        {
            _modified = true;
            MakeR();

            if (_modified)
            {
                _flags |= KALMAN.R_MODIF;
            }
        }
Example #2
0
        private void MakeBaseVImpl()
        {
            _modified = true;
            MakeBaseV();

            if (_modified)
            {
                _flags |= KALMAN.V_MODIF;
            }
        }
Example #3
0
        public void TimeUpdateStep(double[] _u)
        {
            SizeUpdate();

            u.Swap <double>(_u);

            MakeCommonProcess();
            MakeAImpl();
            MakeWImpl();
            MakeQImpl();
            MakeProcess();

            if (!_optimizeQ)
            {
                if (_flags == KALMAN.Q_MODIF)
                {
                    _Q = Q;
                    Factor(_Q);
                    UpperInvert(_Q);
                }

                Q.Swap <double>(_Q);

                // W_ = W*U   n.nw = n.nw * nw.nw
                if ((_flags == KALMAN.W_MODIF) || (_flags == KALMAN.Q_MODIF))
                {
                    for (int i = 0; i < n; ++i)
                    {
                        for (int j = 0; j < nw; ++j)
                        {
                            _W[i, j] = W[i, j];

                            for (int k = 0; k < j; ++k)
                            {
                                _W[i, j] += W[i, k] * Q[j, k];
                            }
                        }
                    }
                }

                W.Swap <double>(_W);
            }

            TimeUpdate();

            if (!_optimizeQ)
            {
                Q.Swap <double>(_Q);
                W.Swap <double>(_W);
            }

            u.Swap <double>(_u);
            _flags &= ~KALMAN.MIDMASK;
        }
Example #4
0
 public void Initialize(double[] x, double[,] P)
 {
     _x.Swap <double>(x);
     _P.Swap <double>(P);
     _flags |= KALMAN.P_MODIF;
 }
Example #5
0
        protected virtual void SizeUpdate()
        {
            if (_flags == 0)
            {
                return;
            }

            if (_flags == KALMAN.N_MODIF)
            {
                A = Matrix.Create <double>(n);
                MakeBaseAImpl();
            }

            if ((_flags == KALMAN.N_MODIF) || (_flags == KALMAN.NW_MODIF))
            {
                _nn = n + nw;
                _a  = Matrix.Vector <double>(_nn, 0.0);
                _v  = Matrix.Vector <double>(_nn, 0.0);
                _d  = Matrix.Vector <double>(_nn, 0.0);

                if (!_optimizeQ)
                {
                    _W = Matrix.Create <double>(n, nw);
                }

                W = Matrix.Create <double>(n, nw);
                MakeBaseWImpl();
            }

            if (_flags == KALMAN.P_MODIF)
            {
                _U = Matrix.Create <double>(n, _nn);

                for (int i = 0; i < n; ++i)
                {
                    for (int j = 0; j < n; ++j)
                    {
                        _U[i, j] = _P[i, j];
                    }
                }

                Factor(_U);
            }
            else if (_flags == KALMAN.NW_MODIF)
            {
                _P = Matrix.Create <double>(n, _nn);

                for (int i = 0; i < n; ++i)
                {
                    for (int j = 0; j < n; ++j)
                    {
                        _P[i, j] = _U[i, j];
                    }
                }

                Factor(_P);
            }

            if (_flags == KALMAN.NW_MODIF)
            {
                if (!_optimizeQ)
                {
                    _Q = Matrix.Create <double>(nw);
                }

                Q = Matrix.Create <double>(nw);
                MakeBaseQImpl();
            }

            if (m != 0)
            {
                if ((_flags == KALMAN.N_MODIF) || (_flags == KALMAN.M_MODIF))
                {
                    if (!_optimizeVR)
                    {
                        _H = Matrix.Create <double>(m, n);
                    }

                    H = Matrix.Create <double>(m, n);
                    MakeBaseHImpl();
                }

                if ((_flags == KALMAN.M_MODIF) || (_flags == KALMAN.NV_MODIF))
                {
                    V = Matrix.Create <double>(m, nv);
                    MakeBaseVImpl();
                }

                if (_flags == KALMAN.NV_MODIF)
                {
                    R = Matrix.Create <double>(nv);
                    MakeBaseRImpl();
                }

                if (_flags == KALMAN.M_MODIF)
                {
                    _R = Matrix.Create <double>(m);
                    z  = Matrix.Vector <double>(m, 0.0);
                    dz = Matrix.Vector <double>(m, 0.0);
                }
            }

            _flags &= ~KALMAN.LOWMASK;
        }
Example #6
0
        public void MeasureUpdateStep(double[] _z)
        {
            SizeUpdate();

            if (m == 0)
            {
                return;
            }

            MakeCommonMeasure();
            MakeHImpl();
            MakeVImpl();
            MakeRImpl();
            MakeMeasure();

            for (int i = 0; i < m; ++i)
            {
                dz[i] = _z[i] - z[i];
            }

            MakeDZ();

            if (_optimizeVR)
            {
                if ((_flags == KALMAN.V_MODIF) || (_flags == KALMAN.R_MODIF))
                {
                    for (int i = 0; i < m; ++i)
                    {
                        _R[i, i] = V[i, i] * V[i, i] * R[i, i];
                    }
                }
            }
            else
            {
                if ((_flags == KALMAN.V_MODIF) || (_flags == KALMAN.R_MODIF))
                {
                    _x = Matrix.Vector <double>(nv, 0.0);

                    // R_ = V*R*V'
                    for (int i = 0; i < m; ++i)
                    {
                        // _x = row i of V*R = (V*R)(i,:)
                        for (int j = 0; j < nv; ++j)
                        {
                            _x[j] = 0.0;

                            for (int k = 0; k < nv; ++k)
                            {
                                _x[j] += V[i, k] * R[k, j];
                            }
                        }

                        // R_(i,:) = (V*R*V')(i,:) = (V*R)(i,:) * V'
                        for (int j = 0; j < m; ++j)
                        {
                            _R[i, j] = 0.0;

                            for (int k = 0; k < nv; ++k)
                            {
                                _R[i, j] += _x[k] * V[j, k];
                            }
                        }
                    }

                    // R_ = U*D*U'
                    // diag(R_) = D, upper(R_) = U, lower(R_) = junk
                    Factor(_R);

                    // lower(R_) = (inv(U))'
                    UpperInvert(_R);
                }

                if ((_flags == KALMAN.H_MODIF) || (_flags == KALMAN.V_MODIF) || (_flags == KALMAN.R_MODIF))
                {
                    // H_ = inv(U)*H    m.n = m.m * m.n
                    for (int i = 0; i < m; ++i)
                    {
                        for (int j = 0; j < n; ++j)
                        {
                            _H[i, j] = H[i, j];

                            for (int k = i + 1; k < m; ++k)
                            {
                                _H[i, j] += _R[k, i] * H[k, j];
                            }
                        }
                    }
                }

                H.Swap <double>(_H);

                // _x = inv(U)*dz    m.1 = m.m * m.1
                _x = Matrix.Vector <double>(m, 0.0);

                for (int i = 0; i < m; ++i)
                {
                    _x[i] = dz[i];

                    for (int k = i + 1; k < m; ++k)
                    {
                        _x[i] += _R[k, i] * dz[k];
                    }
                }

                dz.Swap <double>(_x);
            }

            _x = Matrix.Vector <double>(n, 0.0); // dx : innovation

            for (int i = 0; i < m; ++i)
            {
                for (int j = 0; j < n; ++j)
                {
                    _a[j] = H[i, j];
                }

                MeasureUpdate(dz[i], _R[i, i]);
            }

            for (int i = 0; i < n; ++i)
            {
                x[i] += _x[i];
            }

            if (!_optimizeVR)
            {
                H.Swap <double>(_H);
            }

            _flags &= ~KALMAN.HIGHMASK;
        }