【问题标题】:MatLab - Horner's algorithmMatLab - 霍纳算法
【发布时间】:2012-08-14 18:42:12
【问题描述】:

我在将霍纳算法的伪代码转换为 MatLab 中的正确代码时遇到了一些麻烦。我认为我的困惑源于代码假定第一个向量条目可以由 0 引用,而在 MatLab 中,这必须是 1。我试图相应地修改我的代码,但我不明白正常工作。伪代码如下:

input n, (a_i, : 0 ≤ i ≤ n), z_0
   for k = 0 to n-1 do
      for j = n-1 to k step -1 do
          a_j = a_j + z_0*a_(j+1)
      end do
end do
output (a_i: 0 ≤ i ≤ n)

这是我在 MatLab 中编写的尝试,其中a 是表示多项式系数的输入向量:

function x = horner(a,z_0)
n = length(a);
for k = 1:n-1
    for j = n-1:-1:k
        a(j) = a(j) + (z_0)*a(j+1);
    end
end
x = a;

我在向量a = [1 -4 7 -5 -2] 上尝试了这个,它表示多项式中的系数。我还设置了z_0 = 3。根据我的书,我应该收到输出向量a = [1 8 25 37 19],但我的代码给出了输出向量a = [-245 -313 -146 -29 -2]

如果有人能帮我清理这段代码,我将不胜感激!

【问题讨论】:

  • 看起来像你的循环短:我会说它应该是 k = 1:nfor j = n:-1:k
  • edit polyval 向您展示了 Matlab 人员是如何实现该算法的。

标签: matlab polynomial-math


【解决方案1】:

试试这个 - 这里a 是多项式系数的向量,其中 a(1) 是多项式中最高次数项的系数。如果你的向量是相反的方向,只需设置

b = fliplr(a)

并使用向量b 调用函数。此函数将使用 Horners 算法评估多项式。请注意,这假设 z_0 是您希望多项式评估的值,因此返回单个值(不是向量)

function x = horner(a,z_0)
n = length(a);
result = a(1);
for j = 2:n
    result = result*z_0 + a(j);
end
x = result;

如果您想传入一个值向量z 进行评估,以便同时评估多个点(z 的元素),您可以通过向量传入它们:

function x = horner(a,z)
n = length(a);
m = length(z);
result = a(1)*ones(1,m);
for j = 2:n
    result = result.*z + a(j);
end
x = result;

现在返回的x 将成为您的结果向量

【讨论】:

  • 太棒了!非常感谢您的帮助。有一个brainfreeze,并没有意识到应该翻转矢量:)。非常感谢!
  • @Kristian 没问题,注意你也可以使用polyval 函数——查看它的文档。
  • 再次感谢。是的,我其实很熟悉这个功能,但是因为我很想学这个东西,所以我也想自己写算法:)
猜你喜欢
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
相关资源
最近更新 更多