多项式函数类总结

文章介绍了多项式函数的概念,包括一元多项式函数的泰勒展开式和最小二乘估计方法用于参数求解。通过示例展示了如何使用多项式函数逼近sin(x)函数,并对比了不同阶数多项式的逼近效果。讨论了一元与多元多项式函数的区别,以及连续函数逼近与阶跃函数逼近的不同之处。
摘要由CSDN通过智能技术生成

多项式函数类总结

多项式函数

多项式函数类就是由多项式所构成的函数。对于一元函数来说,用一元多项式逼近的常见表达式为:
f ( x ) = a 0 + a 1 ( x − x 0 ) + a 2 ( x − x 0 ) 2 + a 3 ( x − x 0 ) 3 + ⋯ + a n ( x − x 0 ) n + ⋯ f(x)=a_0+a_1(x-x_0)+a_2(x-x_0)^2+a_3(x-x_0)^3+\cdots+a_n(x-x_0)^n+\cdots f(x)=a0+a1(xx0)+a2(xx0)2+a3(xx0)3++an(xx0)n+

其中根据维尔斯特拉斯定理和泰勒定理,我们可以得到 a n a_n an的表达式:
a n = f ( n ) ( x 0 ) n ! , n = 0 , 1 , 2 , ⋯   , n , ⋯ a_n=\frac{f^{(n)}(x_0)}{n!},n=0,1,2,\cdots,n,\cdots an=n!f(n)(x0),n=0,1,2,,n,

然而实际情况中,我们并不一定能知道 f ( x ) f(x) f(x)的函数形状,所以也就无法求出 f ( x ) f(x) f(x)的导数。前面的估计也就无法实施。这时候就需要使用最小二乘估计去估计模型的参数。以多元多项式函数为例:
对于多元函数,多元函数多项式为:
f ( x ∣ θ ) = a 0 + a 1 x 1 + a 2 x 2 + ⋯ + a n x n + a 11 x 1 2 + a 12 x 1 x 2 + ⋯ + a n n x n 2 f(x|\theta)=a_0+a_{1}x_1+a_{2}x_2+\cdots+a_nx_n+a_{11}x_1^2+a_{12}x_1x_2+\cdots+a_{nn}x_n^2 f(xθ)=a0+a1x1+a2x2++anxn+a11x12+a12x1x2++annxn2

其中函数参数包括 a 0 , a 1 , ⋯   , a n , a 11 , ⋯   , a n n a_0,a_1,\cdots,a_n,a_{11},\cdots,a_{nn} a0,a1,,an,a11,,ann。此时我们使用最小化估计误差的方法来求出上述参数。此时,函数 f ( x ) f(x) f(x)的估计表达式用向量乘法可以表示为:
f ( x ) = [ a 0 , a 1 , ⋯   , a n , a 11 , ⋯   , a n n ] ∗ [ 1 , x 1 , ⋯   , x n , x 1 x 1 , ⋯   , x n x n ] T f(x)=[a_0,a_1,\cdots,a_n,a_{11},\cdots,a_{nn}]*[1,x_1,\cdots,x_n,x_1x_1,\cdots,x_nx_n]^T f(x)=[a0,a1,,an,a11,,ann][1,x1,,xn,x1x1,,xnxn]T

记前面的参数行向量为 Θ \Theta Θ,后面的观测列向量为 ψ ( x ) \psi(x) ψ(x)。那么就有:
f ( x ) = Θ ∗ ψ ( x ) f(x)=\Theta*\psi(x) f(x)=Θψ(x)

此时对于 m m m个样本的估计误差为,其中 X i X_i Xi为第 i i i个样本所对应的 [ x 1 , x 2 , ⋯   , x n ] [x_1,x_2,\cdots,x_n] [x1,x2,,xn] Y i Y_i Yi为第 i i i个样本的实际值:
E r r o r = ∑ i = 1 m [ Y i − f ( X i ) ] 2 = [ Y − Θ ∗ ψ ( X ) ] ∗ [ Y − Θ ∗ ψ ( X ) ] T Error=\sum_{i=1}^{m}{[Y_i-f(X_i)]}^2=[Y-\Theta*\psi(X)]*[Y-\Theta*\psi(X)]^T Error=i=1m[Yif(Xi)]2=[YΘψ(X)][YΘψ(X)]T

