⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 work.m

📁 matlab系统辨识实现
💻 M
📖 第 1 页 / 共 2 页
字号:
function varargout = work(varargin)
% WORK M-file for work.fig
%      WORK, by itself, creates a new WORK or raises the existing
%      singleton*.
%
%      H = WORK returns the handle to a new WORK or the handle to
%      the existing singleton*.
%
%      WORK('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in WORK.M with the given input arguments.
%
%      WORK('Property','Value',...) creates a new WORK or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before work_OpeningFunction gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to work_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help work

% Last Modified by GUIDE v2.5 27-Jun-2006 23:03:32
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @work_OpeningFcn, ...
                   'gui_OutputFcn',  @work_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin & isstr(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

function work_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
set(handles.text65,'string','');
set(handles.text67,'string','');
set(handles.text68,'string','');
set(handles.text69,'string','');
set(handles.text70,'string','');
set(handles.text71,'string','');
set(handles.text72,'string','');
set(handles.text73,'string','');
set(handles.text74,'string','');
set(handles.text75,'string','');
set(handles.text76,'string','');
set(handles.text77,'string','');
set(handles.text78,'string','');
set(handles.text79,'string','');
set(handles.text80,'string','');
set(handles.text81,'string','');
set(handles.text83,'string','');
set(handles.text85,'string','');
set(handles.text88,'string','');
set(handles.text90,'string','');
set(handles.text92,'string','');
set(handles.text94,'string','');

function varargout = work_OutputFcn(hObject, eventdata, handles)

varargout{1} = handles.output;
% --- Executes during object creation, after setting all properties.function edit1_CreateFcn(hObject, eventdata, handles)if ispc    set(hObject,'BackgroundColor','white');else    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));endfunction edit1_Callback(hObject, eventdata, handles)% --- Executes on button press in pushbutton1.function pushbutton1_Callback(hObject, eventdata, handles)% 选择是模型1还是模型2
global SingleModel;
SingleModel = get(handles.popupmenu2,'Value'); 
%取样点数
global SampleNum;
SampleNum=str2num(get(handles.edit1,'String'));
%%%%蒙特卡洛法构造伪随机序列 ,因为递推最小二乘法需要用到观测点开始时刻前面的数据,故产生的序列数比取样点数多%%%
global RandomSignal;
  RandomSignal=zeros(1,SampleNum+50);

  I=zeros(1,SampleNum+60);
  I(1)=11;
  I(2)=9;
  m=2^50;
   for i=1:(SampleNum+50)      
      I(i+2)=mod((65539*I(i+1)+65539*I(i)),m);
        if I(i+1)<m/2
               RandomSignal(i)=-1;
             else
               RandomSignal(i)=1;
        end
   end
%%%%蒙特卡洛法构造伪随机序列 ,因为递推最小二乘法需要用到观测点开始时刻前面的数据,故产生的序列数比取样点数多%%%


%高斯噪声
global Gauss;
    Gauss=wgn(1,SampleNum+50,1,'real');  

%构造输入信号U    
global u;
    u=zeros(1,SampleNum);
       for i=1:SampleNum
         u(i)=RandomSignal(i+50);
       end 
%构造输入信号V 
global v ;
    v=zeros(1,SampleNum);
        for i=1:SampleNum
         v(i)=Gauss(i+50);
        end
       
 
%%显示输入信号U,伪随机序列
if(SingleModel==1)
   axes(handles.axes1);
   stairs(u);
   ylim([-1.5,1.5]);title('输入数据U(k),伪随机序列');Ylabel('U(k)');
   grid;
 end
%显示输入信号V,高斯白噪声
if(SingleModel==2)
      axes(handles.axes1);
    plot(v);
    ylim([-2.5,2.5]);title('输入数据V(k),高斯序列');Ylabel('V(k)')
    grid;
end

% --- Executes during object creation, after setting all properties.function popupmenu2_CreateFcn(hObject, eventdata, handles)if ispc    set(hObject,'BackgroundColor','white');else    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end% --- Executes on selection change in popupmenu2.function popupmenu2_Callback(hObject, eventdata, handles)function edit2_CreateFcn(hObject, eventdata, handles)if ispc    set(hObject,'BackgroundColor','white');else    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));endfunction edit2_Callback(hObject, eventdata, handles)% --- Executes during object creation, after setting all properties.function popupmenu3_CreateFcn(hObject, eventdata, handles)if ispc    set(hObject,'BackgroundColor','white');else    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end% --- Executes on selection change in popupmenu3.function popupmenu3_Callback(hObject, eventdata, handles)% hObject    handle to popupmenu3 (see GCBO)% --- Executes on button press in checkbox3.function checkbox3_Callback(hObject, eventdata, handles)function checkbox4_Callback(hObject, eventdata, handles)function checkbox5_Callback(hObject, eventdata, handles)


