JackXavier Deleted File  almost 8 years ago

Commit id: b84587ce058bdd08c894f95388b663fb9377d0d0

deletions | additions      

         

\usepackage{listings}  \section{Листинг программы на java}  В рамках данного курса также была написана программа на языке высокого уровня java (в среде Netbeans), реализующая упрощенную версию данного алогритма. Ниже приведен листинг одного из классов написанной программ.Демострация работы программы приведена на рисунке.  \begin{lstlisting}  package kalman1;  import java.io.BufferedReader;  import java.io.FileReader;  import java.io.IOException;  public class Kalman1 {  private double[] Value;  private int Size;  private double Acceleration;  private double SigmaPsi;  private double SigmaEta;  private double[] Coordinate;  private double CoordinateMax;  private double CoordinateMin;  private double[] Sensor;  private double SensorMax;  private double SensorMin;  private double[] Error;  private double[] Kalman;  private double[] Optimal;  private double OptimalMax;  private double OptimalMin;    // случайная функция с нормальным распределением  public double GaussRND(double Sigma ,double MX ){  double u, v, s;  do{  u = 2.0 * Math.random() - 1.0;  v = 2.0 * Math.random() - 1.0;  s = u * u + v * v;  }while(s > 1.0 || s == 0.0);   double Sq = Math.sqrt(-2.0 * Math.log(s) / s);  return MX + Sigma * u * Sq;  }    // задаем размер  public void setSize(int Size){  this.Size = Size;  }    // вывыдим размер  public int getSize(){  return this.Size;  }    // коэффициент ускорения  public void setAcceleration(double Acceleration){  this.Acceleration = Acceleration;  }    // дисперсия ошибки модели  public void setSigmaPsi(double SigmaPsi){  this.SigmaPsi = SigmaPsi;  }    // дисперсия ошибки сенсора  public void setSigmaEta(double SigmaEta){  this.SigmaEta = SigmaEta;  }    // случайная величина с файла  public void setCoordinates(double[] Value){  this.Coordinate = new double[this.Size];  for(int i = 0; i < this.Size;i++){  this.Coordinate[i] = Value[i];  }  }    // генерация управляющей функции  public void setValue(int Key,double a,double b,double c,double d){  this.Value = new double[this.Size];  switch (Key){  case 0:{  for(int i = 0; i < this.Size; i++)  Value[i] = i*a + b;  break;  }  case 1:{  for(int i = 0; i < this.Size; i++)  Value[i] = i*i*a + i*b + c;  break;  }  case 2:{  for(int i = 0; i < this.Size; i++)  Value[i] = i*i*i*a + i*i*b + c*i + d;  break;  }  case 3:{  for(int i = 0; i < this.Size; i++)  Value[i] = a*Math.sin(i*b) + c*Math.cos(i*d);  break;  }  case 4:{  for(int i = 0; i < this.Size; i++)  Value[i] = Math.log(i+2);  break;  }  }  }  // генерация случайной величины  public void setCoordinates(){  this.Coordinate = new double[this.Size];  this.Coordinate[0] = 0;  for(int i = 0; i < this.Size - 1;i++){  this.Coordinate[i + 1] = this.Coordinate[i]+this.Acceleration*this.Value[i]+GaussRND(SigmaPsi,0);  }   double min = 1e9;  double max = -1e9;  for(int i = 0; i < this.Size - 1;i++){  if(this.Coordinate[i] >= max)  max = this.Coordinate[i];  if(this.Coordinate[i] < min)  min = this.Coordinate[i];  }   this.CoordinateMax = max;  this.CoordinateMin = min;   }    // генерация случайной величины считанной сенсором  public void setSensor(){  this.Sensor = new double[this.Size];  this.Sensor[0] = 0;  for(int i = 0; i < this.Size;i++){  this.Sensor[i] =this.Coordinate[i]+GaussRND(SigmaEta,0);  }   double min = 1e9;  double max = -1e9;  for(int i = 0; i < this.Size - 1;i++){  if(this.Sensor[i] >= max)  max = this.Sensor[i];  if(this.Sensor[i] < min)  min = this.Sensor[i];  }   this.SensorMax = max;  this.SensorMin = min;   }    // ищем корень дисперсии ошибки  public void SetError(){  this.Error = new double[this.Size];   this.Error[0] = this.SigmaEta;  for(int i = 0; i < this.Size - 1;i++){  this.Error[i+1]= Math.sqrt((this.SigmaEta*this.SigmaEta)*  (this.Error[i] * this.Error[i]   + this.SigmaPsi * this.SigmaPsi)  / (this.SigmaEta * this.SigmaEta  + this.Error[i] * this.Error[i]  + this.SigmaPsi * this.SigmaPsi));  }  }    // ищем усиление калмана  public void SetKalman(){  this.Kalman = new double[this.Size];  for(int i = 0; i < this.Size;i++){  this.Kalman[i]=(this.Error[i]*this.Error[i])/(this.SigmaEta * this.SigmaEta);  }  }    // считаем оптимальное отфильтрованное значение  public void SetOptimal(){  this.Optimal = new double[this.Size];  this.Optimal[0] = this.Sensor[0];  for(int i = 0; i < this.Size - 1;i++){  this.Optimal[i+1] = (this.Optimal[i] + this.Acceleration * i)  * ( 1-this.Kalman[i+1] )   + this.Kalman[i+1] * this.Sensor[i+1];  }  double min = 1e9;  double max = -1e9;  for(int i = 0; i < this.Size - 1;i++){  if(this.Optimal[i] >= max)  max = this.Optimal[i];  if(this.Optimal[i] < min)  min = this.Optimal[i];  }   this.OptimalMax = max;  this.OptimalMin = min;  }    // считываем входные значения с массива  public void setValue(String filename){  try{  FileReader myfile = new FileReader(filename);  BufferedReader in = new BufferedReader(myfile);  String S = null;  for(int i = 0; i < this.Size; i++){  S = in.readLine();  Value[i] = Double.parseDouble(S);  }  in.close();  }  catch(IOException e){  System.out.println(e.getMessage());  }  }    // выводим информацию о фильтре  public void Show(){  for(int i = 0; i < this.Size; i++){  System.out.println( this.Coordinate[i] + "\t" +  this.Sensor[i] + "\t" +  this.Error[i] + "\t" +  this.Kalman[i] + "\t" +  this.Optimal[i]  );  }  }    // координаты в Int   public int[] CoordinateToInt(int Multiplier){  int[] result = new int[this.Size];   for(int i = 0; i < this.Size; i++){  result[i] = (int)(Multiplier*this.Coordinate[i]);  }  return result;  }    // значение сенсора в Int   public int[] SensorToInt(int Multiplier){  int[] result = new int[this.Size];   for(int i = 0; i < this.Size; i++){  result[i] = (int)(Multiplier*this.Sensor[i]);  }  return result;  }    // значение сенсора в Int   public int[] OptimalToInt(int Multiplier){  int[] result = new int[this.Size];   for(int i = 0; i < this.Size; i++){  result[i] = (int)(Multiplier*this.Optimal[i]);  }  return result;  }    // максимальное целочисленное значение координаты  public int CoordinateMax(int Multiplier){  return (int)(Multiplier*this.CoordinateMax);  }    // минимальное целочисленное значение координаты  public int CoordinateMin(int Multiplier){  return (int)(Multiplier*this.CoordinateMin);  }    // максимальное целочисленное значение координаты  public int SensorMax(int Multiplier){  return (int)(Multiplier*this.SensorMax);  }    // минимальное целочисленное значение координаты  public int SensorMin(int Multiplier){  return (int)(Multiplier*this.SensorMin);  }    // максимальное целочисленное значение координаты  public int OptimalMax(int Multiplier){  return (int)(Multiplier*this.OptimalMax);  }    // минимальное целочисленное значение координаты  public int OptimalMin(int Multiplier){  return (int)(Multiplier*this.OptimalMin);  }    //   public Kalman1(int Size, double Acceleration, double SigmaPsi, double SigmaEta,int Key, double a,double b,double c,double d){  this.setSize(Size);  this.setAcceleration(Acceleration);  this.setSigmaPsi(SigmaPsi);  this.setSigmaEta(SigmaEta);  this.setValue(Key,a,b,c,d);  this.setCoordinates();  this.setSensor();  this.SetError();  this.SetKalman();  this.SetOptimal();  //this.Show();  }    //   public static void main(String[] args) {   GUI myGUI = new GUI(15,15);  }    }  \end{lstlisting}