罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经存档,不会被更新。

polyval简史

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

注意:由于我写的这篇文章(但在我发表之前)有一个讨论在新闻组同样的话题。一定要阅读回复约翰D 'Errico

内容

霍纳氏法则

首先让我们看看评价一个多项式的代码输入的多个值x。这里的相关部分polyval,数控是代表多项式向量的长度(比多项式程度)。

dbtypepolyval62:67
62%使用霍纳氏方法一般情况下,X是一个数组。63 y = 0 (siz_x superiorfloat (x, p));64如果数控> 0,y (:) = p (1);65年底我= 2:数控66 y = x。* y + p (i);67年结束

一般多项式是什么样子:

这个方程可以改写,

并评估一个数组的多项式的基础x。注意,公式基本上从系数最高的学位(命名)乘以x说下一个系数,乘以这个结果x添加下一个系数,等等,直到到达最后一个系数(常数项,)。在这个公式中,我们不需要显式地创建所有的权力x评估多项式。

标量的情况下,使用过滤器

这是标量evalation情况下使用该函数的代码过滤器

dbtypepolyval52:53
52 y =过滤器(1 (1 - x) p);53 y = y (nc);

乍一看,它可能不会出现有关多项式的评估。然而,仔细观察数学确实表明,它可能是有用的。首先,让我们来检查过滤器公式。在这个版本中,系数一个已归一化(1)= 1(这是真正的输入过滤器你刚刚看到的)。

现在,让我们尝试一个小例子。假设我们想要评估相同的第三次多项式我使用另一个的帖子最近。

p = [1 0 1 1];

代表

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

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

这里是休息,去最后的系数在我们的例子中。

它肯定看起来像最终答案这是多项式p评估在x

算法是有多近?

数值,这两个算法本质上是相同的。

x = 0:0.001:1;resultArray = polyval (p (x);resultScalar = 0(大小(x));指数= 1:元素个数(x) resultScalar(指数)= polyval (p, x(索引));结束allequal = isequal (resultArray resultScalar)
allequal = 1

相同的!

时机

我提到我们让这种变化的速度。这个代码是很难检查时间,特别是如果多项式程度很小,数学操作的数量可以淹没计时机制。电脑慢时,在MATLAB中我们增加了for循环的性能之前,测量这些代码的替代品之间的性能差异比现在容易得多。

多种算法

你试着写代码是一刀切,或者你创建代码切换算法或实现,如我们看到的polyval,考虑到不同的条件如数组大小?我想听到更多关于你的经历和这些想法在这里




使用MATLAB®7.8发表


评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。