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