其中 Y = [ Y 1 , Y 2 , ⋯   , Y m ] Y=[Y_1,Y_2,\cdots,Y_m] Y=[Y1,Y2,,Ym] ψ ( X ) = [ ψ ( X 1 ) , ψ ( X 2 ) , ⋯   , ψ ( X m ) ] \psi(X)=[\psi(X_1),\psi(X_2),\cdots,\psi(X_m)] ψ(X)=[ψ(X1),ψ(X2),,ψ(Xm)]。然后我们的目标是最小化估计误差也就是最小化 E r r o r Error Error,所以用 E r r o r Error Error Θ \Theta Θ求导。同时根据矩阵与向量之间的相合性。
∂ E r r o r ∂ Θ = [ Y − Θ ∗ ψ ( X ) ] ∗ ψ ( X ) T + ∂ [ Y − Θ ∗ ψ ( X ) ] ∂ Θ ∗ [ Y − Θ ∗ ψ ( X ) ] T \frac{\partial{Error}}{\partial\Theta}=[Y-\Theta*\psi(X)]*\psi(X)^T+\frac{\partial{[Y-\Theta*\psi(X)]}}{\partial\Theta}*[Y-\Theta*\psi(X)]^T ΘError=[YΘψ(X)]ψ(X)T+Θ[YΘψ(X)][YΘψ(X)]T

∂ E r r o r ∂ Θ = 2 [ Y − Θ ∗ ψ ( X ) ] ∗ ψ ( X ) T \frac{\partial{Error}}{\partial\Theta}=2[Y-\Theta*\psi(X)]*\psi(X)^T ΘError=2[YΘψ(X)]ψ(X)T

∂ E r r o r ∂ Θ = 0 \frac{\partial{Error}}{\partial\Theta}=0 ΘError=0,可以得到:
Y ∗ ψ ( X ) T − Θ ∗ ψ ( X ) ∗ ψ ( X ) T = 0 Y*\psi(X)^T-\Theta*\psi(X)*\psi(X)^T=0 Yψ(X)TΘψ(X)ψ(X)T=0

化简可以得到:
Θ = Y ∗ ψ ( X ) T ∗ ( ψ ( X ) ∗ ψ ( X ) T ) − 1 \Theta=Y*\psi(X)^T*(\psi(X)*\psi(X)^T)^{-1} Θ=Yψ(X)T(ψ(X)ψ(X)T)1

也就可以估计出多项式近似函数的系数。
接下来以已知函数表达式为例介绍多项式函数逼近效果,仿真函数区间为 [ − 10 , 10 ] [-10,10] [10,10],真实函数区间为: [ − 5 , 5 ] [-5,5] [5,5],下方的代码表示以原函数的前 2 2 2阶导数构成的泰勒级数来逼近原函数,也就是原函数为:
f ( x ) = sin ⁡ ( x ) f(x)=\sin(x) f(x)=sin(x)

近似函数采用了:
f ( x ) = ∑ n = 0 2 f n ( x 0 ) n ! ( x − x 0 ) n f(x)=\sum_{n=0}^{2}\frac{f^{n}(x_0)}{n!}(x-x_0)^n f(x)=n=02n!fn(x0)(xx0)n

其中为了方便, x 0 = 0 x_0=0 x0=0,则近似函数为:
f ( x ) = 0 + 1 1 ! x + 0 2 ! x 2 f(x)=0+\frac{1}{1!}x+\frac{0}{2!}x^2 f(x)=0+1!1x+2!0x2

代码如下所示:

