首页 > 其他分享 >切比雪夫多项式

切比雪夫多项式

时间:2024-01-15 21:22:19浏览次数:25  
标签:Chebyshev chebyPoly area 多项式 比雪夫 numpy

切比雪夫多项式

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

定义

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

性质

  • \(T_n(x)\)是n阶多项式。
  • \(T_n(x)\)的奇偶性和n的奇偶性一致。
  • \(T_n(x)\)在区间[-1,1]上有n个零点。
  • 正交性:在区间[-1,1]上切比雪夫多项式满足正交性,也即\(\int_{-1}^1T_m(x)T_n(x)d_x=\frac{\pi}{2}\delta_{mn}\)
  • 归一性:\(\int_{-xup}^{xdown}T_n(x)^\star T_n(x)=1\)

递推公式

\(T_0(x)=1\)
\(T_1(x)=x\)
\(T_{n+1}(x)=2xT_n(x)-T_{n-1}(x)\)
前5阶切比雪夫多项式:
\(T_0=1\)
\(T_1=x\)
\(T_2=2x^2-1\)
\(T_3=4x^3-3x\)
\(T_4=8x^4-8x^2+1\)
\(T_5=16x^5-20x^3+5x\)

零点

满足\(T_n(x_k)=0\)的\(x_k\)的值。通常使用\(x_k=cos(\frac{(2k-1)\pi}{2n})\)来计算,其中k是从1到n的整数。

python实现

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

生成切比雪夫多项式

有两个方法:

  • 通过给出的系数生成切比雪夫多项式(numpy.chebyshev.Chebyshev)
import numpy
coef = [1,2,3,4]
chebyPoly = numpy.chebyshev.Chebyshev(coef)
print(chebyPoly)
  • 通过给出的阶数生成切比雪夫多项式(numpy.chebyshev.Chebyshev.basis)
import numpy
degree = 5
chebyPoly = numpy.chebyshev.Chebyshev(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)))
## 这样我们就得到切比雪夫多项式转化的普通多项式的系数

可以利用上边给出的递推公式将输出的切比雪夫多项式手动转化为普通多项式来检查。函数返回的切比雪夫实例为:\(T_0+C_1T_1(x)+C_2T_2(x)+\dots+C_nT_n(x)\),只需要将递推关系中的\(T_0=1,T_1=x,T_2=2x^2-1,\dots\)代入并且合并同类项就可以得到相应的普通多项式。

延伸知识(窗口化)

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

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

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

  • \(domain\in[-area,area]\),指\(y=T(x)\),\(x\in[-area,area]\)
  • \(window\in[-area,area]\),指\(y=T(area*x)\),\(x\in[-area,area]\)

标签:Chebyshev,chebyPoly,area,多项式,比雪夫,numpy
From: https://www.cnblogs.com/jia-t-t/p/17966374

相关文章

  • 多项式基础
    FFT/NTT板子,就不说了。分治FFT给定序列\(g_{1\dotsn-1}\),求序列\(f_{0\dotsn-1}\)。其中\(f_i=\sum_{j=1}^if_{i-j}g_j\),边界为\(f_0=1\)。Solution1朴素地做是\(\mathcal{O}(n^2)\)的。观察到后面的项依赖前面的项。于是我们可以考虑用cdq分治实现。具体......
  • 多项式定积分计算软件2025 64位WIN版下载Polynomial definite integral calculation s
    本软件功能强大,价格实惠,欢迎试用本软件的WIN64位版本。本软件能计算如a0+a1*x+a2*x^2+......+an*a^n的式子的对b1和b2的积分的结果。具体的方法就是在多多项式系数区输入a0到an的值,然后点击计算积分结果即可在结果栏算出结果。最大项数为1000项。多项式系数输入时1项1行,从上......
  • 多项式exp/牛顿迭代
    牛顿迭代解决的是这样一个问题:已知\(g(f(x))\equiv0\pmod{x^n}\)与\(g(x)\),求模\(x^n\)意义下的\(f(x)\)这个问题可以用倍增的方式解决。首先假设你知道了\(g(f(x))=0\)的常数项(一般都能很方便的知道)。然后,我们假设\(f_0(x)\)是模\(x^{\lceil\frac{n}{2}\rceil}\)......
  • 多项式的逆元
    对于多项式\(f(x)=a_0+a_1x+a_2x^2+...+a_nx^n\)若存在\(g(x)=b_0+b_1x+b_2x^2+...+b_mx^m(m\len)\)使得\(f(x)g(x)\equiv1\pmod{x^m}\),称\(g(x)\)为\(f(x)\)在模\(x^m\)下的逆元,记作\(f^{-1}(x)\pmod{x^m}\)多项式存在逆元的充要条件:\(a_0\)在模\(x^m\)下有......
  • 计算给定多项式的值
    Console.WriteLine("Hello,World!");varlist=newdouble[100000000];for(inti=0;i<100000000;i++){list[i]=i;}Console.WriteLine("Func1结果:"+Func1(100000000,1,list));Console.WriteLine("Func2结果:"+Func2(1......
  • 多项式(Poly)笔记
    开头先扔板子:多项式板子们定义多项式(polynomial)是形如\(P(x)=\sum\limits_{i=0}^{n}a_ix^i\)的代数表达式。其中\(x\)是一个不定元。\(\partial(P(x))\)称为这个多项式的次数。多项式的基本运算多项式的加减法\[A(x)=\sum_{i=0}^{n}a_ix^i,B(x)=......
  • 多项式板子
    FFT#include<iostream>#include<cstdio>#include<cmath>usingnamespacestd;intlimit,r[10000010];doublepie=acos(-1.0);structcomplex{ doublex,y; complex(doublea=0,doubleb=0){x=a;y=b;}};complexoperator+(complexa,complexb......
  • 任意类型多项式乘法
    目录前言前置知识定义与记号单位根分圆多项式Cantor'sAlgorithm规避单位根递归计算卷积做\(\mathcal{I}_p\)上的DFT时间复杂度规避除法实现细节参考资料参考文献参考代码前言所谓“任意类型”,事实上指的是一种代数结构\(\mathcal{A}=(D,+,\cdot)\),满足:\(+:D\timesD\toD......
  • 机器学习-线性回归-多项式升维-07
    目录1.为什么要升维2代码实现3,总结1.为什么要升维升维的目的是为了去解决欠拟合的问题的,也就是为了提高模型的准确率为目的的,因为当维度不够时,说白了就是对于预测结果考虑的因素少的话,肯定不能准确的计算出模型。在做升维的时候,最常见的手段就是将已知维度进行相乘来构建......
  • AtCoder Beginner Contest 331 G - Collect Them All【概率期望+容斥+多项式】
    题目链接:ABC331_G写在前面将来如果回顾这道题,建议自己看完题意一定先重新推一遍。如果还是不够熟练,多去做一些同类型的题目吧。题意:盒子里有\(N\)张卡片,每张卡片上写着一个数字,数字的范围是\(1,...,M\),写着数字\(i\)的卡片有\(C_i\)张\((C_i>0)\)。有放回地抽取卡片,每......