teichmann@5831: package org.dive4elements.river.artifacts.math.fitting; sascha@2569: sascha@2569: import java.util.List; sascha@2569: import java.util.Map; sascha@2569: import java.util.ArrayList; sascha@2569: import java.util.TreeMap; sascha@2569: import java.util.Comparator; sascha@2569: sascha@2569: import java.io.IOException; sascha@2569: import java.io.BufferedReader; sascha@2569: import java.io.Reader; sascha@2569: import java.io.InputStreamReader; sascha@2569: sascha@2569: import org.apache.commons.math.optimization.fitting.CurveFitter; sascha@2569: sascha@2569: import org.apache.commons.math.optimization.general.LevenbergMarquardtOptimizer; sascha@2569: sascha@2569: import org.apache.commons.math.MathException; sascha@2569: sascha@2569: public class App sascha@2569: { sascha@2569: public static final double EPS = 1e-5; sascha@2569: sascha@2569: public static final String FUNCTION_NAME = sascha@2569: System.getProperty("function", "linear"); sascha@2569: sascha@2569: public static final Comparator EPS_CMP = sascha@2569: new Comparator() { sascha@2569: @Override sascha@2569: public int compare(Double a, Double b) { sascha@2569: double diff = a - b; sascha@2569: if (diff < -EPS) return -1; sascha@2569: if (diff > EPS) return +1; sascha@2569: return 0; sascha@2569: } sascha@2569: }; sascha@2569: sascha@3076: public static final ListreadPoints(Reader reader) sascha@2569: throws IOException sascha@2569: { sascha@2569: Map map = new TreeMap(EPS_CMP); sascha@2569: sascha@2569: BufferedReader input = new BufferedReader(reader); sascha@2569: sascha@2569: String line; sascha@2569: while ((line = input.readLine()) != null) { sascha@2569: if ((line = line.trim()).length() == 0 || line.startsWith("#")) { sascha@2569: continue; sascha@2569: } sascha@2569: sascha@2569: String [] parts = line.split("\\s+"); sascha@2569: sascha@2569: if (parts.length < 2) { sascha@2569: continue; sascha@2569: } sascha@2569: sascha@2569: try { sascha@2569: Double x = Double.valueOf(parts[0]); sascha@2569: Double y = Double.valueOf(parts[1]); sascha@2569: sascha@2569: Double old = map.put(x, y); sascha@2569: sascha@2569: if (old != null) { sascha@2569: System.err.println("duplicate x: " + x); sascha@2569: } sascha@2569: } sascha@2569: catch (NumberFormatException nfe) { sascha@2569: nfe.printStackTrace(); sascha@2569: } sascha@2569: } sascha@2569: sascha@2569: List list = new ArrayList(map.size()); sascha@2569: sascha@2569: for (Map.Entry entry: map.entrySet()) { sascha@2569: list.add(new Double [] { entry.getKey(), entry.getValue() }); sascha@2569: } sascha@2569: sascha@2569: return list; sascha@2569: } sascha@2569: sascha@2569: public static void main(String [] args) { sascha@2569: sascha@2569: Function function = FunctionFactory sascha@2569: .getInstance() sascha@2569: .getFunction(FUNCTION_NAME); sascha@2569: sascha@2569: if (function == null) { sascha@2569: System.err.println("Cannot find function '" + FUNCTION_NAME + "'."); sascha@2569: System.exit(1); sascha@2569: } sascha@2569: sascha@2569: List points = null; sascha@2569: sascha@2569: try { sascha@2569: points = readPoints(new InputStreamReader(System.in)); sascha@2569: } sascha@2569: catch (IOException ioe) { sascha@2569: ioe.printStackTrace(); sascha@2569: System.exit(1); sascha@2569: } sascha@2569: sascha@2569: LevenbergMarquardtOptimizer lmo = new LevenbergMarquardtOptimizer(); sascha@2569: sascha@2569: CurveFitter cf = new CurveFitter(lmo); sascha@2569: sascha@2569: for (Double [] point: points) { sascha@2569: cf.addObservedPoint(point[0], point[1]); sascha@2569: } sascha@2569: sascha@2569: double [] parameters = null; sascha@2569: sascha@2569: try { sascha@2569: parameters = cf.fit(function, function.getInitialGuess()); sascha@2569: } sascha@2569: catch (MathException me) { sascha@2569: me.printStackTrace(); sascha@2569: System.exit(1); sascha@2569: } sascha@2569: sascha@2569: String [] parameterNames = function.getParameterNames(); sascha@2569: sascha@2569: for (int i = 0; i < parameterNames.length; ++i) { sascha@2569: System.err.println(parameterNames[i] + ": " + parameters[i]); sascha@2569: } sascha@2569: } sascha@2569: } sascha@2569: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :