gusucode.com > 《模式识别与智能计算》matlab源代码 > 《模式识别与智能计算》matlab源代码/《模式识别与智能计算》部分函数的源程序/书程序/第13章/gm.m
function [a,y,s,delt]=gm(varargin) if nargin==2 xx1=varargin{2}; x=varargin{1}; else x=varargin{1}; end num=length(x); a=f(x); for i=1:num y(1,i)=(x(1)-a(2)/a(1))*exp(-a(1)*(i-1))+a(2)/a(1); if i>=2 y(2,i)=y(1,i)-y(1,i-1); y(3,i)=x(i)-y(2,i); y(4,i)=abs(y(3,i))/x(i)*100; end end s=y(3,2:end)*y(3,2:end)'; delt=mean(y(4,2:end),2); while delt>20 [t,flag]=f1(y(3,2:end)); t=t+1; if num-t>=4 t=num-4; x1=abs(y(2,t:end)); a1=f(x1); for i=1:num if i<t y(1,i)=(1-exp(a(1)))*(x(1)-a(2)/a(1))*exp(-a(1)*i); elseif i>=t temp=abs(a1(1)*(x1(1)-a1(2)/a1(1))); y(1,i)=(1-exp(a(1)))*(x(1)-a(2)/a(1))*exp(-a(1)*i)+flag*temp*exp(-a1(1)*(i-t)); end if i>=2 y(2,i)=y(1,i)-y(1,i-1); y(3,i)=abs(y(2,i))/x(i)*100; end end s=y(2,2:end)*y(2,2:end)'; delt=mean(y(3,2:end),2); else error('残差不可建模'); end end if (exist('a1','var')) a=a1; end if nargin==2 num=length(xx1); for i=1:num y(5,i)=(x(1)-a(2)/a(1))*exp(-a(1)*(xx1(i)-1))+a(2)/a(1); if i>=2 y(6,i)=y(5,i)-y(5,i-1); end end end function y=f(x) num=length(x); a=0;y1=[];b=[]; for i=1:num a=a+x(i); x1(i)=a; if i>=2 z(i)=0.5*(x1(i)+x1(i-1)); y1=[y1;x(i)]; b=[b;-z(i) 1]; end end y=inv(b'*b)*b'*y1; function [y,flag]=f1(x) l=length(x); for i=1:l if x(i)>0 x(i)=1; else x(i)=0; end end for i=1:l a=ones(1,l-i+1); b=zeros(1,l-i+1); if isequal(x(i:l),a)==1||isequal(x(i:l),b)==1 y=i; flag=sign(x(i)); break; else continue end end