我需要使用 Lagrange interpolation polynomial 计算多项式的系数,作为我的家庭作业,我决定在 Javascript 中执行此操作。
这是拉格朗日多项式 (L(x)) 的定义
拉格朗日基多项式定义如下
计算特定 X 的 y 值(W(x) 函数)很简单,但我需要计算多项式的系数([a0, a1, …, an] 的数组)我需要对 n<=10 执行此操作,但它拥有任意 n 会很好,然后我可以将该函数放入 horner 函数并绘制该多项式。
我有计算第一个方程式中分母的函数
function denominator(i, points) {
var result = 1;
var x_i = points[i].x;
for (var j=points.length; j--;) {
if (i != j) {
result *= x_i - points[j].x;
}
}
return result;
}
和使用 horner 方法返回 y 的函数(我也有使用画布的绘图函数)
function horner(array, x_scale, y_scale) {
function recur(x, i, array) {
if (i == 0) {
return x*array[0];
} else {
return array[i] + x*recur(x, --i, array);
}
}
return function(x) {
return recur(x*x_scale, array.length-1, array)*y_scale;
};
}
任何人都知道这样做的算法,或者知道如何计算这些系数
原文由 jcubic 发布,翻译遵循 CC BY-SA 4.0 许可协议
好吧,你可以用天真的方法来做。用系数数组表示多项式,数组
对应于
a_0 + a_1*X + ... + a_n*X^n
。我不擅长 JavaScript,所以伪代码必须这样做:从常数多项式
1/((x_1-x_0)* ... *(x_i-x_{i-1})*(x_i-x_{i+1})*...*(x_i-x_n))
开始,乘以X - x_k
对所有k != i
。这样就给出了 L i的系数,然后你只需将它们与 y i相乘(你可以通过将coefficients
初始化为y_i/denominator(i,points)
如果你将 y 值作为参数传递)和最后将所有系数加在一起。计算每个L i是O(n²),所以总计算是O(n³)。
更新: 在你的 jsFiddle 中,你在多项式乘法循环中有一个错误,除了(现在更正的)我做的起始索引错误,它应该是
由于您在测试时递减
j
,因此需要从更高的开始。这还没有产生正确的插值,但它至少比以前更明智。
另外,在你的
horner
函数中,您将最高系数乘以
x
两次,它应该是反而。不过还是没有好结果。
Update2: 最终错字修复,以下工作: