一、实验名称:秦九韶算法
二、目的
三、实验设备
四、算法原理
算法是将函数的最外层的同质未知数的次数不断提取出来的过程,通过提取相同阶数的未知数,让大部分的乘法缩减为小部分的加法
一般地,一元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))