多项式求值的秦九韶算法 python

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多项式求值的秦九韶算法 python相关的知识,希望对你有一定的参考价值。

# 计算一元多项式在给定点x处的值
# 其中多项式系数存放在列表a中,多项式阶数为n
# 1.直接算法
def f(n:int,a:list,x:float):
    the_sum = a[0]
    for i in range(1,n+1):
        the_sum += a[i] * pow(x,i)
    return the_sum
# 2.秦九韶算法
def f2(n:int,a:list,x:float):
    the_sum = a[n]
    for i in range(n,0,-1):
       the_sum = the_sum * x + a[i-1]
    return  the_sum

参考技术A 原多项式变形为 ,即 , 点评:利用秦九韶算法求多项式的值首先要将多项式改写为每个括号内为关于x的一次式的形式,!

多项式函数插值:多项式形式函数求值的Horner嵌套算法

  设代数式序列 $q_1(t), q_2(t), ..., q_{n-1}(t)$ ,由它们生成的多项式形式的表达式(不一定是多项式):

$$p(t)=x_1+x_2q_1(t)+...x_nq_1(t)q_2(t)..q_{n-1}(t)=sumlimits_{i=1}^n(x_iprodlimits_{j=1}^{i-1}q_j(t))$$  一般来讲,按照这个形式计算函数在 $t_0$ 点的取值的复杂度为:n-1次 $q_i(t)$ 求值,n-1次浮点数乘法(生成n个不同的乘积),n-1次乘积和常系数浮点数乘法,n-1次浮点数加法 $Rightarrow$ 总计n-1次 $q_i(t)$ 求值和 $T(n)approx 3n$ 次浮点数运算。这需要在计算过程中存储保留一个 $prodlimits_{j=1}^{i-1}q_j(t)$ 的结果,避免重复运算(那样将会使得生成乘积的n次浮点乘法变成$n^2/2$ 次)。

  利用Horner嵌套算法,可以在 $T(n)approx 3n$ 的基础上再进一步。Horner嵌套算法的表达式是:$$p(t)=x_1+q_1(t)(x_2+q_2(t)(x_3+q_3(t)(...(x_{n-1}+q_{n-1}(t)x_n)...)))$$  迭代的伪代码可以写成:

$poly = x_n\forquad i = n -1 to 1\ quad poly = x_i+q_i(t) imes poly\ end$

  Horner嵌套算法需要n-1次 $q_i(t)$ 求值(这是免不了的),n-1次浮点数乘法,和n-1次浮点数加法,这将把复杂度再削减到n次求值和 $T(n)approx 2n$ 次浮点数运算。考虑到函数求值是非常普遍和基本的操作,即使只是在复杂度上打个折扣也是非常可观的事情。因此形如上式的多项式型表达式,只要可以使用Horner嵌套算法就应当使用。

  Horner嵌套算法适用于通过单项式表达的多项式求值,即 $p(t)=x_1+x_2t+x_3t^2+...+x_nt^{n-1}$ ,此处 $q_1(t)=q_2(t)=...=q_n(t)=t$;同样也适用于通过牛顿插值表达的多项式,即 $p(t)=x_1+x_2(t-t_1)+...+x_n(t-t_1)..(t-t_n)$ ,此处 $q_i(t)=t-t_i$ 。

以上是关于多项式求值的秦九韶算法 python的主要内容,如果未能解决你的问题,请参考以下文章

秦九韶算法知识点

霍纳法则

秦九韶算法详解

多项式函数插值:多项式形式函数求值的Horner嵌套算法

多项式求值的MATLAB实现

[计算机数值分析]利用秦九韶算法求多项式的值