Beispiel #1
0
        public void CalculateFormingFilter()
        {
            //Объявление параметров, для которых будет проверяться работа метода фильтрации формирующего фильтра.
            double tau          = 0.01;
            double teta         = 0.286;
            double sigma        = 3.464;
            double fi           = 4.414;
            double ksi          = 11.427;
            double Sv           = 0;
            int    RowsCount    = 3;
            int    ColumnsCount = 5000;

            //Создаём нулевые массивы, в которые будем записывать аналитично посчитанные значения процесса после прохождения фильтрации.
            double[] analyticallycalculateX = { 0, 0, 0, 0 };
            double[] analyticallycalculateH = { 0, 0, 0, 0 };

            //Создаём случайный процесс и генерируем его.
            Practice.Signal.NormalDistributionSignal InitialSignal = new Practice.Signal.NormalDistributionSignal(0, Math.PI * 2 * Sv / tau);
            InitialSignal.GenerateSignal();
            //Создаём формирующий фильтр и фильтруем сигнал(сигнал содержится в экземпляре фильтра).
            Practice.Filter.FormingFilter FF = new Practice.Filter.FormingFilter(RowsCount, ColumnsCount, tau, ksi, sigma, teta, fi);
            FF.Filter();

            //Точность округления значений.
            int accuracy = 4;

            //Проверяем 3 первых значения сигнала после фильтрации формирующим фильтром, они должны совпадать с аналитически посчитанными значениями.
            for (int i = 0; i < 3; i++)
            {
                //Считаем значения по разностным формулам.
                analyticallycalculateX[i + 1] = analyticallycalculateX[i] + tau *
                                                (
                    analyticallycalculateH[i] + teta * FF.InitialSignal.SignalArray[i]
                                                );

                //Считаем значения по разностным формулам.
                analyticallycalculateH[i + 1] = analyticallycalculateH[i] + tau *
                                                (
                    (fi - sigma * teta) * FF.InitialSignal.SignalArray[i] -
                    sigma * analyticallycalculateH[i] - ksi * analyticallycalculateX[i]
                                                );

                //Если значения не совпали с подсчитанными вручную, то тест не пройден.
                Assert.IsFalse
                (
                    Math.Round(FF.OutputSignal[0, i + 1], accuracy) != Math.Round(analyticallycalculateX[i + 1], accuracy) ||
                    Math.Round(FF.H[0, i + 1], accuracy) != Math.Round(analyticallycalculateH[i + 1], accuracy)
                );
            }
        }
Beispiel #2
0
        public void IsDispersionLargerThanZero()
        {
            //Объявление параметров, которые поступают на вход маетодам экземплярам классов, которые проходят проверку.
            int    Rows    = 3;
            int    Columns = 5000;
            double A       = 1.621;
            double a       = 0.542;
            double alpha   = 1.732;
            double beta    = 2.903;
            double Sw      = 1.973;
            double tau     = 0.01;
            double ksi     = 11.427;
            double sigma   = 3.464;
            double teta    = 0.286;
            double fi      = 4.414;

            //Объявление экземпляра матрицы коваиаций.
            Practice.Filter.Covariance TestMatrix = new Practice.Filter.Covariance(Rows, Columns, A, a, alpha, beta, Sw, tau, ksi, sigma, teta, fi);
            TestMatrix.CalculateCovarianceMatrix();
            //Объявление экземпляра формирующего фильтра и фильтрация.
            Practice.Filter.FormingFilter TestFormingFilter = new Practice.Filter.FormingFilter(Rows, Columns, tau, ksi, sigma, teta, fi);
            TestFormingFilter.Filter();
            //Объявление экземпляра фильтра калмана и фильтрация.
            Practice.Filter.KalmanFilter TestKalmanFilter = new Practice.Filter.KalmanFilter(Rows, Columns, TestFormingFilter.OutputSignal, TestMatrix);
            TestKalmanFilter.Filter();

            //Коэфициенты для которых считается дисперсия.
            double[] factor = new double[3] {
                0.2, 0.5, 0.8
            };
            for (int i = 0; i < 3; i++)
            {
                //Если дисперсия при всех коэффициентах положительна, то тест пройден.

                //Дисперсия для формирующего фильтра.
                Assert.IsFalse(Practice.StatisticalCharacteristics.Variance((byte)factor[i], TestFormingFilter.OutputSignal) < 0);

                //Дисперсия для  фильтра калмана.
                Assert.IsFalse(Practice.StatisticalCharacteristics.Variance((byte)factor[i], TestKalmanFilter.E) < 0);
            }
        }
