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

Julia中带基点的霍纳多项式求值算法实现问题求助

带基点的霍纳算法修正方案

你的代码核心问题是没有累积多项式中的乘积因子:每次迭代仅直接相加c[i]*(x-b[i-1]),而非将之前的计算结果与当前(x-b[i-1])结合,导致无法生成(x-b₁)(x-b₂)这类需要连续乘积的项。

正确实现方案

这里提供两种符合需求的实现:

方案1:反向迭代(经典霍纳嵌套形式)

从最高次项对应的系数开始反向计算,利用嵌套结构自动累积乘积因子:

function hornerpolybase(x, c, b)
    n = length(c)
    y = c[n] * one(x)  # 初始化类型与x一致
    for i = n-1:-1:1
        y = y * (x - b[i]) + c[i]
    end
    return y
end

方案2:正向迭代(直观累积乘积项)

和你最初的思路对齐,通过单独变量维护累积的乘积因子:

function hornerpolybase_forward(x, c, b)
    n = length(c)
    y = c[1] * one(x)
    product_term = one(x)  # 初始化乘积项为1
    for i = 2:n
        product_term *= (x - b[i-1])  # 累积(x-b₁)(x-b₂)...(x-b_{i-1})
        y += c[i] * product_term
    end
    return y
end

测试你的目标多项式

你的目标多项式:

p(x) = 10 - (21/2)(x+2) + (45/6)(x+2)(x) - (7/3)(x+2)(x)(x-1)

对应参数:

  • 系数数组 c = [10, -21/2, 45/6, -7/3]
  • 基点数组 b = [-2, 0, 1](因为x-b₁=x+2 → b₁=-2;x-b₂=x → b₂=0;x-b₃=x-1 → b₃=1)

测试示例:

c = [10, -21/2, 45/6, -7/3]
b = [-2, 0, 1]

# 手动计算x=0时结果为-11
println(hornerpolybase(0, c, b))       # 输出-11.0
println(hornerpolybase_forward(0, c, b)) # 输出-11.0

两种方案对比

  • 反向迭代版本:更贴合霍纳算法的数学本质,计算效率略高,无需额外维护乘积变量;
  • 正向迭代版本:逻辑更直观,和你最初的代码结构更接近,容易理解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:25:23