为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

最小二乘法

2017-09-20 12页 doc 28KB 20阅读

用户头像

is_637320

暂无简介

举报
最小二乘法最小二乘法 假设一个SISO系统如下图所示: 图1 SISO系统结构图 其离散传递函数为: ?1?2?n?1bz?bz???bzB(z)12n G ( z ) ? ? (1) ?1A(z)1?a1z?1?a2z?2???anz?n?1 输入输出的关系为: u(k)?G(z?1)?e(k)?y(k) (2) 进一步,我们可以得到: 3) y(k)?A(z?1)?u(k)?B(z?1)?e(k) ( 其中,扰动量e(k)为均值为0,不相关的白噪声。 将式(3)写成差分方程的形式: y(k)??a1y(k?1)...
最小二乘法
最小二乘法 假设一个SISO系统如下图所示: 图1 SISO系统结构图 其离散传递函数为: ?1?2?n?1bz?bz???bzB(z)12n G ( z ) ? ? (1) ?1A(z)1?a1z?1?a2z?2???anz?n?1 输入输出的关系为: u(k)?G(z?1)?e(k)?y(k) (2) 进一步,我们可以得到: 3) y(k)?A(z?1)?u(k)?B(z?1)?e(k) ( 其中,扰动量e(k)为均值为0,不相关的白噪声。 将式(3)写成差分方程的形式: y(k)??a1y(k?1)?a2y(k?2)???any(k?n)?b1u(k?1)?b2u(k?2)??bnu(k?n)?e(k) (4) 令 ? (k)?[?y(k?1)?y(k?2)??y(k?n)u(k?1)u(k?2)?u(k?n)]T ??[a1a2?anb1b2?bn] 则式(4)可以写为: y(k)??T(k)??e(k) (5) 将上述式子扩展到N个输入、输出观测值{u(k),y(k)},k=1,2,?,N+n。 将其代入到式(5)中,写成矩阵的形式为: Y????e (6) 其中, Y?[y(n?1)y(n?2)?y(n?N)]T??y(1)u(n) ??y(2)u(n?1) ??? ??y(N)u(n?N)?u(1)??u(2)???????u(N)?e?[e(n?1)e(n?2)?e(n?N)]T?y(n?1)? ?y(n)??y(n?1)?y(n) ?????? ???y(n?N)?y(n?N?1) 取泛函J(?)为 N J(?)??(Y???)2??e2(n?i)?eT?e?(Y???)T(Y???) ?J??[(Y???)T(Y???)]?0????i?1 ??(?T?)T?TY 选取K=-8,T=50,n=4的系统传递函数; G?s?? ?8?50s?1?4 MATLAB仿真程序如下: 离散程序: clc; close all; clear all; DT=1; ST=1000; LP=ST/DT; K=-8; T=50; n=4; x(1:4)=0; for i=1:LP u0=rand(); x(1)=x(1)+(K*u0-x(1))/T*DT; x(2:4)=x(2:4)+(x(1:3)-x(2:4))/T*DT; y(i)=x(4); u(i)=u0; t(i)=i*DT; end plot(t,y,'k-') hold on; legend('系统输出') save ('lisanhua.mat'); MATLAB输出波形如下: clear all; load('lisanhua.mat') [N m]=size(y); if N<m N=m; end n=1; X=zeros(N-n,2*n); Y=zeros(N-n,1); for j=1:N-n for i=1:n X(j,i)=-y(j+n-i); X(j,i+n)=u(j+n-i); end Y(j,1)=y(j); end xita=inv(X'*X)*X'*Y; for tt=1:N-n y_cap(n+tt)=xita'*X(tt,:)'; end for j=1:N-n for i=1:n x_cap(i)=-y_cap(j+n-i); x_cap(n+i)=u(j+n-i); end y_cat(n+j)=xita'*x_cap'; end plot(t,y,'r-') hold on; plot(t,y_cat,'b--') hold on; legend('系统输出','辨识输出') 上述的程序是在n=1时的辨识输出,此时系统输出和辨识输出的波形如下: 当n=2时,此时系统输出和辨识输出的波形如下: 当n=3时,此时系统输出和辨识输出的波形如下: 当n=4和5时,此时系统输出和辨识输出的波形如下: 由上面的曲线可以看出,当n=1、2、3的时候,辨识出来的曲线能够和原系统的输出曲线有较好的拟合程度,当n继续增加时,辨识曲线渐渐偏离原系统的输出曲线。 水箱建模 一、 加载水箱数据,并对数据进行数据预处理,将数据进行平滑归零处理,加载水箱数据 后输出波形为: clc; clear all; close all; load('y_tt.mat') plot(tt,u);title('水箱数据输入'); hold on; plot(tt,y);title('水箱数据输出'); hold on; dt=tt(2)-tt(1) dt的输出值为2,说明计算步长为2,再根据水箱的数据输出波形 可知,当波形在800和2000附近输出值较为稳定,故可以取水箱的输入输出值在800到2000之间的数据进行数据归零、平滑等预处理。数据预处理的MATLAB程序如下: clc; clear all; close all; load('y_tt.mat') plot(tt,u);title('水箱数据输入'); hold on; plot(tt,y);title('水箱数据输出'); hold on; dt=tt(2)-tt(1) u=u(400:1000); y=y(400:1000); t=tt(400:1000)-400*dt;%时间归零 long=length(y); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%起始点归零%%%%%%%%%%%%%%%%%%%%%%%%%% y1=0; u1=0; for i=1:5 y1=y1+y(i); u1=u1+u(i); end y1=y1/5; % 起始点均值 u1=u1/5; % 起始点均值 for i=1:long y11(i)=y(i)-y1; u11(i)=u(i)-u1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%起始点归零%%%%%%%%%%%%%%%%%%%%%%%%%% for i=3:long-2 y11(i)=(y11(i-2)+y11(i-1)+y11(i)+y11(i+1)+y11(i+2))/5; end plot(t,u11,'k');title('预处理后输入'); hold on; plot(t,y11,'k');title('预处理后输出'); hold on; 预处理后的输出波形如下图: 可知,当波形在100和800附近输出值较为稳定,故可以取水箱的输入输出值在100到800之间的数据再进行数据归零处理。MATLAB程序如下: u=u11(53:400); y=y11(53:400); t=tt(53:400)-53*dt; plot(t,u,'k');title('处理数据输入'); hold on; plot(t,y,'k');title('处理数据输出'); hold on; 波形如下图: 波形仍然有点波动,在程序里再次进行光滑处理: u=u11(53:400); y=y11(53:400); t=tt(53:400)-53*dt; long1=length(y); for num=1:50 y1=0; u1=0; N=5; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%?eê?μ?1éá?%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for i=1:N y1=y1+y(i); u1=u1+u(i); end y1=y1/N; u1=u1/N; for i=1:long1 y12(i)=y(i)-y1; u12(i)=u(i)-u1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%?eê?μ?1éá?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for i=3:long1-2 y12(i)=(y12(i-2)+y12(i-1)+y12(i)+y12(i+1)+y12(i+2))/N; y(i)=y12(i); end end plot(t,u,'k');title('处理数据输入'); hold on; plot(t,y12,'k');title('处理数据输出'); hold on; save ('shuixiangData.mat') 最终波形为: 二、将处理后的数据保存下来以用于系统辨识,辨识程序如下: clc; clear all; close all; load ('shuixiangData.mat'); [lp,m]=size(y); if m>lp lp=m; end dt=t(2)-t(1); [ts,Mp,fai,tr,tp,ys,text]= value(y,dt); k=ys Point040=ys*0.4; Point080=ys*0.8; err(1:lp)=0; for i=1:lp err(i)=abs(y(i)-Point040); end [e40,pos1]=min(err); T40=pos1*dt; for i=1:lp err(i)=abs(y(i)-Point080); end [e80,pos2]=min(err); T80=(pos2+1)*dt; order=[1,2,3,4,5,6,7,8,9,10]; err_n(1:10)=0; for j=1:10 n1=(1.075*T40)/(T80-T40)+0.5; err_n(j)=abs(sqrt(order(j))-n1); end [en,pos_n]=min(err_n); n=pos_n T=(T40+T80)/(2.16*n) a=exp(-dt/T); b=1-a; x(1:n)=0; y1=[0]; for i=1:lp-1 x(1)=a*x(1)+b*ys*1; if n>1 x(2:n)=a*x(2:n)+b*x(1:n-1); end if n==1 y1=[y1 x(1)]; else y1=[y1 x(n)]; end end plot(t,y,'k-'); hold on; plot(t,y1,'r--'); 系统输出和辨识输出如下图: 参数辨识输出为: k = 0.4800 n = 1 T = 170.3704 三、用穷举法对系统数据进行参数寻优,MATLAB程序如下: DTA_L=0.1; DTA_H=1; D_DTA=0.05; Ti_L=140; Ti_H=240; D_Ti=1; Qmin=10^40; DTAbest=1; Tibest=200; for i=DTA_L:D_DTA:DTA_H for j=Ti_L:D_Ti:Ti_H [Q,DT,LP,t13,u13,y13]=O_obj(i,j,y12); if(Q<Qmin) Qmin=Q; DTAbest=i; Tibest=j; end end end [Q,DT,LP,t13,u13,y13]=O_obj(DTAbest,Tibest,y12); DTAbest Tibest plot(t13,y13) hold on; plot(t13,u13) hold on; 最终的输出曲线如下图: 参数输出为: DTAbest = 0.5000 Tibest = 188
/
本文档为【最小二乘法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索