吳立勛
(陸軍航空兵學院航電和兵器工程系,北京,101123)
Volterra級數模型是一種用輸入輸出表示的非線性系統模型,它的輸出是輸入的非線性函數的線性組合。它是一種典型的非參數模型,得到了廣大研究者的重視[1]。基于Volterra級數模型的非線性系統自適應辨識問題,使用在線遞推的方法辨識出系統的Volterra級數核參數。但是,隨著階數的增加,Volterra級數的維數將呈現指數形式的增長,辨識的計算量大大增加,影響了這一模型的實際應用。為了提高運算效率,本文在研究Volterra級數模型的非線性系統全解耦辨識算法[2]的基礎上,對這一算法進行了改進。仿真結果表明,改進后的算法能有效克服Volterra級數模型辨識中的維數災難問題,易于進行工程實現。
對于單輸入單輸出連續非時變因果非線性系統,其輸入輸出關系就可用如下的Volterra級數來描述:

其中u(t),y(t) ∈R,分別是系統的輸入和輸出,yn(t)稱為非線性系統的第 n階輸出,稱為非線性系統的第n階Volterra時域核。
其離散截斷形式:

Volterra級數模型的全解耦辨識算法有效地避免各階非線性因素間的較強耦合,它將Volterra自適應辨識問題看作是一個在低階Volterra偽線性子系統已滿足MMSE(最小均方誤差)準則且其核固定于最佳值條件下使高階偽線性子系統再滿足MMSE準則的約束優化問題,實現了真正意義上的全解耦。
在這一過程中采用了LMS自適應方法對各階權向量進行了自適應修正,其修正公式如下:

用系統的輸入、輸出觀測數據來對非線性系統的Volterra級數模型進行辨識,就可得到非線性系統的Volterra時域核。
由Volterra級數模型的離散截斷形式可以看出,隨著階數的提高和記憶長度的增加,矩陣的維數將成指數級的增長,使得辨識計算量大大增加,出現了災難性的計算復雜性。同時,實際的工程應用又對計算提出了挑戰性的要求。為了提高模型的辨識精度,記憶長度和階數往往比較大,一般的計算方法占機時間長。因而尋求一種魯棒性能好、簡便快速、可擴展性強的辨識方法已經成為實現該算法的關鍵。傳統的方法是采用單處理器對Volterra級數模型的核參數進行逐級辨識,在階數較高、記憶長度較長的情況下,將會大大影響計算速度,因而可擴展性不好,給工程實現帶來很大限制。
通過上文的分析可見,在對核參數進行逐階辨識的過程中,采用單個處理器計算量過大,占機時間過長。為了克服這一缺點,可以嘗試進行算法并行化,把計算任務分給多個處理器同時完成,這們就可以成倍減少占機時間。
在上面的算法運行過程中,采用對核參數的逐階辨識計算。第一次計算1階核時,所用的變量都是原始變量,與以后的計算無關,在第一次計算2階核時,除了H1要使用前面的結果外,其它變量也都是原始變量。同理,第一次計算第3階核時要用到H1和H2的結果……由此可見,各階核的計算過程中,主要與原始變量和低階核交換數據。在一次疊代過程中,由于數據有前后依賴關系,不存在并行的可能性。但是,第二次疊代中的第一階核估算要用到是第一次疊代中的第一階核估算值,第一次疊代中的第二階核估算要用到是第二階核的初值和第一次疊代中的第一階核估算值,與別的中間值無關,它們兩者間沒有數據依賴關系,可以并行執行。依次類推,除了第一次疊代中的第一階核估算外,其余各次估算都可以并行進行,存在可并行的空間。
2.2.1 任務劃分與負載平衡
并行算法主要是為了減輕維數過高帶來的繁重的計算任務,因此,可以將整體的任務進行分解,采用多處理器分別處理。
按照計算過程的功能,將每一階核的估算過程作為一個子任務,分配給不同的處理器進行處理。由于各階核的計算量基本相同,所以各個處理器間能夠達到負載平衡。
2.2.2 同步與通信
為了不改變算法的基本屬性,需要在各個進程中加入通信和同步[4],以協調各階的運算運行進度,確保計算高階核時能用到低階核的計算結果。
通信是在空間上對各并發執行的進程施行數據交換。在各階核的估算中,各個階段性子任務間有數據相互依賴關系,需進行數據交換。二階核的計算要用到一階的核值計算結果,三階核的計算要用到一、二階核值的計算結果……。這樣,高階子任務要與所有低階子任務進行通信。為了避免出現全局通信,將各階核值設為全局變量,各階核的計算結果都放在共享存儲器的全局變量中,采用全局讀和全局寫來實現數據交換。高階子任務只需在需要的時間從主存中讀入所需變量即可,無需分別與各低階子任務進行數據交換。
同步是在時間上強使各子進程在某一點必須相互等待。在各子任務異步執行各自程序的過程中,為保證各處理器的正確工作順序,各處理器要實現對共享數據的互斥訪問,必須設置同步點。在進行二階核的估算時,因為要使用一階核的計算結果,所以要等待第一階核計算結束,而三階核的估算要使用一、二階核的計算結果,必須等待第二階核計算結束(此時一階核已計算結束,無需檢測一階核的計算進程)……。各階要在計算模型輸出前設置同步,這樣,不但能保證工作順序的正確性,而且能使在寫各階核變量時,下一階還沒有去讀該核值,以實現對同一全局變量的互斥訪問。
2.2.3 工作方式與任務映射
為了保證數據通信與計算過程的正確性,將每一階核的計算任務分給一個處理器來完成,當階數增加時,可以增加處理器數目。而當記憶長度增加時,只是每個處理器的計算時間增加了,處理器數目無需增加。
由于在辨識計算的過程中,參數有前后相互依賴關系,故采用流水線方式使各個處理器依次進入工作狀態。最后用先入先出方式結束工作[5]。其原理如圖1所示:

