文章目录
- 构造函数
- 求导和积分
- 求根和反演
- 采样与拟合
- 其他方法
构造函数
Numpy
中提供了多项式模块,里面封装了一些用以快速解决多项式问题的类和函数,其中最重要类的自然是Polynomial
,其构造函数为
class numpy.polynomial.polynomial.Polynomial(coef, domain=None, window=None, symbol='x')
其中coef
为多项式的系数,例如
4
+
3
x
+
2
x
2
+
x
3
4+3x+2x^2+x^3
4+3x+2x2+x3可写为
from numpy.polynomial import polynomial as poly
p3 = poly.Polynomial(coef=[4,3,2,1])
print(p3)
# 输出为4.0 + 3.0 x**1 + 2.0 x**2 + 1.0 x**3
domian
为
x
x
x的定义域,window
为定义域的放缩因子;symbol
为多项式的自变量符号,默认为x
。
求导和积分
Polynomial
支持简单的符号计算,比如可通过deriv(n)
求多项式的n
阶导数;通过integ(n)
可求n
阶积分。
>>> p3.deriv(1)
Polynomial([3., 4., 3.], domain=[-1., 1.], window=[-1., 1.])
>>> p3.deriv(3) # 3阶导数为6
Polynomial([6.], domain=[-1., 1.], window=[-1., 1.])
>>> p3.integ(2)
Polynomial([0. , 0. , 2. , 0.5 , 0.16666667, 0.05 ], domain=[-1., 1.], window=[-1., 1.])
求根和反演
roots
可用于求根,而fromroot
可根据根来生成多项式
rs = p3.roots()
print(rs)
# [-1.65062919+0.j
# -0.1746854 -1.54686889j
# -0.1746854 +1.54686889j]
pNew = p3.fromroots(rs)
print(pNew)
#(4.000000000000001-1.1102230246251565e-16j) +
#(3.0000000000000018+0j) x**1 + (1.9999999999999991+0j) x**2 + (1+0j) x**3
由于浮点计算会引入误差,所以fromroot
并不是严格意义上root
的逆过程,但这个误差是极小的。
采样与拟合
通过linspace
可以在定义域范围内对多项式进行采样,
import matplotlib.pyplot as plt
xs, ys = p3.linspace()
plt.plot(xs, ys)
plt.show()
效果为
linspace
有一个参数n
,表示在定义域范围内等间隔生成n
组
x
,
y
x,y
x,y,默认为100。
Polynomial
类中最强大的函数非fit
莫属,其功能是基于最小二乘法的多项式拟合,构造函数为
Polynomial.fit(x, y, deg, domain=None, rcond=None, full=False, w=None, window=None, symbol='x')
其中domain
, window
, symbol
不必赘述,其中x,y
为待拟合多项式;deg
为多项式的阶数。rcond
表示截止误差。full
为False
时,只返回拟合系数,否则还返回拟合的标准差等。
>>> p3.fit(xs, ys, 3)
Polynomial([4., 3., 2., 1.], domain=[-1., 1.], window=[-1., 1.])
>>> p3.fit(xs, ys, 4)
Polynomial([ 4.0000000e+00, 3.0000000e+00, 2.0000000e+00, 1.0000000e+00,
-9.6550042e-15], domain=[-1., 1.], window=[-1., 1.])
其他方法
degree
返回多项式的最高项次数,cutdeg
可以对多项式的次数做阶段,例如
>>> p3.degree()
3
>>> p3.cutdeg(2)
Polynomial([4., 3., 2.], domain=[-1., 1.], window=[-1., 1.])
Polynomial
类提供了一些用于比较的函数,相当于是运算符重载的补充,包括
has_samecoef
has_samedomain
has_sametype
has_samewindow
其命名很直观,不必多言。