切比雪夫多项式以及numpy实现

切比雪夫多项式

通常我们使用切比雪夫多项式时都在范围[-1,1]之间。

定义

切比雪夫多项式在[-1,1]上的定义是:Tn(x)=cos(narccos(x)),1x1,其中,T_n(x)是阶数为n的切比雪夫多项式。

性质

  • Tn(x)是n阶多项式。
  • Tn(x)的奇偶性和n的奇偶性一致。
  • Tn(x)在区间[-1,1]上有n个零点。
  • 正交性:在区间[-1,1]上切比雪夫多项式满足正交性,也即11Tm(x)Tn(x)dx=π2δmn
  • 归一性:xupxdownTn(x)Tn(x)=1

递推公式

T0(x)=1
T1(x)=x
Tn+1(x)=2xTn(x)Tn1(x)
前5阶切比雪夫多项式:
T0=1
T1=x
T2=2x21
T3=4x33x
T4=8x48x2+1
T5=16x520x3+5x

零点

满足Tn(xk)=0xk的值。通常使用xk=cos((2k1)π2n)来计算,其中k是从1到n的整数。

python实现

主要使用的是numpy.polynomial中的chebyshev模块。按照功能来讲解不同方法的用法。

生成切比雪夫多项式

有两个方法:

  • 通过给出的系数生成切比雪夫多项式(numpy.chebyshev.Chebyshev)
import numpy
coef = [1,2,3,4]
chebyPoly = numpy.polynomial.chebyshev.Chebyshev(coef)
print(chebyPoly)
  • 通过给出的阶数生成切比雪夫多项式(numpy.chebyshev.Chebyshev.basis)
import numpy
degree = 5
chebyPoly = numpy.polynomial.chebyshev.Chebyshev.basis(degree)
print(chebyPoly)

这两种方法返回的都是切比雪夫多项式实例。

生成切比雪夫多项式的零点

只需要在切比雪夫多项式实例上使用roots()方法即可:

from numpy.polynomial import Chebyshev
n=5
nodeBeforeMap = Chebyshev.basis(n).roots()
## 这段代码其实包含了两个步骤
### step1 生成切比雪夫多项式
a = Chebyshev.basis(n)
print(a)
### step2 求刚刚生成的切比雪夫多项式的根(注意:roots不需要其他的参数,并且是直接返回[-1,1]之间的根,basis不做domain和Window的限制产生的也是定义域在[-1,1]的多项式)
print(a.roots())

窗口化切比雪夫多项式零点的范围

from numpy.polynomial import Chebyshev

L = Chebyshev.basis(n,domain=[-1,1],window=[-0.01,0.01]).mapparms()
print(L)
### 这里mapprams是给出映射函数的一个方法。其目的是帮助我们写出把chebyshev多项式的零点从domain范围映射到window范围的函数L。
### 所以返回值是L函数的系数。换句话说我们如果想要得到映射后的点子还需要这样的操作:L=L[0]+L[1]*x。(注意是线性映射)

切比雪夫多项式求导

在切比雪夫多项式实例上使用deriv(j)方法。其中j是求导的阶数。返回的是一个切比雪夫多项式(求导后的)。因此可以输入具体的值,求解求导后的切比雪夫多项式在该值处的值。

from numpy.polynomial import Chebyshev

n=5
chebyPoly = Chebyshev.basis(n)
chebyPoly.deriv(1)(0)#求切比雪夫多项式chebyPoly的1阶导在0处的值

切比雪夫拟合

from numpy.polynomial import Chebyshev
## Chebyshev.fit(x,y,deg,domain,window,recond,full,w)(本质做法还是最小二乘拟合)
# x: 待拟合数据的x坐标
# y:待拟合数据的y坐标
# domain:多项式的自变量范围
# window:对多项式窗口化
# full: full=true 会返回切比雪夫多项式的系数、残差和秩(元组)。 full=false会返回一个切比雪夫多项式(numpy数组)
# w:拟合时的权重

# 输入数据
x = np.array([-1, -0.5, 0, 0.5, 1])
y = np.array([0, 0.5, 1, 0.5, 0])

# 拟合切比雪夫多项式
chebyPoly = Chebyshev.fit(x, y, deg=2)

print(f"Coefficients of Chebyshev Polynomial Fit: {coefficients}")

将切比雪夫多项式转化为普通多项式

很多时候我们需要切比雪夫多项式良好的性质。我们使用切比雪夫多项式来拟合,插值等等。但是我们同时又需要最终结果为普通多项式。

  • 第一种方法
normalPoly=chebyPoly.convert(kind=np.polynomial.Polynomial)
print(normalPoly)
  • 第二种方法
def fac(n):
    if n<0:
        pass
    elif n==0:
        y=1
        return y
    elif n>0:
        return (fac(n-1)*n)
    
for i in range(0,2+1):
    print("E(%d)=%f"%(i,chebyPoly.deriv(i)(0)/fac(i)))
## 这样我们就得到切比雪夫多项式转化的普通多项式的系数

可以利用上边给出的递推公式将输出的切比雪夫多项式手动转化为普通多项式来检查。函数返回的切比雪夫实例为:T0+C1T1(x)+C2T2(x)++CnTn(x),只需要将递推关系中的T0=1,T1=x,T2=2x21,代入并且合并同类项就可以得到相应的普通多项式。

延伸知识(窗口化)

在numpy.polynomial的切比雪夫多项式中经常需要指定两个参数:domain和Window,看起来很相似,有什么区别吗。

  • domain 仅仅放缩自变量的取值范围,函数不会有所变化。
  • Window 放缩自变量和函数的取值范围。

现在假设多项式为T(x)

  • domain[area,area],指y=T(x),x[area,area]
  • window[area,area],指y=T(areax),x[area,area]
posted @   Emi-lia  阅读(569)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示