import numpy as np
import matplotlib.pyplot as plt
if __name__=='__main__':
    '''
    利用多项式函数仿真sin(x)函数,由于sin函数具有特殊的导数特性
    sin ->  cos ->  -sin    ->  -cos    ->  sin
    0   ->  1   ->  0   ->  -1  ->  0
    '''
    x=np.linspace(-10,10,1001)
    sum=np.linspace(0,0,1001)
    l=[0,1,0,-1]
    temp=1
    for k in range(3):
        if k !=0:
            temp=temp*k
            sum=sum+l[k%4]/temp*(x**k)
    ll=np.linspace(-5,5,501)
    plt.plot(ll,np.sin(ll),label='orign')
    plt.plot(x,sum,label='simul')
    plt.legend()
    plt.show()

近似结果为:
仿真结果duo1
当使用前 5 5 5阶导数时:
f ( x ) = 0 + 1 1 ! x + 0 2 ! x 2 + − 1 3 ! x 3 + 0 4 ! x 4 + 1 5 ! x 5 f(x)=0+\frac{1}{1!}x+\frac{0}{2!}x^2+\frac{-1}{3!}x^3+\frac{0}{4!}x^4+\frac{1}{5!}x^5 f(x)=0+1!1x+2!0x2+3!1x3+4!0x4+5!1x5

代码如下:

import numpy as np
import matplotlib.pyplot as plt
if __name__=='__main__':
    '''
    利用多项式函数仿真sin(x)函数,由于sin函数具有特殊的导数特性
    sin ->  cos ->  -sin    ->  -cos    ->  sin
    0   ->  1   ->  0   ->  -1  ->  0
    '''
    x=np.linspace(-10,10,1001)
    sum=np.linspace(0,0,1001)
    l=[0,1,0,-1]
    temp=1
    for k in range(6):
        if k !=0:
            temp=temp*k
            sum=sum+l[k%4]/temp*(x**k)
    ll=np.linspace(-5,5,501)
    plt.plot(ll,np.sin(ll),label='orign')
    plt.plot(x,sum,label='simul')
    plt.legend()
    plt.show()

仿真结果为:
仿真结果duo2
可以看出,距离越远,偏差越大;包含的导数项阶数越大,偏差越大。为了观察效果,将仿真范围局限在 [ − 5.1 , 5.1 ] [-5.1,5.1] [5.1,5.1],结果如下:

import numpy as np
import matplotlib.pyplot as plt
if __name__=='__main__':
    '''
    利用多项式函数仿真sin(x)函数,由于sin函数具有特殊的导数特性
    sin ->  cos ->  -sin    ->  -cos    ->  sin
    0   ->  1   ->  0   ->  -1  ->  0
    '''
    x=np.linspace(-5.1,5.1,511)
    sum=np.linspace(0,0,511)
    l=[0,1,0,-1]
    temp=1
    for k in range(6):
        if k !=0:
            temp=temp*k
            sum=sum+l[k%4]/temp*(x**k)
    ll=np.linspace(-5,5,501)
    plt.plot(ll,np.sin(ll),label='orign')
    plt.plot(x,sum,label='simul')
    plt.legend()
    plt.show()

仿真结果为:
仿真结果duo3
可以看出在 0 0 0点附近贴合的比较紧密,在偏离 0 0 0点较远位置,偏差也比较大。这与我们学习泰勒展开时所学习的也一致,泰勒级数是局部逼近,并非全局逼近。

用连续函数进行逼近与用阶跃函数进行逼近最大的区别就是:用连续函数逼近不用划分区间。因为用阶跃函数逼近函数时,是通过划分区间后的窗口函数进行逼近的,而连续函数逼近则是从定义上进行逼近的。比如多项式函数就是所有单项式加起来的函数去逼近一个函数。而三角函数就是所有的三角函数加起来去逼近一个函数,至于一元和多元的区别,接下来进行分析。

首先看一下一元函数的多项式函数:
f ( x ) = a 0 + a 1 ( x − x 0 ) + ⋯ + a n ( x − x 0 ) n + ⋯ f(x)=a_0+a_1(x-x_0)+\cdots+a_n(x-x_0)^n+\cdots f(x)=a0+a1(xx0)++an(xx0)n+

