找回密码
 立即注册
首页 业界区 业界 拉格朗日插值算法原理及简单示例

拉格朗日插值算法原理及简单示例

盗衍 昨天 21:10
拉格朗日插值法,是一种通过巧妙地构造一组基函数并将它们线性组合起来,得到一个曲线精准通过所有离散点的表达式的方法,通常用来预测中间未知点的值。
一、算法原理

给定一组点\((x_1,y_1),(x_2,y_2),...,(x_n,y_n)\),构造一个次数不超过 n 的多项式\(L(x)\),满足 \(L(x_i)=y_i, i=1,2,...,n\),函数曲线严格穿过了所有已知点。
表达式的构造采用这样一种巧妙的形式,基于已知点自变量构造分式,使其在已知点处恒为1,其他恒为0,即

\[L(x)=\sum_{i=0}^{n}{\left( y_i\cdot\prod_{j=0 \\ j\ne i}^{n} \frac{x-x_j}{x_i-x_j}\right)} \]
其中\(\prod_{j=0 \\ j\ne i}^{n} \frac{x-x_j}{x_i-x_j}\)称为拉格朗日基函数,它在\(x_i\)的值为1,其他为0。
这样,函数刚好在\(x_i\)处取得值\(y_i\)。
二、示例

现基于三个点(1,2)、(2,3)、(3,5),构造拉格朗日插值函数,并计算在 x=2.5 处的函数值。
根据已知点,由拉格朗日插值算法构造函数为

\[\begin{aligned} L(x) &=y_0\cdot\frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}+y_1\cdot\frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)}+y_2\cdot\frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)} \\ &=2\cdot\frac{(x-2)(x-3)}{(1-2)(1-3)}+3\cdot\frac{(x-1)(x-3)}{(2-1)(2-3)}+5\cdot \frac{(x-1)(x-2)}{(3-1)(3-2)} \end{aligned} \]
当x=2.5时,计算得y=3.875。
三、Python实现

  1. '''
  2. 拉格朗日插值算法示例:基于三个点(1,2)、(2,3)、(3,5),构造拉格朗日插值函数,并计算在 x=2.5 处的函数值。
  3. '''
  4. def lagrange_interpolation(x_points, y_points, x):
  5.     """
  6.     拉格朗日插值法(三点版)
  7.     :param x_points: 已知点的x坐标列表,长度为3
  8.     :param y_points: 已知点的y坐标列表,长度为3
  9.     :param x: 需要插值的x值
  10.     :return: 插值得到的y值
  11.     """
  12.     # 解包三个已知点的x坐标
  13.     x0, x1, x2 = x_points
  14.     # 解包三个已知点的y坐标
  15.     y0, y1, y2 = y_points
  16.     # 计算三个拉格朗日基函数
  17.     l0 = ((x - x1) * (x - x2)) / ((x0 - x1) * (x0 - x2))
  18.     l1 = ((x - x0) * (x - x2)) / ((x1 - x0) * (x1 - x2))
  19.     l2 = ((x - x0) * (x - x1)) / ((x2 - x0) * (x2 - x1))
  20.     # 计算插值结果
  21.     y = y0 * l0 + y1 * l1 + y2 * l2
  22.     return y
  23. # 示例:三个已知点 (1,2)、(2,3)、(3,5)
  24. x_points = [1, 2, 3]
  25. y_points = [2, 3, 5]
  26. # 计算x=2.5处的插值结果
  27. interpolated_x = 2.5
  28. interpolated_y = lagrange_interpolation(x_points, y_points, interpolated_x)
  29. # 输出结果
  30. print(f"已知点:x={x_points}, y={y_points}")
  31. print(f"插值点 x={interpolated_x} 对应的y值为:{interpolated_y:.4f}")
  32. # 验证:计算已知点的插值结果(应该等于原y值)
  33. print("\n验证已知点插值结果:")
  34. for x in x_points:
  35.     y = lagrange_interpolation(x_points, y_points, x)
  36. print(f"x={x} 插值结果:y={y:.4f} (原y值:{y_points[x_points.index(x)]})")
复制代码
1.jpeg



End.

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册