public static <D extends DMatrix> FunctionNtoMxN<D> jacobianForwards(FunctionNtoM func, Class<D> type ) { if( type == DMatrixRMaj.class ) { return (FunctionNtoMxN)new NumericalJacobianForward_DDRM(func); } else if( type == DMatrixSparseCSC.class ) { return (FunctionNtoMxN)new NumericalJacobianForward_DSCC(func); } else { throw new RuntimeException("Matrix type unknown/not supported. "+type.getSimpleName()); } }
public static <D extends DMatrix> FunctionNtoMxN<D> jacobianForwards(FunctionNtoM func, Class<D> type ) { if( type == DMatrixRMaj.class ) { return (FunctionNtoMxN)new NumericalJacobianForward_DDRM(func); } else if( type == DMatrixSparseCSC.class ) { return (FunctionNtoMxN)new NumericalJacobianForward_DSCC(func); } else { throw new RuntimeException("Matrix type unknown/not supported. "+type.getSimpleName()); } }
double param[] , double tol , double differenceScale ) NumericalJacobianForward_DDRM numerical = new NumericalJacobianForward_DDRM(func,differenceScale);
double param[] , double tol , double differenceScale ) NumericalJacobianForward_DDRM numerical = new NumericalJacobianForward_DDRM(func,differenceScale);
double param[] , double tol , double differenceScale ) NumericalJacobianForward_DDRM numerical = new NumericalJacobianForward_DDRM(func,differenceScale);
double param[] , double tol , double differenceScale ) NumericalJacobianForward_DDRM numerical = new NumericalJacobianForward_DDRM(func,differenceScale);
double param[] , double tol , double differenceScale ) NumericalJacobianForward_DDRM numerical = new NumericalJacobianForward_DDRM(func,differenceScale);
double param[] , double tol , double differenceScale ) NumericalJacobianForward_DDRM numerical = new NumericalJacobianForward_DDRM(func,differenceScale);
public static <S extends DMatrix> boolean jacobian( FunctionNtoM func , FunctionNtoMxN<S> jacobian , double param[] , double tol , double differenceScale ) { NumericalJacobianForward_DDRM numerical = new NumericalJacobianForward_DDRM(func,differenceScale); if( numerical.getNumOfOutputsM() != jacobian.getNumOfOutputsM() ) throw new RuntimeException("M is not equal "+numerical.getNumOfOutputsM()+" "+jacobian.getNumOfOutputsM()); if( numerical.getNumOfInputsN() != jacobian.getNumOfInputsN() ) throw new RuntimeException("N is not equal: "+numerical.getNumOfInputsN()+" "+jacobian.getNumOfInputsN()); S found = jacobian.declareMatrixMxN(); DMatrixRMaj expected = new DMatrixRMaj(func.getNumOfOutputsM(),func.getNumOfInputsN()); jacobian.process(param,found); numerical.process(param,expected); checkJacobianShape(found, expected); return MatrixFeatures_D.isIdentical(expected,found,tol); }
public static <S extends DMatrix> boolean jacobian( FunctionNtoM func , FunctionNtoMxN<S> jacobian , double param[] , double tol , double differenceScale ) { NumericalJacobianForward_DDRM numerical = new NumericalJacobianForward_DDRM(func,differenceScale); if( numerical.getNumOfOutputsM() != jacobian.getNumOfOutputsM() ) throw new RuntimeException("M is not equal "+numerical.getNumOfOutputsM()+" "+jacobian.getNumOfOutputsM()); if( numerical.getNumOfInputsN() != jacobian.getNumOfInputsN() ) throw new RuntimeException("N is not equal: "+numerical.getNumOfInputsN()+" "+jacobian.getNumOfInputsN()); S found = jacobian.declareMatrixMxN(); DMatrixRMaj expected = new DMatrixRMaj(func.getNumOfOutputsM(),func.getNumOfInputsN()); jacobian.process(param,found); numerical.process(param,expected); checkJacobianShape(found, expected); return MatrixFeatures_D.isIdentical(expected,found,tol); }
@Test public void simple() { // give it a function where one variable does not effect the output // to make the test more interesting SimpleFunction f = new SimpleFunction(); NumericalJacobianForward_DDRM alg = new NumericalJacobianForward_DDRM(f); DMatrixRMaj output = alg.declareMatrixMxN(); alg.process(new double[]{2,3,7},output); assertEquals(3, output.data[0], tol); assertEquals(-36, output.data[1], tol); assertEquals(0, output.data[2], tol); assertEquals(3, output.data[3], tol); assertEquals(2, output.data[4], tol); assertEquals(1, output.data[5], tol); }
/** * Makes sure if the jacobian is null that the numerical differentiation is done and that it uses the expected * one */ @Test public void checkNumerical() { double a = 2; double b = 0.1; FunctionNtoM residual = new TrivialLeastSquaresResidual(a,b); FunctionNtoMxN<DMatrixRMaj> jacobian = new NumericalJacobianForward_DDRM(residual); UnconstrainedLeastSquares<DMatrixRMaj> alg = createAlgorithm(); alg.setFunction(residual,jacobian); alg.initialize(new double[]{1,0.5},1e-10,1e-10); for( int i = 0; i < 200 && !alg.iterate(); i++ ) {} double expected[] = alg.getParameters().clone(); alg.setFunction(residual,null); alg.initialize(new double[]{1,0.5},1e-10,1e-10); for( int i = 0; i < 200 && !alg.iterate(); i++ ) {} double found[] = alg.getParameters().clone(); for( int i = 0; i < found.length; i++ ) { assertTrue(found[i]==expected[i]); } }
double b = 0.1; FunctionNtoM residual = new TrivialLeastSquaresResidual(a,b); FunctionNtoMxN<DMatrixRMaj> jacobian = new NumericalJacobianForward_DDRM(residual);