利用多項式逼近連續函數


本文可作為線性代數實現線性回歸的下篇,先簡單回顧一下,線性代數實現線性回歸中介紹了子空間的概念,把子空間想象成一個超平面,子空間中任意一個向量都可以用子空間的基線性組成,實現線性回歸原理是利用超平面外的一個向量與該向量在子空間里投影距離最短,或者說誤差最小,求出向量在子空間的投影即可得到未知參數。

    上篇中介紹的線性空間是由實數向量組成,本文將拓展子空間的概念,空間的元素是函數稱之為函數空間,函數空間里面有我們熟悉的各種函數以及這些函數的線性組合,比如三角函數可以組成一個子空間,由數學分析知道利用三角函數可以實現傅里葉變換,將其他函數表示為三角函數線性組合成的級數形式。本文中選取的空間是一個多項式空間,即其空間里基是諸如x0,x1,x2,x3,...xn...等多項式,目標是將其他形式函數投影到多項式函數空間里,從而得到任意函數的多項式近似表達式。

1600325959858016665.jpg

    使用上圖來說明函數空間,AP代表了函數空間里的一個函數,而下面的平面代表了多項式子空間,AP在多項式空間里的投影AC代表與AP誤差最小的多項式,而AC是x0,x1,x2,x3,...xn等多項式的線性組合,我們目標就是求出這個線性組合表達式中每個基前面的系數(坐標)。

一、一元多項式逼近任意一元連續函數

    這里結合一段python代碼說明,這段代碼的功能是利用多項式逼近函數f(x)=sin(x)-3cos(x)。 

import numpy as np
import math
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
NSplit_Num = 10000
class polynomialAppro(object):
    def __init__(self, split=1000):
        self.splitnum = split 

    def genfunction(self):
        ar = []
        t = np.linspace(-math.pi, math.pi, self.splitnum)
        for x in t:
            ar.append(math.sin(x) - 3 * math.cos(x))
        sx = np.expand_dims(np.asarray(ar), 0)
        return sx

    def genpolynomialdata(self):
        ar = []
        t = np.linspace(-math.pi, math.pi, self.splitnum)
        for x in t:
            ar.append([1, x, x ** 2, x ** 3, x ** 4, x ** 5])
        polynomialdata = np.asarray(ar)
        return polynomialdata

if __name__ == '__main__':
    appro = polynomialAppro(NSplit_Num)
    sx = appro.genfunction()  # 1.1
    b = sx.T  # 1.2
    A = appro.genpolynomialdata()  # 1.3
    ATAminus = np.linalg.inv(np.dot(A.T, A))  # 1.4
    coordinate = np.round(np.dot(ATAminus, np.dot(A.T, b)), 4)  # 1.5
    # 打印圖像驗證
    x = np.linspace(-math.pi, math.pi, NSplit_Num)
    y_x = coordinate[0]+ coordinate[1] * x + coordinate[2] * (x ** 2)+  coordinate[3] * (x ** 3) + coordinate[4] * (
            x ** 4) + coordinate[5] * (x ** 5)
    plt.figure()
    plt.subplot(121)
    plt.title('原函數圖像')
    plt.plot(x, b[..., 0])
    plt.subplot(122)
    plt.title('多項式逼近的函數圖像')
    plt.plot(x, y_x)
    plt.show()

 

來看下模擬的效果圖:

Figure_1.png

可以看到利用線性回歸求出的多項式函數可以較好的逼近目標函數f(x)=sin(x)-3cos(x),下面就代碼中標注釋部分說明:

#1.1 sx=appro.genfunction()

得到目標函數f(x)=sin(x)-3cos(x)在-π ,π之間的數據,將其離散化變成計算機可以處理的向量形式,本篇采用了利用顯式函數生成數據,真實的應用中可能並不知道目標函數形式(如果知道具體的函數形式就不需要用多項式來近似了),sx是采集來樣本數據,我們目標是通過數據計算出符合樣本特征的多項式函數。

#1.2 b=sx.T

為了后期處理方便,將其處理成10000*1的向量形式。

#1.3 A=appro.genpolynomialdata()

選取x0,x1,x2,x3,x4,x5作為子空間的基,並將其向量化,這里將得到一個10000*6的矩陣,此時A就是在介紹線性回歸問題時的子空間。這里將函數空間元素賦值,使一個函數空間問題變為一個線性代數問題,這種離散化數據手段在計算機處理中會經常使用。

#1.4、1.5 

 

ATAminus=np.linalg.inv( np.dot(A.T,A))

 

coordinate= np.round(np.dot(ATAminus,np.dot(A.T,b)),4)

經過前面離散化處理,此時問題就變成利用線性空間求解線性回歸問題,#1.4、1.5 是求出函數f(x)=sin(x)-3cos(x)在多項式子空間上的投影,這個處理過程 在之前已經討論過,這里再復盤一遍。

一元多項式.jpg

二、 二元多項式逼近任意連續二元連續函數

    二元乃至多元多項式逼近任意連續函數與一元函數類似,都是最終轉化為實數矩陣形式,然后利用公式(1)求解系數,只不過在構造多項式形式上略有不同,掌握二元多項式逼近問題即可推廣至任意元函數的情形,這里還是先展示一段python代碼,下面代碼用多項式逼近二元函數f(x,y)=sin(x)-cos(y)圖像:

 

余下文章請轉至鏈接:多項式逼近連續函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM