基于Javascript的拉格朗日插值多项式算法

vfh0ocws  于 2023-01-07  发布在  Java
关注(0)|答案(1)|浏览(188)

我从这个链接https://www.dcode.fr/lagrange-interpolating-polynomial实现了一个公式来计算坐标之间的某种得分。
结果值按预期使用如下坐标

const coordinates = [
  [0, 100], 
  [2.5, 70],
  [10, 30],
]

其中y轴为偶数,但y值为67,33无法按预期工作。

function getScore (thresholds, macro) {
  let value = 0
  
  for (let j = 0; j < thresholds.length; j++) {
    let temp = 1

    for (let i = 0; i < thresholds.length; i++) {
      if (i !== j) {      
        temp *= (macro - thresholds[i][0]) / (thresholds[j][0] - thresholds[i][0])
      }
    }

    value += thresholds[j][1] * temp
  }
  
  return value
}

console.log(
  'Expecting Something above 33 but get 31',
  getScore(    
    [
      [0, 100], 
      [2.5, 66],
      [10, 33],
    ],
    9
  )
)

console.log(
  'Expecting Something above 30 but and got 31',
  getScore(    
    [
      [0, 100], 
      [2.5, 70],
      [10, 30],
    ],
    9
  )
)

我的代码出错了吗?
谢谢你,

9lowa7mx

9lowa7mx1#

算法正在正常工作,尽管不是您所期望的那样。
该算法用多项式拟合这些点。如果您有3个点,它将是一条抛物线。由于它在前两个点上福尔斯得很快,该抛物线将在后两个点之间具有最小值,因此给出的值小于您给定的数字。
如果这不是你想要的插值方法,我建议你使用非多项式,例如,你可以使用加权平均,看起来像这样:

sum(point.y * f(x - point.x) for point in points)
    /
sum(f(x - point.x) for point in points)

f(x)成为一个函数,它有f(x) = f(-x),并且在0处爆破,当然,如果你在那个点,只要输入那个点的值,例如1/x^2,这将使你接近附近点的合理平均值。

相关问题