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

Python实现Newton插值多项式报reduce() arg 2 must support iteration错误

构造Newton插值多项式时报TypeError: reduce() arg 2 must support iteration的解决方法

报错核心原因

  • 触发该类型错误的直接原因是prod()函数要求传入可迭代对象(列表、元组、生成器等序列类型),原代码在内层循环中每次仅取单个args值,传入prod()的参数是单个符号表达式x - args,并非可迭代序列,导致底层调用reduce()时参数不符合要求。
  • 原代码还存在3个附加问题,即使修复prod的报错也无法正常运行:
    • 变量h(等距节点步长)未定义,会触发NameError
    • 双层循环逻辑错误:num在内层循环中累加,计数与差分项、乘积项的阶数完全不匹配,且polynom变量每次循环被覆盖,无法累加得到完整多项式
    • 混用scipy的数值型factorial与sympy符号变量,易出现类型兼容问题

修正方案

  1. 提前定义等距节点步长h,根据给出的x节点值,h≈0.3142
  2. 替换scipy的factorial为sympy自带的符号阶乘函数,保证符号计算兼容性
  3. 调整循环逻辑:每遍历一个差分项delta,对应取前num个x节点构造乘积项,不需要双层嵌套循环
  4. 初始化多项式为0,每次计算得到的插值项累加进多项式,不覆盖原有值
  5. 注意两个输入列表长度不匹配(差分项10个,x节点9个),循环时按最短长度截断避免索引越界

修正后可运行代码

from sympy import symbols, prod, 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 = 0.3142  # 等距节点步长,根据x_col_list相邻项差值定义

polynom = 0
# 按最短列表长度循环,避免索引越界
for num in range(min(len(string_one), len(x_col_list)+1)):
    delta = string_one[num]
    # 取前num个x节点构造乘积项,传入prod的是可迭代的生成器
    if num == 0:
        # 0阶项乘积为1
        product_term = 1
    else:
        product_term = prod(x - xi for xi in x_col_list[:num])
    # 计算当前项系数,保留4位小数
    coeff = round(delta / (factorial(num) * h**num), 4)
    polynom += coeff * product_term

# 输出展开后的多项式
print(polynom.expand())

运行后即可输出符号形式的Newton插值多项式。

内容的提问来源于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 19:42:22