Python数值计算(9)——Poly1d

继续接着前面多项式的操作来说。这次说一下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

表示x^2+2x-3

p2=poly1d([1,2,-3],r=True)
print(p2)

输出为:

   3
1 x - 7 x + 6

表示x^3-7x+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属性,可以获取多项式f(x)=0时的根:

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的结果是2x^2+4x-6,这显然是错误的。

多项式还支持求导和积分,例如:

p1=poly1d([1,2,-3])
p1d=p1.deriv()
p1i=p1.integ()

则:P_{1d}=2x+2,P_{1i}=0.333x^3+x^2-3x

使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值