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

如何使用sympy.Poly获取scipy.interpolate.CubicSpline的多项式表达式?

解决方法

直接把CubicSpline对象传给Poly肯定行不通,因为CubicSpline是分段三次多项式,每个插值区间对应独立的多项式,得先提取每个分段的系数,再逐个转换为SymPy多项式。

具体步骤与代码

  1. 先明确CubicSpline的系数结构:它的coeffs属性存储了每个分段的4个系数,对应表达式 a*(x - x_i)^3 + b*(x - x_i)^2 + c*(x - x_i) + d,其中x_i是每个分段的左端点。
  2. 遍历每个分段,将上述表达式展开为标准多项式形式,再转换为Poly对象。

完整代码示例:

import numpy as np
from scipy.interpolate import CubicSpline
from sympy import Symbol, Poly, expand

# 1. 创建插值点与三次样条对象
xpts = np.linspace(0, 1, 5)  # 用5个点生成4个分段,方便演示
ypts = np.exp(xpts)
cs = CubicSpline(xpts, ypts)

# 2. 定义SymPy符号
x = Symbol('x')

# 3. 遍历每个分段,生成对应的Poly对象
segment_polys = []
for i in range(len(cs.x) - 1):
    # 获取当前分段的左右端点
    x_left = cs.x[i]
    x_right = cs.x[i+1]
    # 获取当前分段的系数:a, b, c, d
    a, b, c, d = cs.coeffs[i]
    # 构造分段多项式表达式并展开
    expr = a*(x - x_left)**3 + b*(x - x_left)**2 + c*(x - x_left) + d
    expanded_expr = expand(expr)
    # 转换为Poly对象
    poly = Poly(expanded_expr, x)
    # 存储分段区间与对应的Poly
    segment_polys.append({
        "interval": (x_left, x_right),
        "poly": poly
    })

# 示例:打印第一个分段的多项式
print("第一个分段区间:", segment_polys[0]["interval"])
print("对应的Poly对象:", segment_polys[0]["poly"])
print("多项式表达式:", segment_polys[0]["poly"].as_expr())

关键说明

  • 如果需要查看所有分段的多项式,可以遍历segment_polys列表输出。
  • expand()函数是为了将多项式展开为标准的ax³ + bx² + cx + d形式,确保Poly能正确识别各项系数。
  • 原代码中np.linspace(0,1)默认生成50个点,对应49个分段,处理起来会比较多,示例中改成5个点方便测试。

内容的提问来源于stack exchange,提问作者user20319483

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:55:21