从根计算多项式系数的最佳方法是什么?

swa*_*p96 5 matlab polynomials

poly函数将多项式的根作为输入并返回多项式的系数。底层算法是什么?

有没有更好的方法从根计算多项式的系数?

Lui*_*ndo 2

注意:

\n\n
    \n
  • 要获得多项式p ( x ) (带前导系数1),您需要将x \xe2\x88\x92 r形式的所有项相乘,其中r是根。(重根应根据其重数考虑多次。)
  • \n
  • 多项式的乘法相当于卷积。事实上,文档conv

    \n\n
    \n

    w = conv(u,v)返回向量和的卷积。如果和uvuv是多项式系数的向量,则对它们进行卷积相当于将两个多项式相乘。

    \n
  • \n
\n\n

所以:

\n\n
roots = [1 -2 3]; %// input (roots)\nresult = 1;  %// initiallize\nfor r = roots\n    result = conv(result, [1 -r]);\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这个例子中,结果是

\n\n
result =\n     1    -2    -5     6\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是相同的向量poly

\n\n

或者,您可以手动进行卷积

\n\n
roots = [1 -2 3]; %// input (roots)\nresult = 1;  %// initiallize\nfor r = roots\n    result = [result 0] + [0 -r*result];\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

这相当于以下具有显式循环的代码代码,它应该更接近于 C++ 实现:

\n\n
roots = [1 -2 3]; %// input (roots)\nresult = nan(1,numel(roots)+1);  %// preallocate. Values will be overwritten\nresult(1) = 1; %// initiallize\nfor n = 1:numel(roots)\n    result(n+1) = -roots(n)*result(n); %// update from right to left, due to overwriting\n    for k = n:-1:2\n        result(k) = result(k) - roots(n)*result(k-1);\n    end\nend\n
Run Code Online (Sandbox Code Playgroud)\n