如何实现Horner的多元多项式方案?

时间:2010-06-16 22:59:55

标签: fortran polynomial-math

背景

我需要在Fortran90 / 95中使用Horner's scheme来解决多个变量中的多项式。这样做的主要原因是当使用Horner方案评估多项式时,效率和准确度会提高。

我目前有一个针对单变量/单变量多项式的Horner方案的实现。然而,开发一个使用Horner方案评估多元多项式的函数证明是超出我的。

  

示例二元多项式将是:12x ^ 2y ^ 2 + 8x ^ 2y + 6xy ^ 2 + 4xy + 2x + 2y将分解为x(x(y(12y + 8))+ y(6y + 4) )+ 2)+ 2y然后评估x&的特定值。收率

研究

我完成了我的研究并找到了许多论文,例如:
staff.ustc.edu.cn/~xinmao/ISSAC05/pages/bulletins/articles/147/hornercorrected.pdf
citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.40.8637&rep=rep1&type=pdf
www.is.titech.ac.jp/~kojima/articles/B-433.pdf

问题

然而,我不是数学家或计算机科学家,所以我在用于传达算法和思想的数学方面遇到了麻烦。

据我所知,基本策略是将多元多项式转换为单独的单变量多项式并以此方式计算。

任何人都可以帮助我吗?如果有人可以帮助我将算法变成我自己可以实现到Fortran的伪代码,我将非常感激。

2 个答案:

答案 0 :(得分:6)

对于两个变量,可以将多项式系数存储在秩= 2矩阵K(n+1,n+1)中,其中n是多项式的阶数。然后观察以下模式(伪代码)

p(x,y) =     (K(1,1)+y*(K(1,2)+y*(K(1,3)+...y*K(1,n+1))) +
           x*(K(2,1)+y*(K(2,2)+y*(K(2,3)+...y*K(2,n+1))) +
         x^2*(K(3,1)+y*(K(3,2)+y*(K(3,3)+...y*K(3,n+1))) +
         ...
         x^n*(K(n+1,1)+y*(K(n+1,2)+y*(K(n+1,3)+...y*K(n+1,n+1)))

根据y,每一行都是一个单独的本垒打方案,并且就x而言,所有这些都是最终的本垒打方案。

要使用FORTRAN或任何语言进行编码,请创建一个中间向量z(n+1),以便

z(i) = homers(y,K(i,1:n+1))

p = homers(x,z(1:n+1))

其中homers(value,vector)是单变量评估的实现,多项式系数存储在vector中。

答案 1 :(得分:0)

我在Python中实现了此操作:multivar_horner

您可以查看那里使用的方法并将其移植到Fortran。

注意:据我所知,尚无已知算法可找到多元多项式的最佳霍纳因式分解。最好的办法是使用巧妙的启发式方法来找到“良好的”因式分解。我实施了一种贪婪的启发式方法,类似于论文“ Greedy Algorithms for Optimizing Multivariate Horner Schemes”中所述。

一些相关出版物(包括上述出版物)的作者声称已经实现了他们提出的算法,但是我找不到任何公开可用的算法。