Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将正弦曲线拟合到Java中的数据?_Java_Least Squares_Trigonometry - Fatal编程技术网

如何将正弦曲线拟合到Java中的数据?

如何将正弦曲线拟合到Java中的数据?,java,least-squares,trigonometry,Java,Least Squares,Trigonometry,我花了几天时间试图在java中运行完全相同的代码: 基于以下答案,我开始整理以下代码: public double sine_fit(double[] current_sample){ double[] half_cycle = Arrays.copyOfRange(current_sample, 175, 225); double amp = 3*ArrayUtils.std(half_cycle)/Math.sqrt(2); double fr

我花了几天时间试图在java中运行完全相同的代码:

基于以下答案,我开始整理以下代码:

public double sine_fit(double[] current_sample){
        double[] half_cycle = Arrays.copyOfRange(current_sample, 175, 225);
        double amp = 3*ArrayUtils.std(half_cycle)/Math.sqrt(2);
        double freq = 0;
        double phase = 0;
        double[] guess = new double[]{amp, freq, phase};
        HarmonicCurveFitter curveFit = new HarmonicCurveFitter(new LevenbergMarquardtOptimizer());
        //curveFit.withStartPoint(guess);
        for (int i=0; i < half_cycle.length; i++) {
            curveFit.addObservedPoint(i, half_cycle[i]);
        }
        double[] vals = curveFit.fit();
        System.out.println(vals);
    }
公共双正弦拟合(双[]当前样本){
double[]half_cycle=Arrays.copyOfRange(当前_样本,175225);
双放大器=3*阵列标准(半周)/数学sqrt(2);
双频=0;
双相=0;
double[]guess=新的双[]{amp,freq,phase};
HarmonicCurveFitter CurveFitter=新的HarmonicCurveFitter(新的LevenbergMarquardTopimizer());
//具有起点的曲线系数(猜测);
对于(int i=0;i
它没有编译,也不是我想要的(即,第一个链接中的内容)

我非常感谢你的帮助。不能在Java中完成我在Python中只用几行就可以完成的事情让我发疯

附言:长期Python程序员,新手Java程序员

更新 根据@17slim的回答:

    double[] half_cycle = Arrays.copyOfRange(current_sample, 175, 225);
    double amp = 3*ArrayUtils.std(half_cycle)/Math.sqrt(2);
    double freq = 0;
    double phase = 0;
    double[] guess = new double[]{amp, freq, phase};
    HarmonicCurveFitter curveFit = HarmonicCurveFitter.create();
    curveFit.withStartPoint(guess);
    List<WeightedObservedPoint> points = new ArrayList<WeightedObservedPoint>();
    for (int i=0; i < half_cycle.length; i++) {
        points.add(new WeightedObservedPoint(1.0, i, half_cycle[i]));
    }
    double[] vals = curveFit.fit(points);
    for (double val: vals){
        System.out.println(val);
    }
double[]half_cycle=Arrays.copyOfRange(当前_样本,175225);
双放大器=3*阵列标准(半周)/数学sqrt(2);
双频=0;
双相=0;
double[]guess=新的双[]{amp,freq,phase};
HarmonicCurveFitter CurveFitter=HarmonicCurveFitter.create();
具有起点的曲线系数(猜测);
列表点=新的ArrayList();
对于(int i=0;i
HarmonicCurveFitter
不扩展
曲线过滤器
;它扩展了
AbstractCurveFilter
,它没有方法
addObservedPoint
GaussianFitter
HarmonicFitter
PolynomialFitter
是已知的
CurveFitter
的扩展器,具有所需的方法。使用
HarmonicFitter

见:和

编辑: 由于不推荐使用
HarmonicFitter
,因此使用
HarmonicCurveFitter
是正确的。由于它没有您需要的方法,请使用
fit(收集点)
而不是
addObservedPoint

相反,你应该:

HarmonicCurveFitter curveFit = new HarmonicCurveFitter.create();
List<WeightedObservedPoint> points = new ArrayList<WeightedObservedPoint>();
for (int i=0; i < half_cycle.length; i++) {
    points.add(new WeightedObservedPoint(1.0, i, half_cycle[i]));
}
double[] vals = curveFit.fit(points);
HarmonicCurveFitter curvefitt=新建HarmonicCurveFitter.create();
列表点=新的ArrayList();
对于(int i=0;i
从文件中:

默认实现使用Levenberg-Marquardt优化器

确保导入
org.apache.commons.math3.fitting.WeightedObservedPoint
org.apache.commons.math3.fittingHarmonicCurveFitter
java.util.List
java.util.ArrayList


另外,打印
vals
不像Python那样打印每个值,而是打印指向数组的指针。使用
for(double val:vals)
并分别显示每个值。

问题是您必须使用
HarmonicFitter
类和该类的方法-
添加观测点

HarmonicCurveFitter
或其父类
AbstractCurveFitter
都不包含方法
addObservedPoint

会出现什么错误?-无法解析org.apache.commons.math3.fitting.HarmonicCurveFitter类中的方法
addObservedPoint
-构造函数HarmonicCurveFitter无法应用于给定类型;必需:double[],int-find:org.apache.commons.math3.fitting.leastsquares.LevenbergMarquardtOptimizer-类org.apache.commons.math3.fitting.AbstractCurveFilter中的方法fit不能应用于给定类型;必需:找到java.util.Collection:没有参数HarmonicCurveFitter是什么?我似乎在任何地方都找不到这方面的参考
import org.apache.commons.math3.fitting.HarmonicCurveFitter
HarmonicFitter
似乎不受欢迎。我应该使用
HarmonicCurveFitter
加权观测点
。我试过了,但也没有走得太远。你是对的,但它将以完全相同的方式工作。我将尝试找到一个未预先确定的等价物。好的,从文档中:
从3.3开始。请改用HarmonicCurveFitter和WeightedObservedPoints。
因此,您可以正确使用
HarmonicCurveFitter
,但由于它没有所需的方法,您应该使用
fit(收集点)
来实现它!那就行了!!!我最后需要计算的是最小二乘法。我用
LevenbergMarquardtOptimizer()尝试的是
。以及如何获取正弦数组,而不仅仅是参数。