多元函数的多项式函数:
f ( x ) = a 0 + a 1 ( x 1 − x 10 ) + a 2 ( x 2 − x 20 ) + ⋯ + a n ( x n − x n 0 ) + a 11 ( x 1 − x 10 ) 2 + a 12 ( x 1 − x 10 ) ( x 2 − x 20 ) + ⋯ + a 1 n ( x 1 − x 10 ) ( x n − x n 0 ) + a 21 ( x 2 − x 20 ) ( x 1 − x 10 ) + ⋯ + a n n ( x n − x n 0 ) 2 + a 111 ( x 1 − x 10 ) 3 + ⋯ f(x)=a_0+a_{1}(x_1-x_{10})+a_{2}(x_2-x_{20})+\cdots+a_{n}(x_n-x_{n0})+a_{11}(x_1-x_{10})^2\\+a_{12}(x_1-x_{10})(x_2-x_{20})+\cdots+a_{1n}(x_1-x_{10})(x_n-x_{n0})+\\a_{21}(x_2-x_{20})(x_1-x_{10})+\cdots+a_{nn}(x_n-x_{n0})^2+a_{111}(x_1-x_{10})^3+\cdots f(x)=a0+a1(x1x10)+a2(x2x20)++an(xnxn0)+a11(x1x10)2+a12(x1x10)(x2x20)++a1n(x1x10)(xnxn0)+a21(x2x20)(x1x10)++ann(xnxn0)2+a111(x1x10)3+

多元单项式的样子为:
( x 1 − x 10 ) k 1 ( x 2 − x 20 ) k 2 ⋯ ( x n − x n 0 ) k n (x_1-x_{10})^{k_1}(x_2-x_{20})^{k_2}\cdots(x_n-x_{n0})^{k_n} (x1x10)k1(x2x20)k2(xnxn0)kn

一元单项式的样子为: a n ( x 1 − x 10 ) n , n = Z a_{n}(x_1-x_{10})^{n},n=Z an(x1x10)n,n=Z
一元多项式就是所有的一元单项式加起来:
∑ n = 0 + ∞ a n ( x 1 − x 10 ) n \sum_{n=0}^{+\infty}a_{n}(x_1-x_{10})^{n} n=0+an(x1x10)n

二元多项式就是所有的二元单项式加起来构成的:
∑ n 1 = 0 + ∞ ∑ n 2 = 0 + ∞ a n 1 n 2 ( x 1 − x 10 ) n 1 ( x 2 − x 20 ) n 2 \sum_{n_1=0}^{+\infty}\sum_{n_2=0}^{+\infty}a_{n_1n_2}(x_1-x_{10})^{n_1}(x_2-x_{20})^{n_2} n1=0+n2=0+an1n2(x1x10)n1(x2x20)n2

我们截取 n 1 + n 2 ≤ 1 n_1+n_2\le1 n1+n21的所有项作为近似,也就是:
a 00 + a 10 ( x 1 − x 10 ) + a 01 ( x 2 − x 20 ) a_{00}+a_{10}(x_1-x_{10})+a_{01}(x_2-x_{20}) a00+a10(x1x10)+a01(x2x20)

从中可以看出有三个未定参数 a 00 , a 01 , a 10 a_{00},a_{01},a_{10} a00,a01,a10。可以用 ω x + b \omega{x}+b ωx+b表示上述方程。
如果取: n 1 + n 2 ≤ 2 n_1+n_2\le2 n1+n22那么就有:
a 00 + a 10 ( x 1 − x 10 ) + a 01 ( x 2 − x 20 ) + a 11 ( x 1 − x 10 ) ( x 2 − x 20 ) a_{00}+a_{10}(x_1-x_{10})+a_{01}(x_2-x_{20})+a_{11}(x_1-x_{10})(x_2-x_{20}) a00+a10(x1x10)+a01(x2x20)+a11(x1x10)(x2x20)

有四个未知参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值