function pushbutton2_Callback(hObject, eventdata, handles)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%对输入输出信号的计算%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%输入信噪比global scale;
    scale=str2num(get(handles.edit2,'String'));

   
global  SampleNum;
global v;
global u;
global y;
    y=zeros(1,SampleNum);
global e;
    e=zeros(1,SampleNum);
global z;
    z=zeros(1,SampleNum);
global w;
    w=scale*v;
A=[0 1.0 0.5];
B=[1 -1.5 0.7];
C=[1 0 0];
D=B;
global ModelType;
ModelType=get(handles.popupmenu3,'Value');

%求理论输出信号
y=dlsim(A,B,u);
%Calculate noise single

%Calculate e(k) 
if(ModelType==1)
%模型1噪声
   e=dlsim(C,D,w);
end
if(ModelType==2)
%模型2噪声
    e=w;    
end
%实际输出
for i=1:SampleNum
    z(i)=y(i)+e(i);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%对输入输出信号的计算  完毕 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



axes(handles.axes2);
%%%%%%%%%%%%%%%选择要显示的信号绘图%%%%%%%%%%%%%%%%%
ETag=get(handles.checkbox3,'Value');

YTag=get(handles.checkbox4,'Value');

ZTag=get(handles.checkbox5,'Value');
if(ETag==1)
%噪声
         plot(e,'black');
         ylim([-15,15]);title('输出的数据e(k),y(k),z(k)');
    hold on;
 end
%理论输出
 if(YTag==1)
            plot(y,'red');title('输出的数据e(k),y(k),z(k)');
         ylim([-20,20]);
hold on;
 end
 %%实际输出
if(ZTag==1)
      plot(z);title('输出的数据e(k),y(k),z(k)');
    
     ylim([-20,20]);
     hold on
 end
    grid;
    hold off
%%%%%%%%%%%%%%%选择要显示的信号绘图  完毕%%%%%%%%%%%%%%%%%

function pushbutton3_Callback(hObject, eventdata, handles)
%模型的实际参数
A=[0 1.0 0.5];
B=[1 -1.5 0.7];
C=[1 0 0];
D=B;
global RandomSignal;
global SampleNum;
global scale;
global Gauss;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%这些是辨识系统所需要的信号,我们所看到的输出信号往前再取50个点%%%%%%%%%%%%%
global ww;
    ww=zeros(1,SampleNum+50);
    ww=scale*Gauss;

    ee=zeros(1,SampleNum+50);
global ModelType;
    ModelType=get(handles.popupmenu3,'Value');
   if (ModelType==1)
       ee=dlsim(C,D,ww);
   end
   if (ModelType==2)
       ee=ww;
   end

 
    yy=zeros(1,SampleNum+50);
    yy=dlsim(A,B,RandomSignal);    
 
    zz=zeros(1,SampleNum+50);
    for i=1:(SampleNum+50)
    zz(i)=yy(i)+ee(i);
    end
uu=zeros(1,SampleNum+50);  
uu=RandomSignal;
%%%%%%%%%这些是辨识系统所需要的信号,我们所看到的输出信号往前再取50个点%%%%%%%%%%%%%完毕%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%整批最小二乘计算%%%%%%%%%%%%%%%%%%%%%%%%

X=zeros(SampleNum,5);
Z=zeros(SampleNum,1);
for i=1:SampleNum
    X(i,1)=-zz(i+49);
    X(i,2)=-zz(i+48);
    X(i,3)=uu(i+50);
    X(i,4)=uu(i+49);
    X(i,5)=uu(i+48);
    Z(i,1)=zz(i+50);
