1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)


4  *


5  * This file is part of HeuristicLab.


6  *


7  * HeuristicLab is free software: you can redistribute it and/or modify


8  * it under the terms of the GNU General Public License as published by


9  * the Free Software Foundation, either version 3 of the License, or


10  * (at your option) any later version.


11  *


12  * HeuristicLab is distributed in the hope that it will be useful,


13  * but WITHOUT ANY WARRANTY; without even the implied warranty of


14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the


15  * GNU General Public License for more details.


16  *


17  * You should have received a copy of the GNU General Public License


18  * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.


19  */


20  #endregion


21 


22  using System;


23  using System.Linq;


24 


25  namespace HeuristicLab.Analysis.Statistics {


26  public class ExpFitting : IFitting {


27  private void ExpFunc(double[] c, double[] x, ref double func, object obj) {


28  func = Math.Exp(c[0] * Math.Pow(x[0], 2));


29  }


30 


31  private double[] GetDefaultXValues(int n) {


32  var stdX = Enumerable.Range(1, n).Select(x => (double)x).ToArray();


33  return stdX;


34  }


35 


36  public void Calculate(double[] dataPoints, out double p0) {


37  var stdX = GetDefaultXValues(dataPoints.Count());


38  Calculate(dataPoints, stdX, out p0);


39  }


40 


41  public void Calculate(double[] y, double[] x, out double p0) {


42  if (y.Count() != x.Count()) {


43  throw new ArgumentException("The lenght of x and y needs do be equal. ");


44  }


45 


46  double[] c = new double[] { 0.3 };


47  double epsf = 0;


48  double epsx = 0.000001;


49  int maxits = 0;


50  int info;


51  alglib.lsfitstate state;


52  alglib.lsfitreport rep;


53  double diffstep = 0.0001;


54  double[,] xx = new double[x.Count(), 1];


55 


56  for (int i = 0; i < x.Count(); i++) {


57  xx[i, 0] = x[i];


58  }


59 


60  alglib.lsfitcreatef(xx, y, c, diffstep, out state);


61  alglib.lsfitsetcond(state, epsf, epsx, maxits);


62  alglib.lsfitfit(state, ExpFunc, null, null);


63  alglib.lsfitresults(state, out info, out c, out rep);


64 


65  p0 = c[0];


66  }


67 


68  public DataRow CalculateFittedLine(double[] dataPoints) {


69  DataRow newRow = new DataRow();


70  double c0;


71  Calculate(dataPoints, out c0);


72  var stdX = GetDefaultXValues(dataPoints.Count());


73 


74  for (int i = 0; i < stdX.Count(); i++) {


75  newRow.Values.Add(Math.Exp(c0 * Math.Pow(stdX[i], 2)));


76  }


77 


78  return newRow;


79  }


80 


81  public DataRow CalculateFittedLine(double[] y, double[] x) {


82  DataRow newRow = new DataRow();


83  double c0;


84  Calculate(y, x, out c0);


85 


86  for (int i = 0; i < x.Count(); i++) {


87  newRow.Values.Add(Math.Exp(c0 * Math.Pow(x[i], 2)));


88  }


89 


90  return newRow;


91  }


92 


93  public override string ToString() {


94  return "Exponential Fitting";


95  }


96  }


97  }

