使用java中的曲线拟合计算出一个点

时间:2017-01-19 20:05:08

标签: java math apache-commons

以下代码生成的曲线应适合点

1, 1
150, 250
10000, 500
100000, 750
100000, 1000

我根据文档here构建了此代码,但是,我并不完全确定如何正确使用数据进行进一步计算,以及PolynomialCurveFitter.create(3)是否会影响这些未来计算中的答案。

例如,如果x值为y,我将如何使用输出的数据来计算200值是什么?如果我{{1},该值将如何不同?而不是PolynomialCurveFitter.create(2)

PolynomialCurveFitter.create(3)

1 个答案:

答案 0 :(得分:2)

关于为您的功能更改d的后果

PolynomialCurveFitter.create将多项式的次数作为参数。

非常(非常)粗略地说,多项式程度将描述"复杂性"你想要适合的曲线。低水平度将产生简单的曲线(d = 2时仅为抛物线),而较高度将产生更复杂的曲线,具有大量峰和谷,具有高度变化的尺寸,因此更能够完美地适应" #34;你所有的数据点,代价不一定是好的预测"所有其他价值观。

与此图中的蓝色曲线类似:

enter image description here

您可以看到直线如何更好"近似",而不能正确拟合数据点。

如何计算计算函数中任何y值的x

你"简单地"需要解决多项式!使用相同的库。将反转的y值添加到您的系数列表中,并找到它的根。

让我们说你选择了2的学位。

你的系数数组coeffs将包含3个因子{a0, a1, a2},它们描述了这样的等式:

a0 + a1 * x + a2 * x²

如果要为特定值解决此问题,例如y = 600,则需要解决:

a0 + a1 * x + a2 * x² = 600

所以,基本上,

a0 - 600 + a1 * x + a2 * x² = 0

所以,只需将600减去a0:

coeffs[0] -= 600

使用专用函数找到多项式的根:

PolynomialFunction polynomial = new PolynomialFunction(coeffs);
LaguerreSolver laguerreSolver = new LaguerreSolver();
double x = laguerreSolver.solve(100, polynomial, 0, 1000000);
System.out.println("For y = 600, we found x = " + x);