在做摩擦力辨識中,因為需要用對非線性模型的參數進行辨識,在上一篇博客中使用了非線性最小二乘的辨識方法,但是其辨識結果的精准度受辨識參數初值的選取影響很大,很容易陷入局部最優解,而不能得到全局最優解,所以使用遺傳算法來進行辨識,遺傳算法是可以得到全局最優解的。
最開始是自己編寫的遺傳算法程序來進行辨識,但是得到的結果有些瑕疵,所以嘗試使用MATLAB工具箱來做一次。下面是入門使用的方法(MATLAB版本是201b):
1. 打開MATLAB遺傳算法工具箱:(1)點擊狀態欄的APP;(2)找到Optimization並打開,如下圖所示:
在Solver后面的下拉框中,選擇遺傳算法:ga-Genetic Algorithm,下邊分別就遺傳算法的幾個步驟進行說明。
2. fitness function 適應度函數
在學習遺傳算法后我們知道中間一個步驟是需要確定適應度函數,而適應度函數一般是通過目標函數轉換而來,在一些解決函數最大值和最小值的問題中,可以直接把函數輸出作為目標函數和適應度函數。經過測試驗證,在改工具箱中,適應度函數的輸出結果越小標明越准確。下面介紹摩擦力模型及適應度函數:
我要辨識的摩擦力模型為:
需要辨識其中的 A,B,C 和 D 四個參數,通過實驗采集到的實際輸入數據 v 和輸出數據 F。因為工具箱要求的適應度函數是輸出結果趨小的,所以我這里選擇目標函數為適應度函數,如下:
其中
為辨識誤差。
將該目標函數以函數的形式寫到 MATLAB 的m文件中,如下:
% 使用遺傳算法工具箱的適應度函數 function result = steadyfitness(a) load SteadyData.mat; u = (up+abs(un))/2/4; Fi =u'; % 均勻實驗測得摩擦力的實測值 w = vd'; % 速度輸入值 N = size(w,1); for i = 1:1:N F_GA(i) = (a(1)+a(2)*exp(-(w(i)/a(3))^2))*sign(w(i)) + a(4)*w(i); Ji(i) = Fi(i) - F_GA(i); J(i) = 0.5*Ji(i)*Ji(i); end result = sum(J); end
而后將函數句柄 “@steadyfitness" 寫到工具箱界面的 fitness function 后面。
3. Number of variables:輸入參數個數
這里待辨識參數有A,B,C和D這四個,所以這里填寫 4。
4. bounds:辨識參數的上下界
此處設置為,Lower:[0 0 0 0],Upper:[0.5 0.5 0.1 0.5]。
5. 點擊 Start,開始遺傳算法求解
結束后結果會顯示在 Final point中
下圖見完整的配置:
6. 利用辨識參數的結果,繪制摩擦力模型
完結。
注:MATLAB工具箱的簡單使用,上述幾個步驟就夠用了,如果要修改默認算法部分,就要學習遺傳算法原理,修改工具箱右側的參數。