List of usage examples for org.apache.commons.math.analysis MultivariateVectorialFunction MultivariateVectorialFunction
MultivariateVectorialFunction
From source file:uk.ac.diamond.scisoft.analysis.optimize.ApacheConjugateGradient.java
@Override public void optimize(IDataset[] coords, IDataset data, final IFunction function) throws Exception { // pull out appropriate data from the inputs in a way that they can be used final int numCoords = coords.length; final DoubleDataset[] newCoords = new DoubleDataset[numCoords]; for (int i = 0; i < numCoords; i++) { newCoords[i] = (DoubleDataset) DatasetUtils.convertToAbstractDataset(coords[i]) .cast(AbstractDataset.FLOAT64); }//from ww w.java 2s . co m final DoubleDataset values = (DoubleDataset) DatasetUtils.convertToAbstractDataset(data) .cast(AbstractDataset.FLOAT64); NonLinearConjugateGradientOptimizer cg = new NonLinearConjugateGradientOptimizer( ConjugateGradientFormula.POLAK_RIBIERE); //FIXME - this does not work very well for many cases. DifferentiableMultivariateRealFunction f = new DifferentiableMultivariateRealFunction() { @Override public double value(double[] arg0) throws FunctionEvaluationException, IllegalArgumentException { function.setParameterValues(arg0); return function.residual(true, values, newCoords); } @Override public MultivariateRealFunction partialDerivative(final int parameter) { MultivariateRealFunction result = new MultivariateRealFunction() { @Override public double value(double[] parameters) throws FunctionEvaluationException, IllegalArgumentException { double step = 0.1; parameters[parameter] -= step; function.setParameterValues(parameters); double min = function.residual(true, values, newCoords); parameters[parameter] += 2.0 * step; function.setParameterValues(parameters); double max = function.residual(true, values, newCoords); return -((max - min) / (2.0 * step)); } }; return result; } @Override public MultivariateVectorialFunction gradient() { MultivariateVectorialFunction result = new MultivariateVectorialFunction() { @Override public double[] value(double[] parameters) throws FunctionEvaluationException, IllegalArgumentException { double[] result = new double[parameters.length]; for (int i = 0; i < parameters.length; i++) { result[i] = partialDerivative(i).value(parameters); } return result; } }; return result; } }; double[] start = function.getParameterValues(); RealPointValuePair result = cg.optimize(f, GoalType.MINIMIZE, start); function.setParameterValues(result.getPoint()); }