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

Python如何重构循环 正确使用SymPy构造牛顿多项式

牛顿前插多项式构造代码修复

问题根因

原代码存在三个核心错误:

  • 乘积项逻辑错误:每次循环都对全量反转后的x节点列表求积,既没有按阶数截取对应长度的前序节点,还因为反转操作导致乘积顺序完全颠倒,同时出现多余乘积项
  • 自动化简问题:Sympy默认会对代数表达式做最简合并,x - 0会被自动化简为x,没有做阻止化简的处理
  • 累加逻辑缺失:循环内每次都重新给polynom变量赋值,没有维护累加变量存储全部分项的和

修复方案

  1. 维护逐次递增的乘积项变量:初始值设为1,每轮循环乘上当前顺序对应的(x - x_i)因子,自然实现逐次新增括号项、顺序正确的效果
  2. 引入UnevaluatedExpr包裹0值,阻止Sympy自动化简(x - 0)为x
  3. 初始化最终多项式变量为0,每轮计算完当前分项后累加到最终变量上
  4. 每轮循环按阶数取对应位置的x节点,避免出现多余乘积项

修复后完整代码

from sympy import symbols, UnevaluatedExpr
from scipy.special import factorial

x = symbols('x')

string_one = [0.3091,-0.0304,-0.0271,0.0054,0.0025,-0.0016,0.0019,-0.0046,0.0099,-0.019]
x_col_list = [0.0, 0.3142, 0.6283, 0.9425, 1.2566, 1.5708, 1.885, 2.1991, 2.5133]
h = 1.25665

# 初始化最终多项式累加器、逐次递增的乘积项
final_polynom = 0
product_term = 1

# 如果需要匹配示例中最后一项仅乘到2.1991(共8个乘积因子),遍历对象改为string_one[:8]即可
for num, delta in enumerate(string_one, start=1):
    # 取当前阶数对应的x节点,处理0值阻止自动化简
    current_x = x_col_list[num-1]
    if current_x == 0:
        current_x = UnevaluatedExpr(0)
    # 逐次累乘乘积项,保证顺序正确、逐次新增因子
    product_term = product_term * (x - current_x)
    # 计算当前分项
    coeff = round(delta / (factorial(num) * h**num), 4)
    current_term = coeff * product_term
    # 累加到最终多项式
    final_polynom += current_term
    print(f"第{num}个分项:", current_term)

print("\n完整牛顿多项式:", final_polynom)

效果说明

  • 乘积项严格按照要求顺序排列:从(x - 0)开始,每轮新增一个后续节点的差项,不会出现顺序颠倒、多余项的问题
  • (x - 0)会保留完整形式,不会被化简为x
  • 所有分项自动累加,最终输出完整的符号形式多项式
  • x始终保持sympy符号变量属性,不会代入具体数值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:30:42