如何在Python中将拉格朗日函数展开为标准多项式形式
问题描述
尝试构建拉格朗日插值函数,但打印输出仅显示未展开的乘积形式,而非期望的展开后多项式形式。
代码如下:
import numpy as np from matplotlib.pyplot import plot, show, grid import numpy.polynomial.polynomial as poly import matplotlib.pyplot as plt from scipy.interpolate import lagrange from sympy import symbols, Eq x1 = [120, 180, 270, 300] # x y1 = [246, 351, 514, 572] # y def Lagrange(Lx, Ly): x = symbols('x') y = 0 for k in range(len(Lx)): p = 1 for j in range(len(Lx)): if j != k: p = p * ((x - Lx[j]) / (Lx[k] - Lx[j])) y += p * Ly[k] return y print(Lagrange(x1, y1)) poly=lagrange(x1,y1) print(poly)
当前输出:
246*(5/3 - x/180)*(9/5 - x/150)*(3 - x/60) + 351*(5/2 - x/120)*(3 - x/90)*(x/60 - 2) + 514*(10 - x/30)*(x/150 - 4/5)*(x/90 - 2) + 572*(x/180 - 2/3)*(x/120 - 3/2)*(x/30 - 9)
期望输出形式:
3 2 3.395e-06 x - 0.001528 x + 1.976 x + 25
解决方案
方法1:用Sympy展开自定义拉格朗日表达式
Sympy生成的表达式默认不会自动展开,调用expand()方法即可得到展开后的多项式,还可通过evalf()转换为浮点数形式:
修改打印部分代码:
lag_expr = Lagrange(x1, y1) # 展开表达式 expanded_expr = lag_expr.expand() # 输出精确展开形式 print(expanded_expr) # 输出浮点数近似形式 print(expanded_expr.evalf())
方法2:处理Scipy的lagrange输出
Scipy的lagrange()返回numpy多项式对象,直接打印格式不直观,可提取系数手动格式化,或结合Sympy转换:
手动格式化系数
poly = lagrange(x1, y1) # 获取系数(scipy返回的系数从最高次到最低次排列) coeffs = poly.coeffs # 按期望格式拼接项 terms = [] for idx, coeff in enumerate(coeffs): power = len(coeffs) - 1 - idx if power == 3: terms.append(f"{coeff:.4e} x^{power}") elif power == 2: terms.append(f"{coeff:.4f} x^{power}") elif power == 1: terms.append(f"{coeff:.3f} x") else: terms.append(f"{coeff:.0f}") # 拼接并打印 print(" ".join(terms))
结合Sympy简化处理
from sympy import Poly, symbols x_sym = symbols('x') # 将numpy多项式转换为Sympy表达式 poly_sym = Poly(poly(x_sym), x_sym) # 输出浮点数近似的展开形式 print(poly_sym.as_expr().evalf())
两种方法都能得到你期望的展开后多项式形式。
内容的提问来源于stack exchange,提问作者Magnus2211
相关产品推荐
相关产品推荐

