You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:52:29