在Java中查找二次回归曲线的最佳方法

我有三组数据,例如:

xy 4 0 6 60 8 0 

有没有人知道任何(有效的)Java代码可以回馈a,b和c(系数)的值?

我假设你想要这种forms的公式:

 y = a * x^2 + b*x + c 

如果您只有三个点,则可以使用公式描述通过所有三个点的二次曲线:

 y = ((x-x2) * (x-x3)) / ((x1-x2) * (x1-x3)) * y1 + ((x-x1) * (x-x3)) / ((x2-x1) * (x2-x3)) * y2 + ((x-x1) * (x-x2)) / ((x3-x1) * (x3-x2)) * y3 

在你的例子中:

 x1 = 4, y1 = 0, x2 = 6, y2 = 60, x3 = 8, y3 = 0 

要根据x1,x2,x3,y1,y2和y3得到系数a,b,c,您只需要将公式相乘,然后收集项。 这并不困难,它会运行得非常快,但输入的代码会相当多。最好找一个已经为你做的包,但是如果你想自己做,这个你是怎么做到的。

在您的示例中,y个项中的两个为零的事实使得公式更简单,并且您可能能够利用它。 但如果那只是巧合而不是一般规则,那么你需要完整的公式。

LaGrange插值可能是您将要找到的最“有效”(如何衡量?)解决方案。 所以我建议一个完全通用的代码。 你确实想要代码,对吗? 对于任意数量的点, 此代码可以是线性的,二次的,立方的….

我实际上并没有尝试编译它,所以如果源代码是最新的,我不会。 你知道在线演示是如何进行的。 然而,来自相关网页的小程序function齐全。 jar文件将独立运行。 使用可resize的窗口,您实际上不需要自定义它。

它取决于您正在寻找的内容:您是在寻找由这三个点定义的唯一多项式,还是在寻找能够生成通过所有点的多项式的库?

如果你正在研究第一个,最好的技术是构造系数矩阵(即,三个线性方程的集合,它唯一地约束这个二次方程)并应用高斯消元法来得到你的结果。 这可以通过最有效的手工完成,但您也可以使用Apache Commons Math Library的Real Matrix solve方法。 ( 编辑感谢您的纠正 – 我有时候会说话;)

如果你正在研究第二个问题,这是一个通用类问题的特殊情况,称为多项式插值 ,有几种解决方法 – Splines是我个人的最爱,但都有自己的优点和缺点。 幸运的是, Apache Commons Math实现了几种这样的方法。 我会看一下SplineInterpolator类。 样条曲线使用立方体而不是正方形,但它们往往是非常好的近似值。 如果一个点是另一个点的线性倍数,它们也不会失败。

仅仅三点,两种方法在性能特征上应该大致相同。 但是,如果你做了三个以上的点,我强烈建议使用插值,因为使用Guassian Elimination难以置信地缩放(O(n ^ 3)),而Splines(或另一种插值技术)不太可能失败。