end
    sita=zeros(5,1);
    sita=(inv(X'*X))*X'*Z;
    s=(sita-[-1.5 0.7 0 1 0.5]')'*(sita-[-1.5 0.7 0 1 0.5]');
%%%%%%%%计算完毕%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%输出结果%%%%%%%%
    set(handles.text67,'string',sita(1,1));
    set(handles.text68,'string',sita(2,1));
    set(handles.text69,'string',sita(3,1));
    set(handles.text70,'string',sita(4,1));
    set(handles.text71,'string',sita(5,1));    set(handles.text90,'string',s);% --- Executes on button press in pushbutton4.function pushbutton4_Callback(hObject, eventdata, handles)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%对输入输出信号的计算%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%输入信噪比
global scale;
    scale=str2num(get(handles.edit2,'String'));
global  SampleNum;
global v;
global u;
global y;
    y=zeros(1,SampleNum);
global e;
    e=zeros(1,SampleNum);
global z;
    z=zeros(1,SampleNum);
global w;
    w=scale*v;
A=[0 1.0 0.5];
B=[1 -1.5 0.7];
C=[1 0 0];
D=B;
global ModelType;
ModelType=get(handles.popupmenu3,'Value');

%求理论输出信号
y=dlsim(A,B,u);
%Calculate noise single

%Calculate e(k) 
if(ModelType==1)
%模型1噪声
   e=dlsim(C,D,w);
end
if(ModelType==2)
%模型2噪声
    e=w;    
end
%实际输出
for i=1:SampleNum
    z(i)=y(i)+e(i);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%对输入输出信号的计算  完毕 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%构造实际输入输出序列和理论输入输出序列%%%%%%%%%%%%%%
z1=[z' u'];
z2=[y u'];
 %计算模型阶次 
v1=arxstruc(z1,z2,struc(1:4,1:4,0:2));                     
 nn1=selstruc(v1,'aic');                   
%输出
 na={num2str(nn1(1))};
set(handles.text65,'String',na);
nb={num2str(nn1(2))};
set(handles.text88,'String',nb);function pushbutton5_Callback(hObject, eventdata, handles)
%%%%%%%%%%%%%%%%这些是辨识系统所需要的信号因为需要观察时刻前的数值,故往前再取50个点%%%%%%%%%%%%%
A=[0 1.0 0.5];
B=[1 -1.5 0.7];
C=[1 0 0];
D=B;
global RandomSignal;
global SampleNum;
global scale;
global Gauss;
 
    ww=zeros(1,SampleNum+50);
    ww=scale*Gauss;
 
    ee=zeros(1,SampleNum+50);
global ModelType;
    ModelType=get(handles.popupmenu3,'Value');
   if (ModelType==1)
       ee=dlsim(C,D,ww);
   end
   if (ModelType==2)
       ee=ww;
   end
 
    yy=zeros(1,SampleNum+50);
    yy=dlsim(A,B,RandomSignal);    
 
    zz=zeros(1,SampleNum+50);
    for i=1:(SampleNum+50)
    zz(i)=yy(i)+ee(i);
    end
uu=zeros(1,SampleNum+50);  
uu=RandomSignal;
%%%%%完毕%%%%%%%%这些是辨识系统所需要的信号因为需要观察时刻前的数值,故往前再取50个点%%%%%%%%%%%%%



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%递推最小二乘算法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
X=zeros(SampleNum,5);
Z=zeros(SampleNum,1);
%X赋初值
for i=1:SampleNum
    X(i,1)=-zz(i+49);
    X(i,2)=-zz(i+48);
    X(i,3)=uu(i+50);
    X(i,4)=uu(i+49);
    X(i,5)=uu(i+48);
    Z(i,1)=zz(i+50);
end
sita=zeros(5,1);
mv=zeros(5,1);       %%%中间变量
%整批算法,已经得到一个
counter=0;      
a1=zeros(1,SampleNum);
a2=zeros(1,SampleNum);
b0=zeros(1,SampleNum);
b1=zeros(1,SampleNum);
b2=zeros(1,SampleNum);

%直接给初值法
P=zeros(5,5);
gama=0;
E=eye(5);
arfa=10^6;
P=(arfa^2).*E;
epsitong=0.0001;

for i=1:SampleNum
    counter=i;    %%%计数器,计算跌代次数
    a1(i)=sita(1,1);
    a2(i)=sita(2,1);
    b0(i)=sita(3,1);
    b1(i)=sita(4,1);
    b2(i)=sita(5,1);
    gama=1/(1+X(i,:)*P*(X(i,:))');
    sita=mv+P*(X(i,:))'*gama*(Z(i,1)-X(i,:)*mv);
    P=P-P*(X(i,:))'*gama*X(i,:)*P;
    if (mv~=0)&(abs((sita-mv)./mv)<epsitong);
        break;
    end
    mv=sita;
end
    s=(sita-[-1.5 0.7 0 1 0.5]')'*(sita-[-1.5 0.7 0 1 0.5]');
%%完毕%%%%%%%%%%%%%%%%%%%%%%%递推最小二乘算法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%显示结果
    set(handles.text72,'string',sita(1,1));
    set(handles.text75,'string',sita(2,1));
    set(handles.text73,'string',sita(3,1));
    set(handles.text76,'string',sita(4,1));
    set(handles.text74,'string',sita(5,1));
    set(handles.text92,'string',s);
    set(handles.text83,'string', counter);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -