List of usage examples for org.apache.commons.math3.fitting.leastsquares MultivariateJacobianFunction MultivariateJacobianFunction
MultivariateJacobianFunction
From source file:org.orekit.propagation.conversion.AbstractPropagatorConverter.java
/** Find the propagator that minimize the mean square error for a sample of {@link SpacecraftState states}. * @param initial initial estimation parameters (position, velocity, free parameters) * @return fitted parameters//from w ww. jav a 2 s . com * @exception OrekitException if propagator cannot be adapted * @exception MaxCountExceededException if maximal number of iterations is exceeded */ private double[] fit(final double[] initial) throws OrekitException, MaxCountExceededException { final MultivariateVectorFunction f = getObjectiveFunction(); final MultivariateMatrixFunction jac = getObjectiveFunctionJacobian(); final MultivariateJacobianFunction fJac = new MultivariateJacobianFunction() { /** {@inheritDoc} */ @Override public Pair<RealVector, RealMatrix> value(final RealVector point) { final double[] p = point.toArray(); return new Pair<RealVector, RealMatrix>(MatrixUtils.createRealVector(f.value(p)), MatrixUtils.createRealMatrix(jac.value(p))); } }; final LeastSquaresProblem problem = new LeastSquaresBuilder().maxIterations(maxIterations) .maxEvaluations(Integer.MAX_VALUE).model(fJac).target(target).weight(new DiagonalMatrix(weight)) .start(initial).checker(checker).build(); optimum = optimizer.optimize(problem); return optimum.getPoint().toArray(); }
From source file:uk.ac.diamond.scisoft.analysis.optimize.ApacheOptimizer.java
public MultivariateJacobianFunction createJacobianFunction() { final int size = coords[0].getSize(); final AFunction afn; final CoordinatesIterator it; final DoubleDataset vd, pvd; final double[][] dm = new double[size][n]; if (function instanceof AFunction) { afn = (AFunction) function;// w w w . j av a 2 s . c o m it = afn.getIterator(coords); vd = (DoubleDataset) DatasetFactory.zeros(coords[0].getShapeRef(), Dataset.FLOAT64); pvd = vd.clone(); } else { afn = null; it = null; vd = null; pvd = null; } MultivariateJacobianFunction f = new MultivariateJacobianFunction() { @SuppressWarnings("null") @Override public Pair<RealVector, RealMatrix> value(RealVector point) { IMonitor monitor = function.getMonitor(); if (monitor != null && monitor.isCancelled()) { throw new IllegalMonitorStateException("Monitor cancelled"); } if (point instanceof ArrayRealVector) { setParameterValues(((ArrayRealVector) point).getDataRef()); } else { setParameterValues(point.toArray()); } final double[] dv; if (afn != null) { dv = vd.getData(); AFunction afn = (AFunction) function; afn.fillWithValues(vd, it); double[] pd = pvd.getData(); for (int i = 0; i < n; i++) { // assuming number of parameters is less than number of coordinates IParameter p = params.get(i); afn.fillWithPartialDerivativeValues(p, pvd, it); for (int j = 0; j < size; j++) { dm[j][i] = pd[j]; } } } else { dv = calculateValues().getData(); for (int i = 0; i < n; i++) { IParameter p = params.get(i); DoubleDataset dp = (DoubleDataset) DatasetUtils .cast(function.calculatePartialDerivativeValues(p, coords), Dataset.FLOAT64); double[] pd = dp.getData(); for (int j = 0; j < size; j++) { dm[j][i] = pd[j]; } } } return new Pair<RealVector, RealMatrix>(new ArrayRealVector(dv, false), new Array2DRowRealMatrix(dm, false)); } }; return f; }