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
相关产品推荐
相关产品推荐

