I am trying to set up a harmonic fitter to determine periodicity of a data
set. My code:
import org.apache.commons.math3.optimization.fitting.HarmonicFitter;
import org.apache.commons.math3.optimization.fitting.WeightedObservedPoint;
import
org.apache.commons.math3.optimization.general.LevenbergMarquardtOptimizer;


public class FFT {
        public static void main(String[] args){
                double[] real =
{0,1,2,3,2,1,0,-1,-2,-3,-2,-1,0,1,2,3,2,1,0,-1,-2,-3,-2,-1,0,1,2,3,2,1,0};
                WeightedObservedPoint[] points = new WeightedObservedPoint
[real.length];
                HarmonicFitter fitter = new HarmonicFitter(new
LevenbergMarquardtOptimizer());
                for(int i = 0; i < real.length; i++){
                        points[i] = new WeightedObservedPoint(1,i,real[i]);
                        fitter.addObservedPoint(new WeightedObservedPoint
(1,i,real[i]));
                }
                HarmonicFitter.ParameterGuesser guesser = new
HarmonicFitter.ParameterGuesser(points);
                double[] guess = fitter.fit(guesser.guess());
                for(double x:guess){
                        System.out.println(x);
                }
        }
}

and the error:
Exception in thread "main"
org.apache.commons.math3.exception.ConvergenceException: illegal state:
unable to perform Q.R decomposition on the 31x3 jacobian matrix
        at
org.apache.commons.math3.optimization.general.LevenbergMarquardtOptimizer.qrDecomposition
(
LevenbergMarquardtOptimizer.java:848)
        at
org.apache.commons.math3.optimization.general.LevenbergMarquardtOptimizer.doOptimize
(
LevenbergMarquardtOptimizer.java:312)
        at
org.apache.commons.math3.optimization.direct.BaseAbstractMultivariateVectorOptimizer.optimize
(
BaseAbstractMultivariateVectorOptimizer.java:134)
        at
org.apache.commons.math3.optimization.general.AbstractLeastSquaresOptimizer.optimize
(
AbstractLeastSquaresOptimizer.java:273)
        at
org.apache.commons.math3.optimization.general.AbstractLeastSquaresOptimizer.optimize
(
AbstractLeastSquaresOptimizer.java:51)
        at org.apache.commons.math3.optimization.fitting.CurveFitter.fit(
CurveFitter.java:157)
        at org.apache.commons.math3.optimization.fitting.CurveFitter.fit(
CurveFitter.java:124)
        at org.apache.commons.math3.optimization.fitting.HarmonicFitter.fit(
HarmonicFitter.java:61)
        at FFT.main(FFT.java:16)
Can anyone help me? Should I be using a different
optimizer/fitter/something out of a separate library? The double[] real is
just a test set, actual data will be much more noisy as it comes from
real-world sensors
Thanks
-Garrett

Reply via email to