Программная реализация системы
Класс Calculate – в котором производятся вычисления основных числовых характеристик: математического ожидания, дисперсии.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Khorova
{
class Calculate
{
public int quantityReadout; //количество отсчетов
public double digitizationInterval; //интервал дискретизации
public double[] values; //массив случайного процесса
public double[] valuesCentr; //центрированный массив случайного процесс
public double populationMean; //МО
public double dispersion; //дисперисия
public double[] correlationFunction; //КФ
public double gamma;
public double alfa;
public double omega;
public double[,] masFanction;
public double[] masBetta;
public double[] masBet;
public double[] teorCorrelationFunction;
public int Jmax;
public double[] massB;
public double[] masB;
public int order;
public double[] masDeltaM;
public Calculate(int n, double dt, double[] mas)
{
quantityReadout = n;
digitizationInterval = dt;
Jmax = 35;
values = mas;
populationMean = GetPopulationMean();
valuesCentr = GetCentrValues();
dispersion = GetDispersion();
correlationFunction = GetCorrelationFunction();
teorCorrelationFunction = GetTeorCorrelationFunction(50, gamma);
}
public Calculate(int n, double dt, double[] mas, int j, double t, double a, double w)
{
quantityReadout = n;
digitizationInterval = dt;
alfa = a;
omega = w;
gamma = 0.8 / digitizationInterval;//2*Math.Sqrt(Math.Pow(a,2)+Math.Pow(w,2));
Jmax = j;
values = mas;
populationMean = GetPopulationMean();
valuesCentr = GetCentrValues();
dispersion = GetDispersion();
correlationFunction = GetCorrelationFunction();
teorCorrelationFunction = GetTeorCorrelationFunction(50, gamma);
order = GetOrder(t);
}
public double GetPopulationMean() //метод возвращающий математическое ожидаение потока
{
double populationMean = values[0];
for (int i = 0; i < quantityReadout; i++)
populationMean += values[i];
populationMean = populationMean / quantityReadout;
return populationMean;
}
public double[] GetCentrValues() //метод возвращающий массив центрированных значений интервалов
{
double[] mas = new double[quantityReadout];
for (int i = 0; i < quantityReadout; i++)
{
mas[i] = values[i] - populationMean;
}
return mas;
}
public double GetDispersion() //метод возвращающий дисперсию
{
double dispersion = 0;
for (int i = 0; i < quantityReadout; i++)
dispersion += Math.Pow(valuesCentr[i], 2);
dispersion /= (quantityReadout - 1);
return dispersion;
}
private double[] GetCorrelationFunction()
{
double[] cF = new double[Jmax];
for (int i = 0; i < Jmax; i++)
{
for (int j = 0; j <= (quantityReadout - i - 1); j++)
cF[i] += ((values[j] - populationMean) * (values[j + i] - populationMean));
cF[i] = cF[i] / ((quantityReadout - i - 1) * dispersion);
}
return cF;
}
public double GetItemCorrelationFunction(int i)
{
return correlationFunction[i];
}
public double GetMaxArray() //метод возващающий максимум массива интервалов
{
double max = values[0];
for (int i = 1; i < quantityReadout; i++)
if (max < values[i])
max = values[i];
return max;
}
public double GetMinArray() //метод возвращающий минимум массива интервалов
{
double min = values[0];
int k = 0;
for (int i = 1; i < quantityReadout; i++)
if (min > values[i])
{
min = values[i];
k = i;
}
k++;
return min;
}
}
}
Класс Model1 – содержит в себе алгоритм рекурсивной фильтрации, с помощью которого получается СП с корреляционной функцией Rx (τ)= e-α ׀τ ׀ (модель 1), и вычисляется количество ординат для построения КФ.
sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Khorova
{
class ModelFirst: SourceProcess
{
public ModelFirst(int n, double dt, double a, double w)
: base(n, dt, a, w)
{
}
public override double GetDigitizationInterval(double dt)
{
return (Math.Pow((8 * dt), 0.5) / alfa);
}
public override double[] GetMas()
{
double[] masY = new double[this.quantityReadout];
double gamma = alfa * digitizationInterval;
double p = Math.Pow(Math.E, ((-1) * gamma));
double a = Math.Pow((1 - Math.Pow(p, 2)), 0.5);
double b = p;
Random r = new Random();
for (int i = 0; i < this.quantityReadout; i++)
{
double x = r.NextDouble();
RecursiveFilter(i, a, b, x, masY);
}
return masY;
throw new NotImplementedException();
}
public void RecursiveFilter(int i, double a, double b, double x, double[] masY)
{
if (i == 0)
masY[i] = x;
else
masY[i] = a * x + b * masY[i - 1];
}
public override int GetJMax()
{
int j;
if (delta == 0.02)
j = 9;
else
j = 6;
return j;
}
public override double GetTay4()
{ double m;
m = 1 / (2 * alfa);
return m;
}
}
}
Класс Model2 - содержит в себе алгоритм рекурсивной фильтрации, с помощью которого получается СП с корреляционной функцией Rx(τ)= e- α ׀ τ ׀ *(1-ατ) (модель 2), и вычисляется количество ординат для построения КФ.
namespace Khorova
{
class Model2 : SourceProcess
{
public Model2(int n, double dt, double a, double w)
: base(n, dt, a, w)
{
}
public override double GetDigitizationInterval(double dt)
{
// определение интервала дискретизации
return (Math.Pow(8 * dt, 0.5) / alfa);
}
public override double[] GetMas()
{
double[] masY = new double[quantityReadout];
double[] masX = new double[quantityReadout];
double gamma = alfa * digitizationInterval;
double p = Math.Pow(Math.E, ((-1) * gamma));
double alfa0 = Math.Pow(p, 3) * (1 + gamma) - p * (1 - gamma);
double alfa1 = 1 - 4 * Math.Pow(p, 2) * gamma - Math.Pow(p, 4);
double a0 = Math.Pow(((alfa1 + Math.Pow((Math.Pow(alfa1, 2) - 4 * Math.Pow(alfa0, 2)), 0.5)) / 2), 0.5);
double a1 = alfa1 / a0;
double b1 = 2 * p;
double b2 = (-1) * Math.Pow(p, 2);
Random r = new Random();
for (int i = 0; i < this.quantityReadout; i++)
{
double x = r.NextDouble();
masX[i] = x;
RecursiveFilter(i, a0, a1, b1, b2, masX, masY);
}
return masY;
throw new NotImplementedException();
}
// алгоритм рекурсивной фильтрации
public void RecursiveFilter(int i, double a0, double a1, double b1, double b2, double[] masX, double[] masY)
{
if (i == 0)
masY[i] = masX[i];
else
{
if (i == 1)
masY[i] = a0 * masX[i] + a1 * masX[i - 1] + b1 * masY[i - 1];
else
masY[i] = a0 * masX[i] + a1 * masX[i - 1] + b1 * masY[i - 1] + b2 * masY[i - 2];
}
}
// определение количества ординат
public override int GetJMax()
{
int j = 13;
return j;
}
}
}
Класс Model7 - содержит в себе алгоритм рекурсивной фильтрации, с помощью которого получается СП с корреляционной функцией Rx (τ)= e- α ׀ τ ׀ *(cos(ω0 τ) – α / ω0 *sin(ω0 τ)) (модель 7), и вычисляется количество ординат для построения КФ.
namespace Khorova
{
class Model7 : SourceProcess
{
public Model7(int n, double dt, double a, double w)
: base(n, dt, a, w)
{
}
// определение интервала дискретизации
public override double GetDigitizationInterval(double dt)
{
return (Math.Pow((8 * dt / Math.Abs(Math.Pow((omega / alfa), 2) - 1)), 0.5) / alfa);
}
public override double[] GetMas()
{
double[] masY = new double[quantityReadout];
double[] masX = new double[quantityReadout];
double gamma = alfa * digitizationInterval;
double p = Math.Pow(Math.E, ((-1) * gamma));
double gamma0 = omega * digitizationInterval;
double alfa0 = p * (Math.Pow(p, 2) - 1) * Math.Cos(gamma0) - (alfa / omega) * p * (Math.Pow(p, 2) + 1) * Math.Sin(gamma0);
double alfa1 = 1 - Math.Pow(p, 4) + 4 * Math.Pow(p, 2) * Math.Sin(gamma0) * Math.Cos(gamma0) * (alfa / omega);
double a0 = Math.Pow(((alfa1 + Math.Pow((Math.Pow(alfa1, 2) - 4 * Math.Pow(alfa0, 2)), 0.5)) / 2), 0.5);
double a1 = alfa0 / a0;
double b1 = 2 * p * Math.Cos(gamma0);
double b2 = (-1) * Math.Pow(p, 2);
Random r = new Random();
for (int i = 0; i < this.quantityReadout; i++)
{
double x = r.NextDouble();
masX[i] = x;
RecursiveFilter(i, a0, a1, b1, b2, masX, masY);
}
return masY;
throw new NotImplementedException();
}
// алгоритм рекурсивной фильтрации
public void RecursiveFilter(int i, double a0, double a1, double b1, double b2, double[] masX, double[] masY)
{
if (i == 0)
masY[i] = masX[i];
else
{
if (i == 1)
masY[i] = a0 * masX[i] + a1 * masX[i - 1] + b1 * masY[i - 1];
else
masY[i] = a0 * masX[i] + a1 * masX[i - 1] + b1 * masY[i - 1] + b2 * masY[i - 2];
}
}
public override int GetJMax()
{
int j = (int)Math.Round(47 * (omega) / (2 * Math.PI));
return j;
}
}
}
Класс SourseProcess
sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Khorova
{
abstract class SourceProcess
{
public Calculate calculatCharacter;
public int quantityReadout; //количество отсчетов
public double digitizationInterval; //интервал дискретизации
public double[] values; //массив случайного процесса
public double alfa;
public double omega;
public double delta;
public double tay;
public SourceProcess(int n, double dt, double a, double w)
{
quantityReadout = n;
alfa = a;
omega = w;
delta = dt;
tay = GetTay4();
digitizationInterval = GetDigitizationInterval(dt);
int j = GetJMax();
values = GetMas();
calculatCharacter = new Calculate(n, digitizationInterval, values, j, tay,a,w);
}
public abstract double[] GetMas();
public abstract double GetDigitizationInterval(double dt);
public abstract int GetJMax();
public abstract double GetTay4();
}
}
// ОПИСАНИЕ ЯКОБИ (-1/2 0)
double[,] masYakobi = new double[KolChR, c.Jmax];
for (int i = 0; i < KolChR; i ++)
for (int j = 0; j < c.Jmax; j++)
{
double tay = j * c.digitizationInterval;
if (i == 0)
masYakobi[i, j] = Math.Exp(-1 * gamma * tay / 2);
else
if (i == 1)
masYakobi[i, j] = Math.Exp(-1 * gamma * tay / 2) * (1 - 3 * Math.Exp(-2 * gamma * tay)) / 2;
else
{
int z = 4 * i - 5;
int x = 4 * i - 1;
int b = 2 * i - 1;
int r = 4 * i - 3;
int t = 2 * i - 3;
int y = i - 1;
masYakobi[i, j] = ((z * x * (1 - 2 * Math.Exp(-2 * gamma * tay)) + 1) * r * masYakobi[i - 1, j] - 4 * y * t * x * masYakobi[i - 2, j]) / (4 * i * b * z);
}
}
//ОПИСАНИЕ 1ГО ИНТЕГРАЛА
double[,] masI1 = new double[KolChR, c.Jmax];
for (int i = 0; i < KolChR; i++)
{
for (int j = 0; j < c.Jmax; j += 1)
{
double tay = j * c.digitizationInterval;
if (i==0)
masI1[0, j] = -2* Math.Exp(-gamma*tay/2)/gamma;
else
if (i==1)
masI1[i, j] = (-1 * Math.Exp(-gamma * tay / 2) * (5 - 3 * Math.Exp(-2*gamma*tay)))/ (5*gamma);
else
{
double ch = (4 * i + 1);
double ch2 = 4 * i - 3;
double ch3 = 4 * i - 7;
masI1[i, j] = (2 * ch2 * masI1[i - 1, j]) / ch - (ch3 * masI1[i - 2, j]) / ch - 2 * ((masYakobi[i, j] - masYakobi[i - 2, j]) ) / (gamma * ch);
}
}
}
// ОПИСАНИЕ 2ГО ИНТЕГРАЛА
double[,] masI2 = new double[KolChR, c.Jmax];
for (int i = 0; i < KolChR; i++)
{
for (int j = 0; j < c.Jmax; j ++)
{
double tau = j * c.digitizationInterval;
double ex = Math.Exp((- gamma * tau) / 2);
double ex2 = Math.Exp(-2 * gamma * tau);
double ex3 = Math.Exp(-4 * gamma * tau);
if (i == 0)
masI2[i, j] = (-2 * ex * (gamma * tau + 2)) / (Math.Pow(gamma, 2));
else
if (i == 1)
masI2[i, j] = -1 * ex * (50 - 6 * ex2 + gamma * tau * (25 - 15 * ex2)) / (25 * Math.Pow(gamma, 2));
else
if (i==2)
masI2[i, j] = -1 * ex * (2430 - 972 * ex2 + 350 * ex3 + gamma * tau * (1215 - 2430 * ex2 + 1575 * ex3)) / (1620 * Math.Pow(gamma, 2));
else
{
double ch = (4 * i + 1);
double ch2 = 4 * i - 3;
double ch3 = 4 * i - 7;
masI2[i, j] = (2 * ch2 * masI2[i - 1, j]) / ch - (ch3 * masI2[i - 2, j]) / ch - 2 * ((masYakobi[i, j] - masYakobi[i - 2, j]) * tau - masI1[i, j] + masI1[i - 2, j]) / (gamma * ch);
}
}
}
// ОПРЕДЕЛЕНИЕ КОЭФФИЦИЕНТОВ РАЗЛОЖЕНИЯ
double[] masTau = new double [c.Jmax];
double[] A = new double[c.Jmax ];
double[] B = new double[c.Jmax ];
double[] Betta = new double[KolChR ];
double summaB=0;
for (int q = 0; q < c.Jmax; q ++)
{
masTau[q] = q * c.digitizationInterval;
}
for (int q = 0; q < c.Jmax -1 ; q += 1)
{
A[q] = (c.correlationFunction[q + 1] - c.correlationFunction[q]) / (masTau[q + 1] - masTau[q]);
// A[q] = (TeorCorFuncM7(masTau[q + 1]) - TeorCorFuncM7(masTau[q])) / (masTau[q + 1] - masTau[q]);
}
for (int q = 0; q < c.Jmax; q ++)
{
B[q] = c.correlationFunction[q] - A[q] * masTau[q];
}
// коэффициенты bk
for (int k = 0; k < KolChR; k += 1)
{
for (int j = 0; j < c.Jmax-1; j += 1)
{
summaB = summaB + B[j] * (masI1[k, j + 1] - masI1[k, j]) + (A[j] * (masI2[k, j + 1] - masI2[k, j]));
}
Betta[k] = gamma * (4 * k + 1) * summaB;
summaB = 0;
}
//аппроксимация
double[] masAprFunc = new double[c.Jmax];
for (int q = 0; q < c.Jmax ; q++)
{
for (int i = 0; i < KolChR; i++)
{
masAprFunc[q] += Betta[i] * masYakobi[i, q];
}
}
// практический спектр
private double AprSpektr(double w, double [] BettaK)
{
double g = Convert.ToDouble(textBoxGammaOpt.Text);
double sum = 0;
double spektr = 0;
double arctg, REZ;
KolChR = Convert.ToInt16(textBoxKolChR.Text);
for (int k = 0; k < KolChR; k++)
{
sum = 0;
for (int s = 0; s < k; s++)
sum += Math.Atan(2 * w / (g * (4 * s + 1)));
arctg = Math.Atan(2 * w / (g * (4 * k + 1)));
spektr += BettaK[k] * Math.Cos(arctg) * Math.Cos(arctg + 2 * sum)/(4*k+1);
}
REZ = (2 * spektr / (g * Math.PI));
spektr = 0;
return REZ;
}
Поиск по сайту: