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); } }
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); }
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) ); } }