class numpy.poly1d(c_or_r,r = False,variable = None )一维多项式类。
参数:
c_or_r : array_like
r = False多项式的系数,以递减的幂,
r = True多项式的根(多项式求值为0的值)
variable: str,可选 打印显示使用的变量x为variable
属性:
c/coef /coefficients /coeffs多项式系数的副本
o/order多项式的阶数或次数
r/roots 多项式的根,其中self(x)== 0
variable多项式变量的名称
方法
__call__(value) 将自己称为功能。
deriv([m=1]) 返回此多项式的1阶导数。
integ([m,k]) 返回此多项式的反导数(不定积分)m是积几次分,k是常系数
===========================================================
实例1.1:构造多项式x ^ 2 + 2x + 3=(x+1)^2+2:
p = np.poly1d([1, 2, 3])
print(np.poly1d(p)) #1 x^2 + 2 x + 3
pp=np.poly1d([1, -1]) * np.poly1d([1, -2])
np.poly1d(pp.r, True)==pp#True从根构造一个多项式
实例1.2:
p(0.5) ==p.__call__(0.5) #True 计算x = 0.5时多项式1 x^2 + 2 x + 3的值=4.25
实例1.3:
p.r #计算多项式[1 x^2 + 2 x + 3=(x+1)^2+2]=0的根array([-1.+1.41421356j, -1.-1.41421356j])
>p(p.r)# 计算多项式 (x+1)^2+2的值array([ -4.44089210e-16+0.j, -4.44089210e-16+0.j])
===========================================================
实例2:显示系数:
p.c #array([1, 2, 3])
p.order#显示多项式最高次数(多项式数量-1)=2
p[1] #2显示多项式中k次幂的系数(相当于p.c[-(i+1)]):
===========================================================
实例3:多项式可以加,减,乘,除(返回商和余数):
p+[-2,1]==p+np.poly1d([-2,1]) #True等于1 x^2 + 2 x + 3+(-2x^2+1)
p * p== p**2 #True 等于poly1d([ 1, 4, 10, 12, 9])
(p**3 + 4) / p
a=(p**3 + 4) / p # 商,余数
p*a[0]+a[1]==(p**3+4) # True 除数*商+余数=被除数
np.asarray(p) #array([1, 2, 3]) 给出系数数组,因此多项式可用于接受数组的所有函数:
===========================================================
实例4:
np.square(p) # 单个系数的平方array([1, 4, 9])
p = np.poly1d([1,2,3], variable='z')
print(p) #1 z^2 + 2 z + 3修改打印显示变量
===========================================================
p.deriv(m=1) #多项式的1阶导数=poly1d([2, 2])
p.integ(m=1,k= 0)#多项式的1次积分,常系数k=0:结果= poly1d([0.33333333, 1. ,3., 0. ])
===========================================================
1.1多项式包
=============================================================
# 多项式的形式:p(x)=1+2x+3x^2…
• 多项式模块(numpy.polynomial.polynomial)
• 切比雪夫模块(numpy.polynomial.chebyshev)
• 勒让德模块(numpy.polynomial.legendre)
• 拉盖尔模块(numpy.polynomial.laguerre)
• 埃尔米特模块,“物理学家”(numpy.polynomial.hermite)
• HermiteE模块,“概率论者”(numpy.polynomial.hermite_e)
• Polyutils
==============================================================
2多项式模块numpy.polynomial.polynomial的方法
# 2.1.Polynomial类
Polynomial(coef[, domain, window]) A power series class.
#2.2基础np.polynomial.polynomial.
polyval(x, c[, tensor]) 在点x处评估多项式c.
polyval2d(x, y, c) 在点(x,y)处评估二维多项式.
polyval3d(x, y, z, c) 在点(x,y,z)处评估3-D多项式.
polygrid2d(x, y, c) 评估x和y的笛卡尔乘积上的二维多项式.
polygrid3d(x, y, z, c) 评估x,y和z的笛卡尔乘积上的3-D多项式.
polyroots(c) 计算多项式的根.
polyfromroots(roots) 给定根生成多项式.
polyvalfromroots(x, r[, tensor]) 在点x处评估由其根指定的多项式.
import numpy.polynomial.polynomial as pp
from numpy.polynomial import Polynomial as P
import numpy as np
pp.polyval(1, [1,2,3]) # 6.0
a = np.arange(4).reshape(2,2)# array([[0, 1],[2, 3]])
pp.polyval(a, [1,2,3]) # array([[ 1., 6.], [17., 34.]])
# 2.3Fitting拟合
polyfit(x, y, deg[, rcond, full, w])多项式与数据的最小二乘拟合.见备注1
polyvander(x, deg) 给定度的Vandermonde矩阵.
polyvander2d(x, y, deg) 给定度数的伪Vandermonde矩阵.
polyvander3d(x, y, z, deg) 给定度数的伪Vandermonde矩阵.
# 2.4Calculus微积分
polyder(c[, m=1, scl=1, axis]) 多项式导数m=1一阶导数.
polyint(c[, m=1, k=0, lbnd, scl=0, axis]) 多项式积分.m=1一阶积分,k积分常数,lbnd积分下限
# 2.5Algebra代数:均返回系数数组
polyadd(c1, c2) 加
polysub(c1, c2) 减
polymul(c1, c2) 乘
polymulx(c) 将多项式乘以x.
polydiv(c1, c2) 除;返回(商,余数)数组
polypow(c, pow[, maxpower]) 幂
p1 = P([1,2,3]);p2 = P([4,5,6])
(p1+p2).coef==pp.polyadd([1,2,3],[4,5,6])#array([ True, True, True])
pp.polymulx([1,2,3]) #array([0., 1., 2., 3.])
pp.polydiv([1,2,3],[4,5,6]) #(array([0.5]), array([-1. , -0.5]))
pp.polypow([1,2,3],2) #array([ 1., 4., 10., 12., 9.])
# 2.6杂项
polycompanion(c) 返回c的伴随矩阵.
polytrim(c[, tol]) 多项式中删除为0的系数.
polyline(off, scl) 返回线性多项式的数组:y=off截距 +scl斜率 * x
# polydomain 构造数组的低级方法,不建议使用
# polyzero
# polyone
# polyx
p1=P([1,2,3,0,0])
p1.coef #array([1., 2., 3., 0., 0.])
pp.polytrim([1., 2., 3., 0., 0.]) #array([1., 2., 3.])
P.polyline(1,-1) #array([ 1, -1])
P.polyval(1, P.polyline(1,-1)) # 0
==============================================================
3.Polynomial属性方法:
p.coef #系数
p.domain #域
p.window #窗口
p.maxpower #100最大幂n
p.nickname #p.nickname='poly'
P.basis(n) #构造多项式f(x)=x^n
P.fromroots() #由根构造多项式
T.cast(p) #类方法:转换
p.convert() #转换p.convert(kind=T)==T.cast(p)
p.copy() #返回1个副本
p.cutdeg(m) #返回最高幂为m的副本m<=n;减少表达式到指定长度
p.degree() #多项式的最高幂n=P([1,2,3]).degree()=2
p.fit() #最小二乘拟合
p1.has_samecoef(p2) #是否有相同系数
p1.has_samedomain(p2) #是否有相同域
p1.has_sametype(p2) #是否有相同类型
p1.has_samewindow(p2) #是否有相同窗口
deriv() #导数
integ() #积分
p.linspace(n=100)#返回域中等间隔的x,y值主要用于绘图y=多项式为x的值
mapparms()#
roots() #求根
p.trim() #删除系数为0的项
p.identity() #身份
p.truncate() #返回映射参数
==============================================================
# 实例3.1:构造
from numpy.polynomial import Polynomial as P
p = P([1,2,3])#Polynomial([ 1., 2., 3.], domain=[-1, 1], window=[-1, 1])系数,域,窗口
P.fromroots(p.roots())!=p#从根构建(误差较大)
# 实例3.2:属性
p.coef #系数array([ 1., 2., 3.])
p.domain #array([-1., 1.]) 域;用在拟合 ;在图形上就是x轴的坐标范围
p.window #array([-1., 1.])窗口;用在拟合;在图形上就是y轴的坐标范围
print( p) # 系数poly([ 1. 2. 3.])
# 实例3.3:四则运算
# 域,窗口或类不同的多项式不能在算术中混合使用
# 多项式无就地计算,应为多项式是不可变的
p + P([1,2,3])==p + [1, 2, 3]#True (1+2x+3x^2 )+ (1+2x+3x^2)
# Polynomial([ 2., 4., 6.], domain=[-1, 1], window=[-1, 1])
p - p # Polynomial([ 0.], domain=[-1, 1], window=[-1, 1])
p * p==p**2 # True Polynomial([ 1., 4., 10., 12., 9.],...)
[1, 2, 3] * p #隐式使用多项式
#多项式只有整除无/除法
a=p // P([-1, 1]) #商
b=p % P([-1, 1]) #余数
a*P([-1, 1])+b==p #True
a, b = divmod(p, P([-1, 1]))#返回商,余数
a*P([-1, 1])+b==p #True
# 实例3.4:微积分
p.deriv(m=1) #默认1阶导数
# Polynomial([ 2., 6.], domain=[-1, 1], window=[-1, 1])
p.integ(m=1, k=[], lbnd=None)
# m:非负int;积分次数
# k=0:array;积分常数.a[0]用于第一次积分,a[1]用于第2次积分,...len(a)<=m
# lbnd=0:标量#定积分的下界
p = P([2, 6])
p.integ() #一次积分,积分下限为0,积分常数为0
p.integ(2) #二次积分
p.integ(lbnd=-1) #积分下限为-1,积分常数为0
p.integ(lbnd=-1, k=1) #积分常数为1
============================================================
# 实例3.5:计算多项式的数值
x = np.arange(5) # array([0, 1, 2, 3, 4])
p(x) # array([ 1., 6., 17., 34., 57.])
x = np.arange(6).reshape(3,2)# array([[0, 1], [2, 3], [4, 5]])
p(x) # array([[ 1., 6.], [ 17., 34.], [ 57., 86.]])
#实例3.6:代换:用x替换多项式并展开结果.:
p(p)==P([1])+2*p+3*p**2#True f=(1+2x+3x^2 ) f2=(1+2f+3f^2 )
# 实例3.7:根
p2=P([1,2,1])#f(x)=(x+1)(x+1)
p2.roots() #array([-1., -1.]) 根f(x)=(x+1)(x+1)
==============================================================
# 实例3.8:多项式类之间的转换:
from numpy.polynomial import Chebyshev as T
from numpy.polynomial import Polynomial as P
p(T([0, 1])) # Chebyshev([ 2.5, 2. , 1.5], domain=[-1, 1], window=[-1, 1])
p(T([0, 1]))==1+2*t+3*t**2 #True
p.convert(kind=T) # Chebyshev([ -9. , 11.75, -3. , 0.25], ...)
p.convert(kind=T)==T.cast(p)#True
p.convert(kind=T, domain=[0, 1])#转换域和窗口
# Chebyshev([-2.4375 , 2.96875, -0.5625 , 0.03125], [ 0., 1.], [-1., 1.])
p.convert(kind=P, domain=[0, 1])#转换域和窗口
# Polynomial([-1.875, 2.875, -1.125, 0.125], [ 0., 1.], [-1., 1.])
P.basis(1)#Polynomial([0., 1.], ...)
P.basis(2)#Polynomial([0., 0., 1.], ...)
P.basis(3)#Polynomial([0., 0., 0., 1.], ...)构造一个指定幂的唯一项的多项式(只有1项)
==================================================================
实例3.9:多项式最小二乘法拟合
import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial import Chebyshev as T
np.random.seed(11)
x = np.linspace(0, 2*np.pi, 20)
y = np.sin(x) + np.random.normal(scale=.1, size=x.shape)
p = T.fit(x, y, 5)#和库函数相比多域,窗口参数
plt.plot(x, y, 'o')
xx, yy = p.linspace()
plt.plot(xx, yy, lw=2)
p.domain# array([ 0. , 6.28318531])
p.window# array([-1., 1.])
plt.show()
==================================================================
备注1:
numpy.polynomial.polynomial.polyfit(x,y,deg,rcond = None,full = False,w = None )
多项式与数据的最小二乘拟合.返回多项式系数
p(x)= c_0 + c_1 * x + ... + c_n * x ^ n #其中n是deg.
参数:
# x : array_like,shape(M,)样本数据:x坐标.(x[i], y[i])
# y : array_like,shape(M,)或(M,K)样本点的y坐标.共享x坐标
# deg : int或1-D array_like
# rcond : float拟合的相对条件数.相对于最大奇异值,小于rcond的奇异值将被忽略.默认值为len(x)*eps,
# 其中eps是平台浮点类型的相对精度,在大多数情况下约为2e-16.
# full=False: False只返回系数; True还返回来自奇异值分解(用于求解拟合矩阵方程)的诊断信息.
# w : array_like,shape(M,),权重
返回:
# coef : ndarray,shape(deg + 1,)或(deg + 1,K)
# 系数从低到高排序.如y是2D则coef的列k中的系数表示与y的第k列中的数据拟合的多项式.
# [residuals,rank,singular_values,rcond] : list仅当full = True 时才返回这些值
关闭警告关闭:
# 如拟合矩阵秩不足则引发.仅当full = False时才会引发警告.:
# import warnings
# warnings.simplefilter('ignore', RankWarning)
原理:
# V(x)* c = w * y
# V是x的加权伪Vandermonde矩阵,c是要求解的系数,w是权重
# y是观测值.然后使用V的奇异值分解来求解该等式.
# 用双精度多项式拟合大约n=20处“失败”.用切比雪夫或勒让德级数拟合通常更好
例子
from numpy.polynomial import polynomial as P
x = np.linspace(-1,1,51) # x "data": [-1, -0.96, ..., 0.96, 1]
y = x**3 - x + np.random.randn(len(x)) # x^3 - x + N(0,1) 加入噪声
c, stats = P.polyfit(x,y,3,full=True)
c #array([-0.07337936, -0.49068546, 0.4177516 , 0.05029048])
stats #[array([37.6443948]),4,array([1.38446749, 1.32119158, 0.50443316, 0.28853036]),1.1324274851176597e-14]
==============================================================