001 package numal.lowprecision; 002 003 /** Methods for computing the residual vector of a function, its jacobian matrix and several 004 * options accessor methods which control the behavior of {@link AnalyticProblems#marquardt} 005 * to evaluate the properties of a given function f(x[i],par) with n parameters par over a set 006 * of point {x[i],y[i]) where i=1 to m. 007 */ 008 public interface Function { 009 010 /** Get the analytic values of the function for the given set of parameters and for all abcissa. 011 * 012 * @param m number of sample points used in the fitting 013 * @param parameter an array of function parameters 014 * @return the value of this function for all abcissa and parameters 015 */ 016 public float[] getAnalyticValues(int m, float parameter[]); 017 018 /** Get residual vector rv[i] = f(x[i],par) - y[i]. POSTCONDITION: parameter array must not be altered. 019 * 020 * @param m number of sample points used in the fitting 021 * @param n number of parameters, must be less than or equal to m 022 * @param parameter <b>input</b>: current values of parameters (shouldn't be altered by funct) 023 * @param rv <b>output</b>: residual vector obtained with current value of parameters; i.e f(x[i],par) - y[i] 024 * @return true when successful, false if current estimates of parameters lie outside a feasible region (invoker can avoid residual vector calculations on values which may make no sense or even cause overflow) 025 */ 026 public boolean computeResidualVector(int m, int n, float parameter[], float rv[]); 027 028 /** Get the partial derivatives jac[i][j] = drv[i]/dpar[j], obtained with the current values 029 * of the parameters. The precision of this method in computing the elements of jac must be at 030 * least the precision defined by in[3] and in[4] of {@link AnalyticProblems#marquardt}. 031 * POSTCONDITION: parameter array must not be altered. 032 * 033 * @param m number of sample points used in the fitting 034 * @param n number of parameters, must be less than or equal to the number of sample points 035 * @param parameter <b>input</b>: current values of parameters 036 * @param rv <b>output</b>: residual vector obtained with current value of parameters; i.e f(x[i],parameter) - y[i] 037 * @param jac <b>output</b>: partial derivatives drv[i]/dparameter[j], obtained with the current values of the parameters 038 */ 039 public void computeJacobian(int m, int n, float parameter[], float rv[], float jac[][]); 040 041 /** Maximum allowed number of invocations of {@link Function#computeResidualVector} */ 042 public int getInvocations(); // in[5] 043 044 /** Machine precision */ 045 public float getMachinePrecision(); // in[0] 046 047 /** Relative tolerance for the difference between the Euclidian norm of the ultimate and 048 * penultimate residual vector (value of epsilon_re) (see absoluteTolerance) */ 049 public float getRelativeTolerance(); // in[3] 050 051 /** Absolute tolerance for the difference between the Euclidian norm of the ultimate and 052 * penultimate residual vector (value of epsilon_a) the process is terminated if the improvement 053 * of the sum of the squares is less than relativeTolerance*(sum of the squares)+absoluteTolerance*absoluteTolerance */ 054 public float getAbsoluteTolerance(); // in[4] 055 056 /** Starting value used for the relation between the gradient and the Gauss-Newton direction (value of ξ); 057 * if the problem is well conditioned then a suitable value for startingValue will be 0.01; 058 * if the problem is ill conditioned then startingValue should be greater, but the value of startingValue must 059 * satisfy : machinePrecision < startingValue ≤ 1 / machinePrecision */ 060 public float getStartingValue(); // in[6] 061 062 }