天天看點

matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...

本帖最後由 black1man 于 2018-11-29 23:57 編輯

我先說下我的仿真:

是對一個船舶系統進行反步滑模控制,其中simulink仿真中的閉環控制可以完美收斂,可是同樣用m檔案來做,卻是徹底的發散。

(需要說一下,開環的情況下,simulink和m檔案的仿真結果完全一緻,隻有在閉環情況下,一個收斂,一個發散)

請問:是我的m檔案哪裡編的不對嗎?為什麼會出現這種情況。程式和simulink都傳到了附件裡。

研究了一個晚上,完全沒有發現問題所在,腦子都懵了,不知道哪裡犯了錯誤,希望有朋友指點迷津。謝謝!

我把m檔案貼了出來貼出來:(附件裡有simulink和m程式,可以下載下傳後直接運作)

clear;clc;format long;

T = 0.5; count = 200; step_T = 2;    %周期,周期數,周期步數

h = T/step_T;

%% 船體資料

M = 1e9* [ 0.0068 0 0; 0 0.0113 -0.0340 ; 0 -0.0340 4.4524];

D =  1e8* [0.0008 0 0 ; 0 0.0025 -0.0203 ; 0 -0.0203 3.8481];

L1=diag([0.22;0.22;22]); L2=diag([4e6;10e6;900e6]);   % 反步法的增益

omega_bar=[5e6;5e6;5e6];                                              % 幹擾的上限

%% 變量初始化

eta=[10;10;1];

eta = J_func(eta);      %弧度轉換到[-pi,pi]之間

nu= [0;0;0];

omega=[0;0;0];         %幹擾

tau=[0;0;0];               %控制力

etad=[0;0;0];             %期望值

detad=[0;0;0];           %期望值的一次導

ddetad=[0;0;0];         %期望值的二次導

%% 畫圖

t_draw = zeros(1,count);

eta_draw = zeros(3,count);

omega_draw=zeros(3,count);

%% 主循環

for i = 1:1:count                      %主循環

t = (i-1)*T;

t_draw(i)    = t;              %       eta = J_func(eta);      %弧度轉換到[-pi,pi]之間

eta_draw(:,i) = eta;

%% 幹擾

omega = 4.85e6*[1+0.01*sin(0.01*t)+0.02*cos(0.2*t)*sin(0.01*t);

1+0.01*sin(0.01*t)+0.02*cos(0.2*t)*sin(0.01*t);

1+0.01*sin(0.01*t)+0.02*cos(0.2*t)*sin(0.01*t)];

omega_draw(:,i)=omega;

%% 控制

tau= tau_func(L1,L2,eta,nu,etad,detad,ddetad,M,D,omega_bar);

%% 船模

for j = 1:1:step_T                 %次循環 四階龍格庫塔

keta1= deta(eta,nu);

knu1 = dnu(M,D,nu,omega,tau);

keta2= deta(eta+h/2*keta1,nu+h/2*knu1);

knu2 = dnu(M,D,nu+h/2*knu1,omega,tau);

keta3= deta(eta+h/2*keta2,nu+h/2*knu2);

knu3 = dnu(M,D,nu+h/2*knu2,omega,tau);

keta4= deta(eta+h*keta3,nu+h*knu3);

knu4 = dnu(M,D,nu+h*knu3,omega,tau);

eta = eta + h/6*(keta1 + 2*keta2 + 2*keta3 + keta4);

nu  = nu +  h/6*(knu1 + 2*knu2 + 2*knu3 + knu4);

end

end

%% 畫圖

figure(1)

subplot(3,1,1)

plot(t_draw,eta_draw(1,:),'LineWidth',2);

subplot(3,1,2)

plot(t_draw,eta_draw(2,:),'LineWidth',2);

subplot(3,1,3)

plot(t_draw,eta_draw(3,:),'LineWidth',2);

figure(3)

plot(eta_draw(1,:),eta_draw(2,:),'LineWidth',2);

figure(2)             % 幹擾

subplot(3,1,1)

plot(t_draw,omega_draw(1,:),'LineWidth',2);

subplot(3,1,2)

plot(t_draw,omega_draw(2,:),'LineWidth',2);

subplot(3,1,3)

plot(t_draw,omega_draw(3,:),'LineWidth',2);

%——————————————————————————

%以下是子函數

%——————————————————————————

function A = J_func(eta)%将[pi,3pi]和[-3pi,-pi]之間的轉到-pi到pi之間

if eta(3)>pi

eta(3) = eta(3)-2*pi;

else if eta(3)

eta(3) = eta(3)+2*pi;

end

end

A = eta;

%————————————————————

function A =dnu(M,D,nu,omega,tau)

A = M\tau - M\D*nu + M\omega;

%————————————————————

function A = deta(eta,nu)

psi=eta(3);

J=[cos(psi),-sin(psi),0;

sin(psi),cos(psi),0;

0,0,1];

A=J*nu;

%————————————————————

function A =  tau_func(L1,L2,eta,nu,etad,detad,ddetad,M,D,omega_bar)

psi=eta(3);

J=[cos(psi),-sin(psi),0;

sin(psi),cos(psi),0;

0,0,1];

dJT= [-sin(psi), cos(psi),0;

-cos(psi),-sin(psi),0;

0,0,0];

z1=eta-etad;

dz1=J*nu-detad;

nud=J'*(detad-L1*z1);

dnud= dJT*(detad-L1*z1)+J'*(ddetad-L1*dz1);

z2=nu-nud;

s=z2;

A= D*nu +M*dnud-diag(sign(s))*omega_bar-L2*s-J'*z1;

untitled.jpg

(46.38 KB, 下載下傳次數: 0)

2018-11-29 23:30 上傳

matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...
matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...

simulink仿真閉環系統

matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...

untitled1.jpg

(50.65 KB, 下載下傳次數: 0)

2018-11-29 23:33 上傳

matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...
matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...

m檔案閉環仿真

matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...

untitled2.jpg

(57.09 KB, 下載下傳次數: 0)

2018-11-29 23:34 上傳

matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...
matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...

m檔案開環仿真

matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...

untitled3.jpg

(64.61 KB, 下載下傳次數: 0)

2018-11-29 23:36 上傳

matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...
matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...

simulink的開環仿真

matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...
matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...

2018-11-29 23:27 上傳

點選檔案名下載下傳附件

2.21 KB, 下載下傳次數: 17

matlab仿真限幅發散,simulink仿真收斂,但用m檔案實作卻是發散的,是怎麼回事?...

2018-11-29 23:27 上傳

點選檔案名下載下傳附件

1.38 MB, 下載下傳次數: 26