0

以下是 X 和 Y 值:

X    Y
20   10
100  25
140  50

如果我可以将这些数据近似表示为一个公式并插入从 20 到 140 的任意 X 值,那就太好了。数据似乎有点像曲棍球棒曲线。或者它是指数级的?我可以对此进行编码以仅在这三个点之间创建线性段,但是如果公式可以给我更多平滑的结果会更好。上面的数字并不是一成不变的。它们可能会有所不同。只要公式让我在球场上。

4

5 回答 5

1

三个点唯一地定义了一个二阶多项式曲线,形式为

y = 轴2 + Bx + C

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

于 2013-01-25T14:07:54.297 回答
1

您可以使用多项式或指数方程来近似这种形状,您选择哪种形状取决于您到底想要做什么。

如果您只需要接近某种形状的平滑曲线,则选择一个公式并调整系数,直到它看起来像您想要的那样。

Excel 数据的多项式拟合给出:

Y = 0.0036*(X^2) - 0.25*X + 13.542
于 2013-01-25T14:12:16.227 回答
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;
}
于 2013-01-25T14:09:01.247 回答
0

您可以使用某种形式的回归分析将曲线与一组点进行统计拟合。但是,曲线的有效性取决于您拥有的点数;三点并不能使您对您的公式正确有很大的信心。

于 2013-01-25T14:10:08.940 回答
-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

即使您有大量数据,这也将起作用。

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

于 2013-01-25T14:46:30.270 回答