计算方法实验一、秦九韶算法

一、实验名称:秦九韶算法

、目的

  1. 掌握秦九韶算法求解多项式的基本原理;
  2. 分别编程实现用直接计算法秦九韶算法求解一元n次多项式在x=2.5时的值;
  3. 比较两种算法求解多项式的时间。

、实验设备

  1. 编程语言 python;
  2. 实验环境:已安装相关编程环境的计算机1台。

四、算法原理  

   算法是将函数的最外层的同质未知数的次数不断提取出来的过程,通过提取相同阶数的未知数,让大部分的乘法缩减为小部分的加法

    一般地,一元n次多项式的求值需要经过(n+1)*n/2次乘法和n次加法,而秦九韶算法只需要n次乘法和n次加法。在人工计算时,一次大大简化了运算过程

五、算法实现及结果分析

 代码:

初始已知值

import time
import numpy as np
import warnings
warnings.filterwarnings("ignore")
x=2.5
A=[6,4,3,2,1,0]
B=[3,4,-2,-7,1,-8]

定义直接计算函数

def ZJJS(x,A,B):
    r=0
    l=len(A)
    for i in range(l):
        r=r+B[i]*x**A[i]
    return r

由于算法要求括号内每层都为ax+b的形式,定义秦九韶算法函数为

def QJZ(x,C):
    r=C[0]
    l=len(C)
    for i in range(l-1):
        r=r*x+C[i+1]
    return r

该函数只有两个变量,x和C,C为系数,长度n为最高次幂的数值+1,从C[0]开始依次是最高次幂降序的系数,当式子中不存在m次幂时,C[n-m-1]的值为0,即系数为0

 用time.clock()来记录时间,循环100000次来放大差距

start=time.clock()
for i in range(100000):
    r=QJZ(x,C)
end=time.clock()
a=end-start
print("秦九韶计算结果为{},所用时间为{}".format(r,a))
start=time.clock()
for i in range(100000):
    r=ZJJS(x,A,B)
end=time.clock()
a=end-start
print("直接计算结果为{},所用时间为{}".format(r,a))

六、函数优化

由于用QJZ1算法时要写C[]列表,当出现幂次出现大规模断层时,如x**100+x*10,原本只用写两个系数1,此时要多出98个无脑重复的0,手动输入太过麻烦,进行了函数优化。

def C(A,B):
    C=np.zeros(A[0]+1)
    for i in range(len(A)):
        C[A[0]-A[i]]=B[i]
    C=list(C)
    return C

七、代码合并

import time
import numpy as np
import warnings
warnings.filterwarnings("ignore")
x=2.5
A=[6,4,3,2,1,0]
B=[3,4,-2,-7,1,-8]
def C(A,B):
    C=np.zeros(A[0]+1)
    for i in range(len(A)):
        C[A[0]-A[i]]=B[i]
    C=list(C)
    return C
def ZJJS(x,A,B):
    r=0
    l=len(A)
    for i in range(l):
        r=r+B[i]*x**A[i]
    return r
def QJZ(x,C):
    r=C[0]
    l=len(C)
    for i in range(l-1):
        r=r*x+C[i+1]
    return r
C=C(A,B)
start=time.clock()
for i in range(100000):
    r=QJZ(x,C)
end=time.clock()
a=end-start
print("秦九韶计算结果为{},所用时间为{}".format(r,a))
start=time.clock()
for i in range(100000):
    r=ZJJS(x,A,B)
end=time.clock()
a=end-start
print("直接计算结果为{},所用时间为{}".format(r,a))

                
  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛马一枚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值