Python如何重构循环 正确使用SymPy构造牛顿多项式
牛顿前插多项式构造代码修复
问题根因
原代码存在三个核心错误:
- 乘积项逻辑错误:每次循环都对全量反转后的x节点列表求积,既没有按阶数截取对应长度的前序节点,还因为反转操作导致乘积顺序完全颠倒,同时出现多余乘积项
- 自动化简问题:Sympy默认会对代数表达式做最简合并,
x - 0会被自动化简为x,没有做阻止化简的处理 - 累加逻辑缺失:循环内每次都重新给
polynom变量赋值,没有维护累加变量存储全部分项的和
修复方案
- 维护逐次递增的乘积项变量:初始值设为1,每轮循环乘上当前顺序对应的
(x - x_i)因子,自然实现逐次新增括号项、顺序正确的效果 - 引入
UnevaluatedExpr包裹0值,阻止Sympy自动化简(x - 0)为x - 初始化最终多项式变量为0,每轮计算完当前分项后累加到最终变量上
- 每轮循环按阶数取对应位置的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
相关产品推荐
相关产品推荐

