一般多项式方程的慢速计算

凯里的军队

我正在尝试制作一个通用多项式函数,它给出了计算它的时间段、最高多项式幂powr和每个常数a其中apowr是相同的长度。

我的代码方法如下:从那时起,当将元素与元素相乘时, 的每个元素都time被转换为一个向量,然后计算结果向量的总和以使其成为一个元素。powra

for i=1:length(time) 
    result(i)=sum((time(i).^[powr]).*[a]);
end

问题是,它需要的时间太长了做这个计算更多的元素time有和/或更长的apowr是。有没有办法更快地进行这个计算?

JA费朗

军队:

代码运行缓慢的原因是计算没有进行多项式分解,这意味着它没有利用正在运行的乘积。举例来说,您的多项式的阶数为 3(即y = a*x^3 + b*x^2 + c*x + d)。您的代码的设置方式使其x(类似于您的time变量)首先被立方(3 次乘法 + 1 乘以a),然后平方(2 次乘法 + 1 乘以b),然后引用(0 次乘法 + 1乘以c),最后加上d这相当于 9 次乘法和 3 次加法。以这种方式计算多项式需要sum(1:n)乘法和n加法。

如果取而代之的是将多项式y = ((a*x + b)*x + c)*x + d分解为:乘法次数减少到 3(从 9 次),而加法次数保持在 3。事实上,多项式分解方法通过n乘法和n加法来评估多项式n是多项式的阶数)。因此,人们可以看到多项式因式分解在计算工作中的扩展速度明显慢于我们称之为蛮力方法。

要对更高次多项式执行此操作,我建议您将代码修改为:

N = length(time); %Get number of time values on which the polynomial evaluation is needed.
hmp = length(a); %I'm assuming a contains the polynomial coefficients in ascending order.
result = ones(N,1)*a(end); %Preallocate memory for results.
for i=hmp-1:-1:1
    result = result.*time + a(i); %Compute the factored parenthesis 'outward'
end

N您要评估多项式的​​时间值的数量在哪里hmp是最高幅度功率。制作result向量使循环同时计算所有时间条目的多项式。这个for循环利用了多项式因式分解,与不必要地从头开始逐个元素计算幂相比,它的缩放更可爱。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章