java - Apache Commons Math: restricting optimization domain -
i fit quadratic function y = + bx + cx^2 data, in such way c greater or equal 0 in final result. is, restrict search domain on c particular range ([0, double.max_value]). currently, have following code snippet:
final curvefitter<parametric> fitter = new curvefitter<parametric>(new levenbergmarquardtoptimizer()); fitter.addobservedpoint(0, 0); fitter.addobservedpoint(1, -1); fitter.addobservedpoint(-1, -1); fitter.addobservedpoint(2, -4); fitter.addobservedpoint(-2, -4); final double[] init = { 1, 2, 3 }; final double[] best = fitter.fit(new positivepolynomialfunctionparametric(), init); final polynomialfunction fitted = new polynomialfunction(best); system.out.println(arrays.tostring(fitted.getcoefficients()));
where:
private static class positivepolynomialfunctionparametric extends polynomialfunction.parametric { @override public double value(double x, double... parameters) { parameters[parameters.length - 1] = math.abs(parameters[parameters.length - 1]); return super.value(x, parameters); } @override public double[] gradient(double x, double... parameters) { parameters[parameters.length - 1] = math.abs(parameters[parameters.length - 1]); return super.gradient(x, parameters); } }
the output makes sense:
[-1.4286835350284688, -8.489786562989103e-17, 1.0300498244514197e-11]
this seems work in particular application, not elegant solution general case of restricting search domain. there better way this?
you should use 1 of optimizers implements/extends *boundsoptimizer types, or supports simplebounds in optimizationdata. section 12.4 of the user guide on optimization mentions way adjust function being optimized, recommends using 1 of bounds-supporting algorithms instead.
Comments
Post a Comment