【问题标题】:slow calculation of General Polynomial Equation一般多项式方程的缓慢计算
【发布时间】:2021-05-12 12:51:06
【问题描述】:

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

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

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

问题在于,time 拥有的元素越多和/或apowr 的长度越长,执行此计算所需的时间就太长了。有没有办法更快地进行这个计算?

【问题讨论】:

  • 忘记添加了,但可能是无用的信息:powr=Highest_Power:-1:0;a 由用户定义。
  • 你能提供一个minimal reproducible example吗?
  • 仅供参考,MATLAB 有一个名为 polyval 的专用多项式评估函数。它所需要的只是一个查询向量(计算多项式的值)和一个降序的系数向量。

标签: matlab


【解决方案1】:

阿米亚:

代码运行缓慢的原因是计算不是多项式因式,这意味着它没有利用正在运行的产品。例如,你的多项式是 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 乘法和 @ 987654332@ 加法(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 循环利用了多项式因式分解,与不必要地从头开始逐个计算幂相比,它的扩展性要好得多。

【讨论】:

  • 非常感谢您的回答,我不知道乘法需要很长时间才能阅读本文,
  • 乐于助人。乘法是一种适度昂贵的计算。问题在于它们的数量随着多项式的阶数增加的速度有多快。例如,如果你“蛮力”计算一个 100 阶多项式,sum(1:100) 返回 5050,这是多项式分解工作量的 50.5 倍。
猜你喜欢
  • 1970-01-01
  • 2015-12-11
  • 2017-09-16
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多