Python分段线性插值绘图求助:基于Lagrange插值多项式
无需手动输入方程的分段Lagrange插值绘图方案
嘿,我懂你不想手动复制每个插值方程的麻烦——其实我们可以用SymPy的lambdify工具,把生成的符号表达式直接转换成NumPy能计算的函数,自动完成分段绘图!下面是修改后的完整代码,我会一步步解释怎么回事:
import numpy as np import matplotlib.pyplot as plt import sympy as sym # 重命名符号变量,避免和numpy数组混淆 x_sym = sym.Symbol('x') year = np.arange(1960,2020,10) pop = [179323,203302,226542,249633,281422,308746] def lgn(a,b): result = [] for i in range(1,len(a)): L0 = (x_sym - a[i])/(a[i-1] - a[i]) L1 = (x_sym - a[i-1])/(a[i] - a[i-1]) temp = (L0 * b[i-1]) + (L1 * b[i]) result.append(temp) return result # 获取所有分段的符号插值方程 interp_exprs = lgn(year, pop) # 先画出原始数据点 plt.plot(year, pop, 'ro', label='原始人口数据') # 遍历每个分段方程和对应的年份区间 for expr, x_start, x_end in zip(interp_exprs, year[:-1], year[1:]): # 把SymPy符号表达式转成NumPy可调用的函数 interpolator = sym.lambdify(x_sym, expr, 'numpy') # 生成区间内的x值(用100个点让曲线更平滑) x_vals = np.linspace(x_start, x_end, 100) # 自动计算y值 y_vals = interpolator(x_vals) # 绘制该分段的插值曲线 plt.plot(x_vals, y_vals, 'b-') # 添加图表细节 plt.xlabel('年份') plt.ylabel('人口') plt.title('分段线性Lagrange插值人口变化') plt.legend() plt.show()
关键步骤解释:
- 符号变量重命名:把原来的
x改成x_sym,防止和后续NumPy的数组变量冲突,避免不必要的bug。 - 利用
lambdify转换函数:这是核心操作——它能把SymPy生成的符号方程(比如23979*x/10 - 4520561)直接转换成可以处理NumPy数组的函数,彻底省去手动输入方程的步骤。 - 自动遍历分段:用
zip把每个插值方程和对应的起始/结束年份配对,循环处理每个区间,不管你有多少个分段,代码都能自动适配。 - 平滑曲线:把
linspace的点数从10改成100,插值曲线会更顺滑,视觉效果更好。
这样修改后,哪怕你后续调整年份范围或者人口数据,代码都能自动重新生成插值曲线,完全不用手动修改绘图部分的代码!
内容的提问来源于stack exchange,提问作者Harsh Dhiman
相关产品推荐
相关产品推荐