Beispiel #3
0
        public void TestWrongInputData()
        {
            //Переменная, в которой отмечается, пройден ли тест.
            //Тест содержит такие параметры, при которых программа упадет.
            bool ItsOK = true;
            //Объявление параметров, которые поступают на вход маетодам экземплярам классов, которые проходят проверку.
            int    Rows    = -1;
            int    Columns = 5000;
            double A       = 1.621;
            double a       = 0.542;
            double alpha   = 1.732;
            double beta    = 2.903;
            double Sw      = 1.973;
            double tau     = 0.01;
            double ksi     = 11.427;
            double sigma   = 3.464;
            double teta    = 0.286;
            double fi      = 4.414;

            //Объявление экземпляра формирующего фильтра.
            Practice.Filter.FormingFilter TestFormingFilter = null;

            //Попытка инициализации этого экземплряра и запуск метода с данными параметрами.
            try
            {
                TestFormingFilter = new Practice.Filter.FormingFilter(Rows, Columns, tau, ksi, sigma, teta, fi);
                TestFormingFilter.Filter();
            }
            catch (System.Exception e)
            {
                ItsOK = false;
            }

            //Объявление экземпляра матрицы коваиаций.
            Practice.Filter.Covariance TestMatrix = null;

            //Попытка инициализации этого экземплряра и запуск метода с данными параметрами.
            try
            {
                TestMatrix = new Practice.Filter.Covariance(Rows, Columns, A, a, alpha, beta, Sw, tau, ksi, sigma, teta, fi);
                TestMatrix.CalculateCovarianceMatrix();
            }
            catch (System.Exception e)
            {
                ItsOK = false;
            }

            //Объявление экземпляра фильтра калмана.
            Practice.Filter.KalmanFilter TestKalmanFilter = null;

            //Попытка инициализации этого экземплряра и запуск метода с данными параметрами.
            try
            {
                TestKalmanFilter = new Practice.Filter.KalmanFilter(Rows, Columns, TestFormingFilter.OutputSignal, TestMatrix);
                TestKalmanFilter.Filter();
            }
            catch (System.Exception e)
            {
                ItsOK = false;
            }

            //Если при данных параметрах во время создания экземпляра или в ходе работы метода будет ошибка, то тест будет пройден.
            Assert.IsFalse(ItsOK);
        }
Beispiel #4
0
        public void CalculateCalmanFilter()
        {
            //Объявление параметров, для которых будет проверяться работа метода фильтра Калмана.
            double tau          = 0.01;
            double teta         = 0.286;
            double sigma        = 3.464;
            double fi           = 4.414;
            double ksi          = 11.427;
            double Sv           = 0;
            int    RowsCount    = 3;
            int    ColumnsCount = 5000;

            //Создаём нулевые массивы, в которые будем записывать аналитично посчитанные значения процесса после прохождения фильтрации.
            double[] analyticallycalculateY1 = { 0, 0, 0, 0 };
            double[] analyticallycalculateY2 = { 0, 0, 0, 0 };

            //Создаём матрицу ковариаций(необходима для работы фильтра).
            Practice.Filter.Covariance CM;
            CM = new Practice.Filter.Covariance(3, 5000, 1.621, 0.542, 1.732, 2.903, 1.973, 0.01, 11.427, 3.464, 0.286, 4.414);

            //Создаём случайный процесс и генерируем его.
            Practice.Signal.NormalDistributionSignal InitialSignal = new Practice.Signal.NormalDistributionSignal(0, Math.PI * 2 * Sv / tau);
            InitialSignal.GenerateSignal();
            //Создаём формирующий фильтр и фильтруем сигнал(сигнал содержится в экземпляре фильтра).
            Practice.Filter.FormingFilter FF = new Practice.Filter.FormingFilter(RowsCount, ColumnsCount, tau, ksi, sigma, teta, fi);
            FF.Filter();
            //Создаём фильтр калмана и фильтруем сигнал полученный в ходе работы формируюшего фильтра.
            Practice.Filter.KalmanFilter KF = new Practice.Filter.KalmanFilter(RowsCount, ColumnsCount, FF.OutputSignal, CM);
            KF.Filter();

            //Точность значений.
            int accuracy = 4;

            //Проверяем 3 первых значения сигнала после фильтрации фильтром Калмана.
            for (int i = 0; i < 3; i++)
            {
                //Считаем значения по разностным формулам.
                analyticallycalculateY1[i + 1] = analyticallycalculateY1[i] + KF.CovMatr.tau *
                                                 (
                    analyticallycalculateY2[i] + KF.CovMatr.CovarianceMatrix[0][0, i] *
                    (
                        (FF.OutputSignal[0, i] + KF.Noize.SignalArray[i] - analyticallycalculateY1[i]) /
                        (2 * Math.PI * KF.CovMatr.factor[0] * KF.CovMatr.Sw)
                    )
                                                 );
                //Считаем значения по разностным формулам.
                analyticallycalculateY2[i + 1] = analyticallycalculateY2[i] + KF.CovMatr.tau *
                                                 (
                    KF.CovMatr.CovarianceMatrix[2][0, i] *
                    (FF.OutputSignal[0, i] + KF.Noize.SignalArray[i] - analyticallycalculateY1[i]) /
                    (2 * Math.PI * KF.CovMatr.factor[0] * KF.CovMatr.Sw) - KF.CovMatr.ksi * analyticallycalculateY1[i] -
                    KF.CovMatr.sigma * analyticallycalculateY2[i]
                                                 );

                //Если значения не совпали с подсчитанными вручную, то тест не пройден.
                Assert.IsFalse
                (
                    Math.Round(KF.OutputSignal[0, i + 1], accuracy) != Math.Round(analyticallycalculateY1[i + 1], accuracy) ||
                    Math.Round(KF.Y2[0, i + 1], accuracy) != Math.Round(analyticallycalculateY2[i + 1], accuracy)
                );
            }
        }