罗兰关于MATLAB的艺术

将想法转化为MATLAB

polyval的简史

当我刚开始在MathWorks工作时,MATLAB中已经有一些函数用于处理多项式。其中的一个,polyval,对于多项式的评估,使用一种算法,基于霍纳氏法则,以其效率著称,特别适合嵌入式控制器环境。在一个客户想知道为什么函数花了这么长的时间来计算一个给定的多项式的标量输入值之后x,我们更新polyval对标量情况使用更快的算法,该算法使用函数过滤器.我想在这里再讨论一些细节。

注意:自从我写这篇文章(但在我发表它之前)有一个讨论有关同一主题的新闻组。请务必阅读来自约翰D 'Errico

内容

霍纳氏法则

让我们首先看一下为多个输入值求多项式值的代码x.这是相关的部分polyval数控是表示多项式的向量的长度(比多项式的次数多一个)。

dbtypepolyval62:67
对于X是数组的一般情况,使用霍纳方法。63 y = 0 (size_x, superiorfloat(x,p));64 if nc>0, y(:) = p(1);End 65 for i=2:nc 66 y = x .* y + p(i);67年结束

一般多项式是这样的:

这个方程可以写成这样,

也是求数组多项式值的基础x.注意,这个公式基本上是从最高次的系数开始的)乘以x,然后加上下一个系数,将结果乘以x再次,加上下一个系数,以此类推,直到最后的系数(常数项,为).在这个公式中,我们永远不需要明确地创建的所有幂x求多项式的值。

标量情况,使用过滤器

下面是使用该函数的标量求值情况的代码过滤器

dbtypepolyval52:53
52 y = filter(1,[1 -x],p);53 y = y(nc);

乍一看,它可能与多项式计算无关。然而,仔细研究数学就会发现它确实是有用的。首先,让我们检查一下过滤器公式。在这个版本中,系数一个已经被标准化了(1)= 1(对于输入是正确的过滤器你刚刚看到的)。

现在,让我们试一个小例子。假设我们要计算我在另一个例子中使用的三次多项式的帖子最近。

P = [1 0 1 -1];

代表

当你打电话过滤器像这样y =过滤器(b, a, x),其结果是

再看看polyval的输入,使用这些替换过滤器b = 1A = [1 -x],x = p.我们评估过滤器的值p,多项式系数!让我们算一下原因过滤器的工作原理。下面是函数的输出公式过滤器,假设p (0) = 0,我们可以找到第一个输出。

这是剩下的,一直到最后的系数。

看起来最终的答案是多项式p评估在x

算法有多接近?

从数值上看,这两种算法本质上是相同的。

x = 0:0.001:1;resultArray = polyval (p (x);resultScalar = 0(大小(x));resultScalar(index) = polyval(p,x(index));结束allequal = isequal (resultArray resultScalar)
allequal = 1

相同的!

时机

我说过我们这样做是为了加快速度。这段特殊的代码在检查计时时很棘手,特别是在多项式次数很小的情况下,计时机制可能会淹没数学运算的数量。当计算机较慢时,在我们在MATLAB中提高for循环的性能之前,测量这些代码之间的性能差异要比今天容易得多。

多种算法

您是尝试编写适合所有人的代码,还是创建可以切换算法或实现的代码,就像我们看到的那样polyval,以考虑不同的条件,如数组大小?我很想听到更多关于这些想法的经验在这里




MATLAB®7.8发布

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。