【Python】Numpy处理多项式类Polynomial

文章目录

    • 构造函数
    • 求导和积分
    • 求根和反演
    • 采样与拟合
    • 其他方法

构造函数

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()

效果为

【Python】Numpy处理多项式类Polynomial_第1张图片

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表示截止误差。fullFalse时,只返回拟合系数,否则还返回拟合的标准差等。

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

其命名很直观,不必多言。

你可能感兴趣的:(#,Numpy,python,numpy,Polynomial,多项式)