📄 work.m
字号:
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 + -