Example usage for org.apache.commons.math3.fitting.leastsquares MultivariateJacobianFunction MultivariateJacobianFunction

List of usage examples for org.apache.commons.math3.fitting.leastsquares MultivariateJacobianFunction MultivariateJacobianFunction

Introduction

In this page you can find the example usage for org.apache.commons.math3.fitting.leastsquares MultivariateJacobianFunction MultivariateJacobianFunction.

Prototype

MultivariateJacobianFunction

Source Link

Usage

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;
}