圖1 流水線原理
與此同時,設計一個主處理器,它負責任務的調度、指令的發布、共享變量和各種原始數據的存儲。子任務負責接受任務調度、完成數據讀寫、處理及向主進程提交執行結束信息。主進程發布指令給各處理器,使各處理器分別完成不同的操作,中間結果存放于局存中。其工作原理如圖2:

圖2 并行算法工作原理
并行算法的工作過程如下:經過初始化后,主處理器首先向處理器1發出指令,處理器1第一次執行其程序,其余處理器處于空閑狀態;接到處理器1執行完成的信息后,同時向處理器1、2發出指令,處理器1第2次執行計算,同時處理器2第1次執行計算,其余處理器處于空閑狀態;在接到其中一個處理器完成信息時,同步等待,在兩個處理器都執行完后,向處理器1、2、3同時發出指令,各自執行其程序……。經過若干個周期后,所有處理器都于工作狀態,直至迭代結束,各處理器依次停止工作。
以上所設計的并行算法與原有算法相比,其區別在于采用了并行的思想,使各階核值的估算過程可以并行執行。而且,對于串行的辨識算法而言,每次核值估算都要進行輸入觀測向量的構造,對于并行算法來說,第二階核值的第一次估算,可以直接讀取第一階第一次估算時所構造的輸入觀測向量,而不用重復構造,依次類推。對于在單個PC機上設計并行算法的仿真程序時,可以在第n次構造完輸入觀測向量時,完成第一階核的第n次估算,第二階核的第n-1次估算……直至完成所有核的估算,而不用重復構造輸入觀測向量。
下面以改進后的并行算法的思想為基礎,設計Matlab程序對算法進行驗證。
設非線性系統由以下方程給出:

系統輸入使用隨機白噪聲信號,采用二階Volterra級數模型對該未知非線性系統進行建模。Volterra級數的記憶長度為3,學習因子取值為:μ1=0.03, μ2=0.006。
以下是該算法對一、二階核的部分辨識結果與真值的比較:

表1 辨識結果與真值對照表
由所得數據可以看出,辨識結果與真值非常接近,達到了較高的辨識精度。
圖3是h1(0)、h2(0,0)的收斂曲線,只需經過約150次迭代,兩個核參數都可達到穩定狀態。

圖3 h1(0)、h2(0,0)的收斂曲線(并行算法)
由于該并行算法是對串行算法的直接并行,未改變原算法的基本屬性,所以,各方面性能繼承了原算法的優點,與串行算法有著同樣的穩態精度和收斂速度,且穩態收斂過程平穩,表明該并行算法具有良好的實用性。
表2中列出了兩種算法的仿真運行時間。為了獲得兩種算法在同等條件下的比較,在同一Matlab窗口下運行兩個程序,分別用tic命令啟動秒表計時器,用toc命令讀取秒表計時器,以得到各自的運行時間。由表2中可以看出,在Matlab程序下,并行算法比串行算法平均節省時間19.92%。

表2 仿真時間對比
按照這一算法思想所編的并行程序,在并行機上運行時將會更大程度地節省時間,這對于提高算法的在線運行速度非常有效。