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符号变量,易出现类型兼容问题
- 变量
修正方案
- 提前定义等距节点步长
h,根据给出的x节点值,h≈0.3142 - 替换scipy的
factorial为sympy自带的符号阶乘函数,保证符号计算兼容性 - 调整循环逻辑:每遍历一个差分项
delta,对应取前num个x节点构造乘积项,不需要双层嵌套循环 - 初始化多项式为0,每次计算得到的插值项累加进多项式,不覆盖原有值
- 注意两个输入列表长度不匹配(差分项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
相关产品推荐
相关产品推荐

