继续接着前面多项式的操作来说。这次说一下Poly1d。poly1d类是numpy 1.4之前表示多项式的类,在1.4及以后,推荐使用Polynomial类,但是目前仍遗留很多关于此类的模块和方法,因此了解其使用也是十分有必要的。
1. 对象创建
使用构造函数class numpy.poly1d(c_or_r, r=False, variable=None)返回一个poly1d对象,其中,c_or_r是构造多项式的系数或者根,取决于第二个参数r,如果r为True表示第一个参数是表示根,如果为False则第一个参数是表示系数,无论用那种形式,多项式都是按降幂排列的,例如:
p1=poly1d([1,2,-3])
print(p1)
输出为:
2
1 x + 2 x - 3
表示
p2=poly1d([1,2,-3],r=True)
print(p2)
输出为:
3
1 x - 7 x + 6
表示
这种打印方式,幂和多项式各占1行,在排版上不太美观,另外默认的多项式符号使用x,如果需要使用其他字符,可以通过variable指定。
2. 属性
系数可以通过c/coef/ coeffs/coefficients属性获取:
p1=poly1d([1,2,-3])
print(p1.c)
print(p1.coef)
print(p1.coefficients)
'''
输出都是: [ 1 2 -3]
'''
通过r或者roots属性,可以获取多项式时的根:
p1=poly1d([1,2,-3,2])
print(p1.roots)
print(p1.r)
# [-3.1527576+0.j 0.5763788+0.54968425j 0.5763788-0.54968425j]
可以看到与Polynomial类一样,求根实在复数域内进行的,N次方程有N个根(m重根算m个)。
o/order可以获取最高次幂:
p1=poly1d([1,2,-3,2])
print(p1.order) # 2
print(p1.o) # 2
variables属性返回多项式所使用的变量字符串,如果构造函数中没有提供,就是’x’,否则就和构造函数中variables参数一样。
3. 数值计算
向对象提供参数,可以计算多项式在处的值,支持标量和数组:
p1=poly1d([1,2,-3])
print(p1(2)) # 5
print(p1([-1,0,1])) # [-4 -3 0]
也可以使用np.polyval计算:
p1=poly1d([1,2,-3])
print(np.polyval(p1,2))
print(np.polyval(p1,[-1,0,1]))
4 多项式的运算
通过使用polyadd,polysub,polymul,polydiv可以对多项式进行加减乘除运算,注意polydiv返回的是商和余子式,不要尝试使用运算符,例如:
p1=poly1d([1,2,-3])
p2=poly1d([1,1,1])
p3=p1+p1
print(p3)
p3=polyadd(p1,p2)
print(p3)
p1+p2的结果是,这显然是错误的。
多项式还支持求导和积分,例如:
p1=poly1d([1,2,-3])
p1d=p1.deriv()
p1i=p1.integ()
则:
使用numpy.polyder和numpy.polyint也可以实现同样的功能。
5. 从Poly1d向Polynomial的转换
由于Poly1d使用的是降幂排列,而Polynomial使用的是升幂排列,因此,转换方式如下:
import numpy as np
from numpy import poly1d
from numpy.polynomial import Polynomial
p1=poly1d([1,2,-3])
p2=Polynomial(p1.coef[::-1])
print(p2) # -3.0 + 2.0 x + 1.0 x**2