多项式numpy.poly1d, polynomial属性方法 最小二乘法拟合(tcy)

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修改打印显示变量

===========================================================

实例5:

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

猜你喜欢

转载自blog.csdn.net/tcy23456/article/details/87478096
今日推荐