【问题标题】:Code Horner’s Method for Polynomial EvaluationCode Horner 的多项式求值方法
【发布时间】:2020-10-12 13:03:15
【问题描述】:

我正在尝试编写用于多项式评估的霍纳方法,但由于某种原因它对我不起作用,我不确定我在哪里弄错了。

这些是我拥有的数据:

nodes = [-2, -1, 1]
x = 2
c (coefficients) = [-3, 3, -1]

我目前的代码是:

function y = horner(x, nodes, c)

   n = length(c);
   y = c(1);

   for i = 2:n
       y = y * ((x - nodes(i - 1)) + c(i));
   end
end

我应该得到一个多项式,例如(−1)·(x+2)(x+1)+3·(x+2)−3·1,如果是x =2,那么我应该得到-3。但是由于某种原因,我不知道我哪里出错了。

编辑:

所以我改变了我的代码。我认为它有效,但我不确定:

function y = horner(x, nodes, c)
   n = length(c);
   y = c(n);
   for k = n-1:-1:1
       y = c(k) + y * (x - nodes((n - k) + 1));
   end
end

【问题讨论】:

  • 您的第二个功能(您通过编辑添加的功能)不正确。它仅适用于 x=2...
  • 你能解释一下你期望得到的多项式中的每个系数或节点是什么吗?我不明白...
  • @Avi 很抱歉没有说清楚。节点是数据点。所以对于这个例子,多项式是 c_1 + c_2(x - x_1) + c_3(x-x_1)(x-x_2)。每个 C 对应于系数,每个 x_i 是节点(数据点)。所以对于这个例子,它将是 (-1)*(x-x_1)(x-x_2) + 3*(x - x_1) - 3。但是我需要使用霍纳的方法来编写。

标签: matlab polynomial-math


【解决方案1】:

这行得通:

function y = horner(x, nodes, c)
   n = length(c);
   y = 0;
   for i = 1:n % We iterate over `c`
      tmp = c(i);
      for j = 1:i-1 % We iterate over the relevant elements of `nodes`
          tmp *= x - nodes(j); % We multiply `c(i) * (x - nodes(1)) * (x -nodes(2)) * (x- nodes(3)) * ... * (x - nodes(i -1))
      end
      y += tmp; % We added each product to y
   end
   % Here `y` is as following:
   % c(1) + c(2) * (x - nodes(1)) + c(3) * (x - nodes(1)) * (x - nodes(2)) + ... + c(n) * (x - nodes(1)) * ... * (x - nodes(n - 1))
end

【讨论】:

  • 虽然只有代码的答案可能会回答这个问题,但您可以通过为您的代码提供上下文、此代码工作的原因以及一些文档参考以供进一步阅读,从而显着提高您的答案质量.来自How to Answer“简洁是可以接受的,但更全面的解释更好。”
【解决方案2】:

(对不起,这不是python,但我不知道python)

在我们没有节点的情况下,horner 的方法是这样工作的:

p = c[n]
for i=n-1 .. 1
    p = x*p + c[i]

例如对于二次(系数 a,b,c),这是

p = x*(x*a+b)+c

请注意,如果您的语言支持 fma

fma(x,y,x) = x*y+z

那么可以写horner的方法

p = c[n]
for i=n-1 .. 1
    p = fma( x, p, c[i])

当你有节点时,改变很简单:

p = c[n]
for i=n-1 .. 1
    p = (x-nodes[i])*p + c[i]

或者,使用 fma

p = c[n]
for i=n-1 .. 1
    p = fma( (x-nodes[i]), p, c[i])

对于上面的二次方程,这导致

p = (x-nodes[1]*((x-nodes[2])*a+b)+c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多