基於Matlab的最小方差控制仿真

close all;
clear all; 
clc;

%*********************系統初始化*********************%
a=[1 -1.7 0.7]; b=[1 0.5]; c=[1 0.2]; k=4; %對象參數,k爲延時參數
na=length(a)-1; nb=length(b)-1; nc=length(c)-1; %na、nb、nc爲多項式A、B、C階次
nf=nb+k-1; %nf爲多項式F的階次

K=400; %控制步數
ut=zeros(k+nb,1); %輸入歷史的初值,u(k-1),u(k-2)···u(k-d-nb);以下同理
yt=zeros(na,1); %輸出歷史的初值
yrt=zeros(nc,1); %期望輸出歷史的初值
wt=zeros(nc,1); %白噪聲歷史的初值
yr=10*[ones(K/2,1);-ones(K/2+k,1)];%期望輸出
w=sqrt(0.1)*randn(K,1); %白噪聲序列

[d,f,e]=sindiophantine(a,b,c,k); %求解單步Diophantine方程(函數內容見下一篇文章)

%*********************迭代控制過程*********************%
for t=1:K
    y(t)=-a(2:na+1)*yt+b*ut(k:k+nb)+c*[w(t);wt];%採集輸出數據
    
    %求控制量u(k)=[C(Z)*yr(k+d)-E(Z)*y(k)]/[B(Z)*D(Z)]       
    u(t)=(-f(2:nf+1)*ut(1:nf)+c*[yr(t+k:-1:t+k-min(k,nc));yrt(1:nc-k)]-e*[y(t);yt(1:na-1)])/f(1);
    
    %更新數據
    for i=k+nb:-1:2
        ut(i)=ut(i-1);
    end
    ut(1)=u(t);
    
    for i=na:-1:2
        yt(i)=yt(i-1);
    end
    yt(1)=y(t);
    
    for i=nc:-1:2
        yrt(i)=yrt(i-1);
        wt(i)=wt(i-1);
    end
    if nc>0
        yrt(1)=yr(t);
        wt(1)=w(t);
    end
    
end

%*********************顯示圖像*********************%
subplot(2,1,1);
plot([1:K],yr(1:K),'r',[1:K],y);
xlabel('k'); ylabel('y_r(k),y(k)');
legend('y_r(k)','y(k)');
subplot(2,1,2);
plot([1:K],u);
xlabel('k'); ylabel('u(k)');

發佈了21 篇原創文章 · 獲贊 24 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章