2022.3.6总结非线性系统线性化方法,第五章
生活随笔
收集整理的這篇文章主要介紹了
2022.3.6总结非线性系统线性化方法,第五章
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
巨大的錯誤,因為符號導致無法求解
第二部分
第一種:存在參考系統的線性化方法
第二種:針對狀態軌跡的線性化方法
主要思想是:通過對系統施加持續不變的控制量,得到一條狀態軌跡,根據該狀態軌跡和系統實際狀態量的偏差設計線性模型預測控制算法。這種方法的優勢是不需要預先地導期望跟蹤路徑的狀態量和控制量。
非線性系統離散線性化方法(二)_更適合青年研究者的資源庫!公眾號:杰哥的無人駕駛便利店-CSDN博客_非線性系統離散化
?
function [sys,x0,str,ts] = chapter5_2_2(t,x,u,flag) % 該程序功能:用LTV MPC 和車輛簡化動力學模型(小角度假設)設計控制器,作為Simulink的控制器 % 程序版本 V1.0,MATLAB版本:R2011a,采用S函數的標準形式, % 程序編寫日期 2013.12.11 % 最近一次改寫 2013.12.16 % 狀態量=[y_dot,x_dot,phi,phi_dot,Y,X],控制量為前輪偏角delta_fswitch flag,case 0[sys,x0,str,ts] = mdlInitializeSizes; % Initializationcase 2sys = mdlUpdates(t,x,u); % Update discrete statescase 3sys = mdlOutputs(t,x,u); % Calculate outputs% case 4 % sys = mdlGetTimeOfNextVarHit(t,x,u); % Get next sample time case {1,4,9} % Unused flagssys = [];otherwiseerror(['unhandled flag = ',num2str(flag)]); % Error handling end % End of dsfunc.%============================================================== % Initialization %==============================================================function [sys,x0,str,ts] = mdlInitializeSizes% Call simsizes for a sizes structure, fill it in, and convert it % to a sizes array.sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = 6; sizes.NumOutputs = 1; sizes.NumInputs = 8; sizes.DirFeedthrough = 1; % Matrix D is non-empty. sizes.NumSampleTimes = 1; sys = simsizes(sizes); x0 =[0.001;0.0001;0.0001;0.00001;0.00001;0.00001]; global U; U=[0];%控制量初始化,這里面加了一個期望軌跡的輸出,如果去掉,U為一維的 % global x; % x = zeros(md.ne + md.pye + md.me + md.Hu*md.me,1); % Initialize the discrete states. str = []; % Set str to an empty matrix. ts = [0.02 0]; % sample time: [period, offset] %End of mdlInitializeSizes%============================================================== % Update the discrete states %============================================================== function sys = mdlUpdates(t,x,u)sys = x; %End of mdlUpdate.%============================================================== % Calculate outputs %============================================================== function sys = mdlOutputs(t,x,u)global a b; %global u_piao;global U;%global kesi;ticNx=6;%狀態量的個數Nu=1;%控制量的個數Ny=2;%輸出量的個數Np =20;%預測步長Nc=5;%控制步長Row=1000;%松弛因子權重fprintf('Update start, t=%6.3f\n',t)%輸入接口轉換,x_dot后面加一個非常小的數,是防止出現分母為零的情況% y_dot=u(1)/3.6-0.000000001*0.4786;%CarSim輸出的是km/h,轉換為m/sy_dot=u(1)/3.6;x_dot=u(2)/3.6+0.0001;%CarSim輸出的是km/h,轉換為m/sphi=u(3)*3.141592654/180; %CarSim輸出的為角度,角度轉換為弧度phi_dot=u(4)*3.141592654/180;Y=u(5);%單位為mX=u(6);%單位為米Y_dot=u(7);X_dot=u(8); %% 車輛參數輸入 %syms sf sr;%分別為前后車輪的滑移率,需要提供Sf=0.2; Sr=0.2; %syms lf lr;%前后車輪距離車輛質心的距離,車輛固有參數lf=1.232;lr=1.468; %syms C_cf C_cr C_lf C_lr;%分別為前后車輪的縱橫向側偏剛度,車輛固有參數Ccf=66900;Ccr=62700;Clf=66900;Clr=62700; %syms m g I;%m為車輛質量,g為重力加速度,I為車輛繞Z軸的轉動慣量,車輛固有參數m=1723;g=9.8;I=4175;%% 參考軌跡生成shape=2.4;%參數名稱,用于參考軌跡生成dx1=25;dx2=21.95;%沒有任何實際意義,只是參數名稱dy1=4.05;dy2=5.7;%沒有任何實際意義,只是參數名稱Xs1=27.19;Xs2=56.46;%參數名稱X_predict=zeros(Np,1);%用于保存預測時域內的縱向位置信息,這是計算期望軌跡的基礎phi_ref=zeros(Np,1);%用于保存預測時域內的期望軌跡Y_ref=zeros(Np,1);%用于保存預測時域內的期望軌跡% 以下計算kesi,即狀態量與控制量合在一起 kesi=zeros(Nx+Nu,1);kesi(1)=y_dot;%u(1)==X(1)kesi(2)=x_dot;%u(2)==X(2)kesi(3)=phi; %u(3)==X(3)kesi(4)=phi_dot;kesi(5)=Y;kesi(6)=X;kesi(7)=U(1);delta_f=U(1);fprintf('Update start, u(1)=%4.2f\n',U(1))T=0.02;%仿真步長T_all=20;%總的仿真時間,主要功能是防止計算期望軌跡越界%權重矩陣設置 Q_cell=cell(Np,Np);for i=1:1:Npfor j=1:1:Npif i==j%Q_cell{i,j}=[200 0;0 100;];Q_cell{i,j}=[2000 0;0 10000;];else Q_cell{i,j}=zeros(Ny,Ny); endend end %R=5*10^4*eye(Nu*Nc);R=5*10^5*eye(Nu*Nc);%最基本也最重要的矩陣,是控制器的基礎,采用動力學模型,該矩陣與車輛參數密切相關,通過對動力學方程求解雅克比矩陣得到a=[ 1 - (259200*T)/(1723*x_dot), -T*(phi_dot + (2*((460218*phi_dot)/5 - 62700*y_dot))/(1723*x_dot^2) - (133800*((154*phi_dot)/125 + y_dot))/(1723*x_dot^2)), 0, -T*(x_dot - 96228/(8615*x_dot)), 0, 0T*(phi_dot - (133800*delta_f)/(1723*x_dot)), (133800*T*delta_f*((154*phi_dot)/125 + y_dot))/(1723*x_dot^2) + 1, 0, T*(y_dot - (824208*delta_f)/(8615*x_dot)), 0, 00, 0, 1, T, 0, 0(33063689036759*T)/(7172595384320*x_dot), T*(((2321344006605451863*phi_dot)/8589934592000 - (6325188028897689*y_dot)/34359738368)/(4175*x_dot^2) + (5663914248162509*((154*phi_dot)/125 + y_dot))/(143451907686400*x_dot^2)), 0, 1 - (813165919007900927*T)/(7172595384320000*x_dot), 0, 0T*cos(phi), T*sin(phi), T*(x_dot*cos(phi) - y_dot*sin(phi)), 0, 1, 0-T*sin(phi), T*cos(phi), -T*(y_dot*cos(phi) + x_dot*sin(phi)), 0, 0, 1];b=[ 133800*T/1723T*((267600*delta_f)/1723 - (133800*((154*phi_dot)/125 + y_dot))/(1723*x_dot))05663914248162509*T/14345190768640000]; d_k=zeros(Nx,1);%計算偏差state_k1=zeros(Nx,1);%預測的下一時刻狀態量,用于計算偏差%以下即為根據離散非線性模型預測下一時刻狀態量%注意,為避免前后軸距的表達式(a,b)與控制器的a,b矩陣沖突,將前后軸距的表達式改為lf和lrstate_k1(1,1)=y_dot+T*(-x_dot*phi_dot+2*(Ccf*(delta_f-(y_dot+lf*phi_dot)/x_dot)+Ccr*(lr*phi_dot-y_dot)/x_dot)/m);state_k1(2,1)=x_dot+T*(y_dot*phi_dot+2*(Clf*Sf+Clr*Sr+Ccf*delta_f*(delta_f-(y_dot+phi_dot*lf)/x_dot))/m);state_k1(3,1)=phi+T*phi_dot;state_k1(4,1)=phi_dot+T*((2*lf*Ccf*(delta_f-(y_dot+lf*phi_dot)/x_dot)-2*lr*Ccr*(lr*phi_dot-y_dot)/x_dot)/I);state_k1(5,1)=Y+T*(x_dot*sin(phi)+y_dot*cos(phi));state_k1(6,1)=X+T*(x_dot*cos(phi)-y_dot*sin(phi));d_k=state_k1-a*kesi(1:6,1)-b*kesi(7,1);%根據falcone公式(2.11b)求得d(k,t)d_piao_k=zeros(Nx+Nu,1);%d_k的增廣形式,參考falcone(B,4c)d_piao_k(1:6,1)=d_k;d_piao_k(7,1)=0;A_cell=cell(2,2);B_cell=cell(2,1);A_cell{1,1}=a;A_cell{1,2}=b;A_cell{2,1}=zeros(Nu,Nx);A_cell{2,2}=eye(Nu);B_cell{1,1}=b;B_cell{2,1}=eye(Nu);%A=zeros(Nu+Nx,Nu+Nx);A=cell2mat(A_cell);B=cell2mat(B_cell);% C=[0 0 1 0 0 0 0;0 0 0 1 0 0 0;0 0 0 0 1 0 0;];%這是和輸出量緊密關聯的C=[0 0 1 0 0 0 0;0 0 0 0 1 0 0;];% 輸出質心側偏角度 和Y值%PSI : THETA GAMMA PHIPSI_cell=cell(Np,1);THETA_cell=cell(Np,Nc);GAMMA_cell=cell(Np,Np);PHI_cell=cell(Np,1);for p=1:1:NpPHI_cell{p,1}=d_piao_k;%理論上來說,這個是要實時更新的,但是為了簡便,這里又一次近似for q=1:1:Npif q<=pGAMMA_cell{p,q}=C*A^(p-q);else GAMMA_cell{p,q}=zeros(Ny,Nx+Nu);end endendfor j=1:1:NpPSI_cell{j,1}=C*A^j;for k=1:1:Ncif k<=jTHETA_cell{j,k}=C*A^(j-k)*B;else THETA_cell{j,k}=zeros(Ny,Nu);endendendPSI=cell2mat(PSI_cell);%size(PSI)=[Ny*Np Nx+Nu]THETA=cell2mat(THETA_cell);%size(THETA)=[Ny*Np Nu*Nc]GAMMA=cell2mat(GAMMA_cell);%大寫的GAMMAPHI=cell2mat(PHI_cell);Q=cell2mat(Q_cell);H_cell=cell(2,2);H_cell{1,1}=THETA'*Q*THETA+R;H_cell{1,2}=zeros(Nu*Nc,1);H_cell{2,1}=zeros(1,Nu*Nc);H_cell{2,2}=Row;H=cell2mat(H_cell);error_1=zeros(Ny*Np,1);Yita_ref_cell=cell(Np,1);for p=1:1:Npif t+p*T>T_allX_DOT=x_dot*cos(phi)-y_dot*sin(phi);%慣性坐標系下縱向速度X_predict(Np,1)=X+X_DOT*Np*T;%X_predict(Np,1)=X+X_dot*Np*t;z1=shape/dx1*(X_predict(Np,1)-Xs1)-shape/2;z2=shape/dx2*(X_predict(Np,1)-Xs2)-shape/2;Y_ref(p,1)=dy1/2*(1+tanh(z1))-dy2/2*(1+tanh(z2));phi_ref(p,1)=atan(dy1*(1/cosh(z1))^2*(1.2/dx1)-dy2*(1/cosh(z2))^2*(1.2/dx2));Yita_ref_cell{p,1}=[phi_ref(p,1);Y_ref(p,1)];elseX_DOT=x_dot*cos(phi)-y_dot*sin(phi);%慣性坐標系下縱向速度X_predict(p,1)=X+X_DOT*p*T;%首先計算出未來X的位置,X(t)=X+X_dot*tz1=shape/dx1*(X_predict(p,1)-Xs1)-shape/2;z2=shape/dx2*(X_predict(p,1)-Xs2)-shape/2;Y_ref(p,1)=dy1/2*(1+tanh(z1))-dy2/2*(1+tanh(z2));phi_ref(p,1)=atan(dy1*(1/cosh(z1))^2*(1.2/dx1)-dy2*(1/cosh(z2))^2*(1.2/dx2));Yita_ref_cell{p,1}=[phi_ref(p,1);Y_ref(p,1)];endendYita_ref=cell2mat(Yita_ref_cell);error_1=Yita_ref-PSI*kesi-GAMMA*PHI; %求偏差f_cell=cell(1,2);f_cell{1,1}=2*error_1'*Q*THETA;f_cell{1,2}=0; % f=(cell2mat(f_cell))';f=-cell2mat(f_cell);%% 以下為約束生成區域%控制量約束A_t=zeros(Nc,Nc);%見falcone論文 P181for p=1:1:Ncfor q=1:1:Ncif q<=p A_t(p,q)=1;else A_t(p,q)=0;endend end A_I=kron(A_t,eye(Nu));%求克羅內克積Ut=kron(ones(Nc,1),U(1));umin=-0.1744;%維數與控制變量的個數相同umax=0.1744;delta_umin=-0.0148*0.4;delta_umax=0.0148*0.4;Umin=kron(ones(Nc,1),umin);Umax=kron(ones(Nc,1),umax);%輸出量約束ycmax=[0.21;5];ycmin=[-0.3;-3];Ycmax=kron(ones(Np,1),ycmax);Ycmin=kron(ones(Np,1),ycmin);%結合控制量約束和輸出量約束A_cons_cell={A_I zeros(Nu*Nc,1);-A_I zeros(Nu*Nc,1);THETA zeros(Ny*Np,1);-THETA zeros(Ny*Np,1)};b_cons_cell={Umax-Ut;-Umin+Ut;Ycmax-PSI*kesi-GAMMA*PHI;-Ycmin+PSI*kesi+GAMMA*PHI};A_cons=cell2mat(A_cons_cell);%(求解方程)狀態量不等式約束增益矩陣,轉換為絕對值的取值范圍b_cons=cell2mat(b_cons_cell);%(求解方程)狀態量不等式約束的取值%狀態量約束M=10; delta_Umin=kron(ones(Nc,1),delta_umin);delta_Umax=kron(ones(Nc,1),delta_umax);lb=[delta_Umin;0];%(求解方程)狀態量下界,包含控制時域內控制增量和松弛因子ub=[delta_Umax;M];%(求解方程)狀態量上界,包含控制時域內控制增量和松弛因子%% 開始求解過程options = optimset('Algorithm','active-set');x_start=zeros(Nc+1,1);%加入一個起始點[X,fval,exitflag]=quadprog(H,f,A_cons,b_cons,[],[],lb,ub,x_start,options);fprintf('exitflag=%d\n',exitflag);fprintf('H=%4.2f\n',H(1,1));fprintf('f=%4.2f\n',f(1,1));%% 計算輸出u_piao=X(1);%得到控制增量U(1)=kesi(7,1)+u_piao;%當前時刻的控制量為上一刻時刻控制+控制增量%U(2)=Yita_ref(2);%輸出dphi_refsys= U;toc % End of mdlOutputs.總結
以上是生活随笔為你收集整理的2022.3.6总结非线性系统线性化方法,第五章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Robot Framework] 怎么
- 下一篇: 老骥伏羲,某讯遗产K3路由器2021年刷