/// <summary> /// Estimates the specified model. /// </summary> /// <param name = "model">Model function.</param> /// <param name = "solverOptions">Least squares solver options.</param> /// <param name = "pointCount">Number of data points.</param> /// <param name = "dataX">X-coordinates of the data points.</param> /// <param name = "dataY">Y-coordinates of the data points.</param> /// <param name = "iterations">Estimated model function parameters.</param> public void Estimate(PowerModel model, int pointCount, Vector <double> dataX, Vector <double> dataY, ref List <Vector <double> > iterations) { this.dataX = dataX; this.dataY = dataY; int n = guess.Count; Vector <double> parametersCurrent = guess; Vector <double> parametersNew = new DenseVector(n); double valueCurrent; double valueNew; GetObjectiveValue(model, pointCount, parametersCurrent, out valueCurrent); while (true) { Matrix <double> jacobian = new DenseMatrix(pointCount, n); Vector <double> residual = new DenseVector(pointCount); GetObjectiveJacobian(model, pointCount, parametersCurrent, ref jacobian); model.GetResidualVector(pointCount, dataX, dataY, parametersCurrent, ref residual); Vector <double> step = jacobian.Transpose().Multiply(jacobian).Cholesky().Solve(jacobian.Transpose().Multiply(residual)); parametersCurrent.Subtract(step, parametersNew); GetObjectiveValue(model, pointCount, parametersNew, out valueNew); iterations.Add(parametersNew); if (ShouldTerminate(valueCurrent, valueNew, iterations.Count, parametersCurrent, parametersNew)) { break; } parametersNew.CopyTo(parametersCurrent); valueCurrent = valueNew; } }