数据公式看起来像曲棍球棒

时间:2013-01-25 14:02:52

标签: java math

以下是X和Y值:

X    Y
20   10
100  25
140  50

如果我可以将这些数据大致表示为公式并插入从20到140的任意X值,那将是很好的。数据似乎有点像曲棍球棒曲线。还是更具指数性?我可以编码这个只是在这三个点之间创建线性段,但如果一个公式可以给我更多的平滑结果会更好。上面的数字不是固定的。它们可以变化一点。只要公式让我进入了球场。

5 个答案:

答案 0 :(得分:1)

三个点唯一地定义形式为

的二阶多项式曲线

y = Ax 2 + Bx + C

众所周知的公式可以从点坐标推导出A,B,C。

答案 1 :(得分:1)

你可以使用多项式或指数的方程近似那种形状,你选择的那种取决于你究竟想要做什么。

如果你只需要一条接近某种形状的平滑曲线,那么选择一个公式并调整系数,直到它看起来如你所愿。

Excel中数据的多项式拟合得出:

Y = 0.0036*(X^2) - 0.25*X + 13.542

答案 2 :(得分:0)

实现此目的的一种方法是实现一些类似于Excel提供的GROWTH功能。假设指数增长,它将从您给出的new_y值中插入new_x值。这是JavaScript中的一段代码。将它翻译成Java应该非常简单。

请注意,我从其他人那里借了大部分资金(代码中的信用额)。

function GROWTH(known_y, known_x, new_x, use_const) {
  // Credits: Ilmari Karonen

  // Default values for optional parameters:
  if (typeof(known_x) == 'undefined') {
    known_x = [];
    for (var i = 1; i <= known_y.length; i++) known_x.push(i);
  }
  if (typeof(new_x) == 'undefined') {
    new_x = [];
    for (var i = 1; i <= known_y.length; i++) new_x.push(i);
  }
  if (typeof(use_const) == 'undefined') use_const = true;

  // Calculate sums over the data:
  var n = known_y.length;
  var avg_x = 0;
  var avg_y = 0;
  var avg_xy = 0;
  var avg_xx = 0; 
  for (var i = 0; i < n; i++) {
    var x = known_x[i];
    var y = Math.log(known_y[i]);
    avg_x += x;
    avg_y += y;
    avg_xy += x*y;
    avg_xx += x*x;
  }
  avg_x /= n;
  avg_y /= n;
  avg_xy /= n;
  avg_xx /= n;

  // Compute linear regression coefficients:
  if (use_const) {
    var beta = (avg_xy - avg_x*avg_y) / (avg_xx - avg_x*avg_x);
    var alpha = avg_y - beta*avg_x;
  } else {
    var beta = avg_xy / avg_xx;
    var alpha = 0;
  }

  // Compute and return result array:
  var new_y = [];
  for (var i = 0; i < new_x.length; i++) {
    new_y.push(Math.exp(alpha + beta * new_x[i]));
  }
  return new_y;
}

答案 3 :(得分:0)

您可以使用某种形式的regression analyzis统计地将曲线拟合到一组点。但是,曲线的有效性取决于您拥有的点数;三点不能让你对你的公式是正确的充满信心。

答案 4 :(得分:-1)

你可以从这样的关系开始:

y = A*exp(B*x)

采取双方的自然记录:

ln(y) = ln(A) + B*x

根据需要替换多个点并求解两个系数。这是一个简单的线性回归问题。

以下是我的数据:

y = exp(2.006369+0.013132*x)

以下是生成值的表格:

X   Y
0   7.436267437
20  9.669855877
40  12.5743343
60  16.35121402
80  21.26253316
100 27.6490367
120 35.95381719
140 46.75305634
160 60.7960002
180 79.0569415
200 102.8028156
220 133.6811
240 173.8341152
260 226.0476583

即使您有大量数据,也可以使用。

如果你对指数函数进行泰勒级数展开,你会发现它是一系列无数多项式项。二次和三次提议是截断到指数的近似值。