以下是 X 和 Y 值:
X Y
20 10
100 25
140 50
如果我可以将这些数据近似表示为一个公式并插入从 20 到 140 的任意 X 值,那就太好了。数据似乎有点像曲棍球棒曲线。或者它是指数级的?我可以对此进行编码以仅在这三个点之间创建线性段,但是如果公式可以给我更多平滑的结果会更好。上面的数字并不是一成不变的。它们可能会有所不同。只要公式让我在球场上。
三个点唯一地定义了一个二阶多项式曲线,形式为
y = 轴2 + Bx + C
有众所周知的公式可以从点坐标推导出 A、B、C。
您可以使用多项式或指数方程来近似这种形状,您选择哪种形状取决于您到底想要做什么。
如果您只需要接近某种形状的平滑曲线,则选择一个公式并调整系数,直到它看起来像您想要的那样。
Excel 数据的多项式拟合给出:
Y = 0.0036*(X^2) - 0.25*X + 13.542
一种方法是实现一些类似于 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;
}
您可以使用某种形式的回归分析将曲线与一组点进行统计拟合。但是,曲线的有效性取决于您拥有的点数;三点并不能使您对您的公式正确有很大的信心。
您可以从假设这样的关系开始:
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
即使您有大量数据,这也将起作用。
如果你对指数函数进行泰勒级数展开,你会发现它是多项式项的无限级数。二次和三次建议是指数的截断近似。