如何针对多变量函数实现拉格朗日插值多项式?
多变量拉格朗日插值的实现方法
单变量拉格朗日插值回顾
在单变量函数插值场景下,拉格朗日插值的实现逻辑相对简单:
def create_basic_polynomial(x_values, i): def basic_polynomial(x): divider = 1 result = 1 for j in range(len(x_values)): if j != i: result *= (x-x_values[j]) divider *= (x_values[i]-x_values[j]) return result/divider return basic_polynomial def create_lagrange_polynomial(x_values, y_values): basic_polynomials = [] for i in range(len(x_values)): basic_polynomials.append(create_basic_polynomial(x_values, i)) def lagrange_polynomial(x): result = 0 for i in range(len(y_values)): result += y_values[i]*basic_polynomials[i](x) return result return lagrange_polynomial x_values = [0, 2, 3, 5] y_values = [0, 1, 3, 2] lag_pol = create_lagrange_polynomial(x_values, y_values) for x in x_values: print("x = {:.4f}\t y = {:4f}".format(x,lag_pol(x)))
运行上述代码,输出结果如下:
x = 0.0000 y = 0.000000 x = 2.0000 y = 1.000000 x = 3.0000 y = 3.000000 x = 5.0000 y = 2.000000
那么,我们该如何实现适用于多变量函数的拉格朗日插值逻辑呢?
多变量拉格朗日插值的核心思路
多变量拉格朗日插值的核心是将单变量的基多项式扩展为各维度基多项式的乘积。假设我们有n个变量,每个样本点是一个n维向量$\mathbf{x}i=(x{i1},x_{i2},...,x_{in})$,对应的函数值为$y_i$。第i个样本点对应的基多项式$L_i(\mathbf{x})$是每个维度上单变量基多项式的乘积:
$$L_i(\mathbf{x}) = \prod_{k=1}^n \left( \prod_{\substack{j=1 \ j \neq i}}^m \frac{x_k - x_{jk}}{x_{ik} - x_{jk}} \right)$$
其中m是样本点的总数,$x_{jk}$表示第j个样本点的第k个维度的值。最终的插值函数为所有样本点函数值与对应基函数的加权和:
$$P(\mathbf{x}) = \sum_{i=1}^m y_i L_i(\mathbf{x})$$
多变量拉格朗日插值的Python实现
def create_multivariate_basis(x_samples, i): """ 创建多变量拉格朗日基函数 :param x_samples: 样本点列表,每个元素是一个多维向量(如列表或元组) :param i: 对应第i个样本点的基函数 :return: 多变量基函数 """ dim = len(x_samples[0]) # 获取变量维度 sample_count = len(x_samples) # 样本点数量 def basis(x): result = 1.0 # 遍历每个维度计算单变量基多项式并相乘 for k in range(dim): numerator = 1.0 denominator = 1.0 for j in range(sample_count): if j != i: numerator *= (x[k] - x_samples[j][k]) denominator *= (x_samples[i][k] - x_samples[j][k]) result *= numerator / denominator return result return basis def create_multivariate_lagrange(x_samples, y_values): """ 创建多变量拉格朗日插值函数 :param x_samples: 样本点列表,每个元素是多维向量 :param y_values: 对应样本点的函数值列表 :return: 多变量插值函数 """ # 生成所有样本点对应的基函数 basis_functions = [create_multivariate_basis(x_samples, i) for i in range(len(x_samples))] def lagrange(x): result = 0.0 # 加权求和得到插值结果 for i in range(len(y_values)): result += y_values[i] * basis_functions[i](x) return result return lagrange # 测试示例:2变量插值,4个样本点 x_samples = [(0, 0), (0, 1), (1, 0), (1, 1)] y_values = [0, 1, 1, 2] # 创建多变量插值函数 lag_multivar = create_multivariate_lagrange(x_samples, y_values) # 验证样本点的插值结果 for x, y_true in zip(x_samples, y_values): print(f"x = {x}\t 插值结果 = {lag_multivar(x):.4f}\t 真实值 = {y_true}")
运行上述测试代码,输出结果如下:
x = (0, 0) 插值结果 = 0.0000 真实值 = 0 x = (0, 1) 插值结果 = 1.0000 真实值 = 1 x = (1, 0) 插值结果 = 1.0000 真实值 = 1 x = (1, 1) 插值结果 = 2.0000 真实值 = 2
代码说明
create_multivariate_basis:针对每个样本点生成对应的多变量基函数,遍历每个维度计算该维度的单变量基多项式,再将所有维度的结果相乘。create_multivariate_lagrange:整合所有基函数,生成最终的插值函数,计算逻辑与单变量一致,是各样本点函数值与对应基函数的加权和。- 测试用例采用2变量的简单样本,验证了插值函数在样本点上的结果与真实值完全一致,符合拉格朗日插值的基本特性。
内容的提问来源于stack exchange,提问作者Artyom Ionash
相关产品推荐
相关产品推荐

