吳立勛
(陸軍航空兵學(xué)院航電和兵器工程系,北京,101123)
Volterra級數(shù)模型是一種用輸入輸出表示的非線性系統(tǒng)模型,它的輸出是輸入的非線性函數(shù)的線性組合。它是一種典型的非參數(shù)模型,得到了廣大研究者的重視[1]?;赩olterra級數(shù)模型的非線性系統(tǒng)自適應(yīng)辨識問題,使用在線遞推的方法辨識出系統(tǒng)的Volterra級數(shù)核參數(shù)。但是,隨著階數(shù)的增加,Volterra級數(shù)的維數(shù)將呈現(xiàn)指數(shù)形式的增長,辨識的計(jì)算量大大增加,影響了這一模型的實(shí)際應(yīng)用。為了提高運(yùn)算效率,本文在研究Volterra級數(shù)模型的非線性系統(tǒng)全解耦辨識算法[2]的基礎(chǔ)上,對這一算法進(jìn)行了改進(jìn)。仿真結(jié)果表明,改進(jìn)后的算法能有效克服Volterra級數(shù)模型辨識中的維數(shù)災(zāi)難問題,易于進(jìn)行工程實(shí)現(xiàn)。
對于單輸入單輸出連續(xù)非時(shí)變因果非線性系統(tǒng),其輸入輸出關(guān)系就可用如下的Volterra級數(shù)來描述:
其中u(t),y(t) ∈R,分別是系統(tǒng)的輸入和輸出,yn(t)稱為非線性系統(tǒng)的第 n階輸出,稱為非線性系統(tǒng)的第n階Volterra時(shí)域核。
其離散截?cái)嘈问剑?/p>
Volterra級數(shù)模型的全解耦辨識算法有效地避免各階非線性因素間的較強(qiáng)耦合,它將Volterra自適應(yīng)辨識問題看作是一個(gè)在低階Volterra偽線性子系統(tǒng)已滿足MMSE(最小均方誤差)準(zhǔn)則且其核固定于最佳值條件下使高階偽線性子系統(tǒng)再滿足MMSE準(zhǔn)則的約束優(yōu)化問題,實(shí)現(xiàn)了真正意義上的全解耦。
在這一過程中采用了LMS自適應(yīng)方法對各階權(quán)向量進(jìn)行了自適應(yīng)修正,其修正公式如下:
用系統(tǒng)的輸入、輸出觀測數(shù)據(jù)來對非線性系統(tǒng)的Volterra級數(shù)模型進(jìn)行辨識,就可得到非線性系統(tǒng)的Volterra時(shí)域核。
由Volterra級數(shù)模型的離散截?cái)嘈问娇梢钥闯?,隨著階數(shù)的提高和記憶長度的增加,矩陣的維數(shù)將成指數(shù)級的增長,使得辨識計(jì)算量大大增加,出現(xiàn)了災(zāi)難性的計(jì)算復(fù)雜性。同時(shí),實(shí)際的工程應(yīng)用又對計(jì)算提出了挑戰(zhàn)性的要求。為了提高模型的辨識精度,記憶長度和階數(shù)往往比較大,一般的計(jì)算方法占機(jī)時(shí)間長。因而尋求一種魯棒性能好、簡便快速、可擴(kuò)展性強(qiáng)的辨識方法已經(jīng)成為實(shí)現(xiàn)該算法的關(guān)鍵。傳統(tǒng)的方法是采用單處理器對Volterra級數(shù)模型的核參數(shù)進(jìn)行逐級辨識,在階數(shù)較高、記憶長度較長的情況下,將會大大影響計(jì)算速度,因而可擴(kuò)展性不好,給工程實(shí)現(xiàn)帶來很大限制。
通過上文的分析可見,在對核參數(shù)進(jìn)行逐階辨識的過程中,采用單個(gè)處理器計(jì)算量過大,占機(jī)時(shí)間過長。為了克服這一缺點(diǎn),可以嘗試進(jìn)行算法并行化,把計(jì)算任務(wù)分給多個(gè)處理器同時(shí)完成,這們就可以成倍減少占機(jī)時(shí)間。
在上面的算法運(yùn)行過程中,采用對核參數(shù)的逐階辨識計(jì)算。第一次計(jì)算1階核時(shí),所用的變量都是原始變量,與以后的計(jì)算無關(guān),在第一次計(jì)算2階核時(shí),除了H1要使用前面的結(jié)果外,其它變量也都是原始變量。同理,第一次計(jì)算第3階核時(shí)要用到H1和H2的結(jié)果……由此可見,各階核的計(jì)算過程中,主要與原始變量和低階核交換數(shù)據(jù)。在一次疊代過程中,由于數(shù)據(jù)有前后依賴關(guān)系,不存在并行的可能性。但是,第二次疊代中的第一階核估算要用到是第一次疊代中的第一階核估算值,第一次疊代中的第二階核估算要用到是第二階核的初值和第一次疊代中的第一階核估算值,與別的中間值無關(guān),它們兩者間沒有數(shù)據(jù)依賴關(guān)系,可以并行執(zhí)行。依次類推,除了第一次疊代中的第一階核估算外,其余各次估算都可以并行進(jìn)行,存在可并行的空間。
2.2.1 任務(wù)劃分與負(fù)載平衡
并行算法主要是為了減輕維數(shù)過高帶來的繁重的計(jì)算任務(wù),因此,可以將整體的任務(wù)進(jìn)行分解,采用多處理器分別處理。
按照計(jì)算過程的功能,將每一階核的估算過程作為一個(gè)子任務(wù),分配給不同的處理器進(jìn)行處理。由于各階核的計(jì)算量基本相同,所以各個(gè)處理器間能夠達(dá)到負(fù)載平衡。
2.2.2 同步與通信
為了不改變算法的基本屬性,需要在各個(gè)進(jìn)程中加入通信和同步[4],以協(xié)調(diào)各階的運(yùn)算運(yùn)行進(jìn)度,確保計(jì)算高階核時(shí)能用到低階核的計(jì)算結(jié)果。
通信是在空間上對各并發(fā)執(zhí)行的進(jìn)程施行數(shù)據(jù)交換。在各階核的估算中,各個(gè)階段性子任務(wù)間有數(shù)據(jù)相互依賴關(guān)系,需進(jìn)行數(shù)據(jù)交換。二階核的計(jì)算要用到一階的核值計(jì)算結(jié)果,三階核的計(jì)算要用到一、二階核值的計(jì)算結(jié)果……。這樣,高階子任務(wù)要與所有低階子任務(wù)進(jìn)行通信。為了避免出現(xiàn)全局通信,將各階核值設(shè)為全局變量,各階核的計(jì)算結(jié)果都放在共享存儲器的全局變量中,采用全局讀和全局寫來實(shí)現(xiàn)數(shù)據(jù)交換。高階子任務(wù)只需在需要的時(shí)間從主存中讀入所需變量即可,無需分別與各低階子任務(wù)進(jìn)行數(shù)據(jù)交換。
同步是在時(shí)間上強(qiáng)使各子進(jìn)程在某一點(diǎn)必須相互等待。在各子任務(wù)異步執(zhí)行各自程序的過程中,為保證各處理器的正確工作順序,各處理器要實(shí)現(xiàn)對共享數(shù)據(jù)的互斥訪問,必須設(shè)置同步點(diǎn)。在進(jìn)行二階核的估算時(shí),因?yàn)橐褂靡浑A核的計(jì)算結(jié)果,所以要等待第一階核計(jì)算結(jié)束,而三階核的估算要使用一、二階核的計(jì)算結(jié)果,必須等待第二階核計(jì)算結(jié)束(此時(shí)一階核已計(jì)算結(jié)束,無需檢測一階核的計(jì)算進(jìn)程)……。各階要在計(jì)算模型輸出前設(shè)置同步,這樣,不但能保證工作順序的正確性,而且能使在寫各階核變量時(shí),下一階還沒有去讀該核值,以實(shí)現(xiàn)對同一全局變量的互斥訪問。
2.2.3 工作方式與任務(wù)映射
為了保證數(shù)據(jù)通信與計(jì)算過程的正確性,將每一階核的計(jì)算任務(wù)分給一個(gè)處理器來完成,當(dāng)階數(shù)增加時(shí),可以增加處理器數(shù)目。而當(dāng)記憶長度增加時(shí),只是每個(gè)處理器的計(jì)算時(shí)間增加了,處理器數(shù)目無需增加。
由于在辨識計(jì)算的過程中,參數(shù)有前后相互依賴關(guān)系,故采用流水線方式使各個(gè)處理器依次進(jìn)入工作狀態(tài)。最后用先入先出方式結(jié)束工作[5]。其原理如圖1所示:
圖1 流水線原理
與此同時(shí),設(shè)計(jì)一個(gè)主處理器,它負(fù)責(zé)任務(wù)的調(diào)度、指令的發(fā)布、共享變量和各種原始數(shù)據(jù)的存儲。子任務(wù)負(fù)責(zé)接受任務(wù)調(diào)度、完成數(shù)據(jù)讀寫、處理及向主進(jìn)程提交執(zhí)行結(jié)束信息。主進(jìn)程發(fā)布指令給各處理器,使各處理器分別完成不同的操作,中間結(jié)果存放于局存中。其工作原理如圖2:
圖2 并行算法工作原理
并行算法的工作過程如下:經(jīng)過初始化后,主處理器首先向處理器1發(fā)出指令,處理器1第一次執(zhí)行其程序,其余處理器處于空閑狀態(tài);接到處理器1執(zhí)行完成的信息后,同時(shí)向處理器1、2發(fā)出指令,處理器1第2次執(zhí)行計(jì)算,同時(shí)處理器2第1次執(zhí)行計(jì)算,其余處理器處于空閑狀態(tài);在接到其中一個(gè)處理器完成信息時(shí),同步等待,在兩個(gè)處理器都執(zhí)行完后,向處理器1、2、3同時(shí)發(fā)出指令,各自執(zhí)行其程序……。經(jīng)過若干個(gè)周期后,所有處理器都于工作狀態(tài),直至迭代結(jié)束,各處理器依次停止工作。
以上所設(shè)計(jì)的并行算法與原有算法相比,其區(qū)別在于采用了并行的思想,使各階核值的估算過程可以并行執(zhí)行。而且,對于串行的辨識算法而言,每次核值估算都要進(jìn)行輸入觀測向量的構(gòu)造,對于并行算法來說,第二階核值的第一次估算,可以直接讀取第一階第一次估算時(shí)所構(gòu)造的輸入觀測向量,而不用重復(fù)構(gòu)造,依次類推。對于在單個(gè)PC機(jī)上設(shè)計(jì)并行算法的仿真程序時(shí),可以在第n次構(gòu)造完輸入觀測向量時(shí),完成第一階核的第n次估算,第二階核的第n-1次估算……直至完成所有核的估算,而不用重復(fù)構(gòu)造輸入觀測向量。
下面以改進(jìn)后的并行算法的思想為基礎(chǔ),設(shè)計(jì)Matlab程序?qū)λ惴ㄟM(jìn)行驗(yàn)證。
設(shè)非線性系統(tǒng)由以下方程給出:
系統(tǒng)輸入使用隨機(jī)白噪聲信號,采用二階Volterra級數(shù)模型對該未知非線性系統(tǒng)進(jìn)行建模。Volterra級數(shù)的記憶長度為3,學(xué)習(xí)因子取值為:μ1=0.03, μ2=0.006。
以下是該算法對一、二階核的部分辨識結(jié)果與真值的比較:
表1 辨識結(jié)果與真值對照表
由所得數(shù)據(jù)可以看出,辨識結(jié)果與真值非常接近,達(dá)到了較高的辨識精度。
圖3是h1(0)、h2(0,0)的收斂曲線,只需經(jīng)過約150次迭代,兩個(gè)核參數(shù)都可達(dá)到穩(wěn)定狀態(tài)。
圖3 h1(0)、h2(0,0)的收斂曲線(并行算法)
由于該并行算法是對串行算法的直接并行,未改變原算法的基本屬性,所以,各方面性能繼承了原算法的優(yōu)點(diǎn),與串行算法有著同樣的穩(wěn)態(tài)精度和收斂速度,且穩(wěn)態(tài)收斂過程平穩(wěn),表明該并行算法具有良好的實(shí)用性。
表2中列出了兩種算法的仿真運(yùn)行時(shí)間。為了獲得兩種算法在同等條件下的比較,在同一Matlab窗口下運(yùn)行兩個(gè)程序,分別用tic命令啟動秒表計(jì)時(shí)器,用toc命令讀取秒表計(jì)時(shí)器,以得到各自的運(yùn)行時(shí)間。由表2中可以看出,在Matlab程序下,并行算法比串行算法平均節(jié)省時(shí)間19.92%。
表2 仿真時(shí)間對比
按照這一算法思想所編的并行程序,在并行機(jī)上運(yùn)行時(shí)將會更大程度地節(jié)省時(shí)間,這對于提高算法的在線運(yùn)行速度非常有效。