You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Phil Steitz (JIRA)" <ji...@apache.org> on 2010/04/14 02:07:51 UTC

[jira] Closed: (MATH-304) CurveFitter.fit(ParametricRealFunction, double[]) always returns the same value as the initial guess when used with the LevenbergMarquardtOptimizer

     [ https://issues.apache.org/jira/browse/MATH-304?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Phil Steitz closed MATH-304.
----------------------------


> CurveFitter.fit(ParametricRealFunction, double[]) always returns the same value as the initial guess when used with the LevenbergMarquardtOptimizer
> ---------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: MATH-304
>                 URL: https://issues.apache.org/jira/browse/MATH-304
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 2.0
>         Environment: Java, Ubuntu 9.04 (64 bit)
>            Reporter: Daren Drummond
>             Fix For: 2.1
>
>
> CurveFitter.fit(ParametricRealFunction, double[]) always returns the same value as the initial guess when used with the LevenbergMarquardtOptimizer and the length of the initial guess array is 1.  Here is my example code:
> {code:title=CurveFitter with LevenbergMarquardtOptimizer|borderStyle=solid}
>   LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();
>   CurveFitter fitter = new CurveFitter(optimizer);
>   fitter.addObservedPoint(2.805d, 0.6934785852953367d);
>   fitter.addObservedPoint(2.74333333333333d, 0.6306772025518496d);
>   fitter.addObservedPoint(1.655d, 0.9474675497289684);
>   fitter.addObservedPoint(1.725d, 0.9013594835804194d);
>   SimpleInverseFunction sif = new SimpleInverseFunction(); // Class provided below
>   double[] initialguess = new double[1];
>   initialguess[0] = 1.0d;
>   double[] bestCoefficients = fitter.fit(sif, initialguess); // <---- ALWAYS RETURNS A VALUE OF initialguess !
>     /**
>      * This is my implementation of ParametricRealFunction
>      * Implements y = ax^-1 + b for use with an Apache CurveFitter implementation
>       */
>     private class SimpleInverseFunction implements ParametricRealFunction
>     {
>         public double value(double x, double[] doubles) throws FunctionEvaluationException
>         {
>             //y = ax^-1 + b
>             //"double[] must include at least 1 but not more than 2 coefficients."
>             if(doubles == null || doubles.length ==0 || doubles.length > 2) throw new FunctionEvaluationException(doubles);
>             double a = doubles[0];
>             double b = 0;
>             if(doubles.length >= 2) b = doubles[1];
>             return a * Math.pow(x, -1d) + b;
>         }
>         public double[] gradient(double x, double[] doubles) throws FunctionEvaluationException
>         {
>             //derivative: -ax^-2
>             //"double[] must include at least 1 but not more than 2 coefficients."
>             if(doubles == null || doubles.length ==0 || doubles.length > 2) throw new FunctionEvaluationException(doubles);
>             double a = doubles[0];
>             double b = 0;
>             if(doubles.length >= 2) b = doubles[1];
>             double derivative = -a * Math.pow(x, -2d);
>             double[]gradientVector = new double[1];
>             gradientVector[0] = derivative;
>             return gradientVector; 
>         }
>     }
> {code} 

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira