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

📄 mcgm.m

📁 基于泰勒级数的灰度预测
💻 M
字号:
function [Xmcgm,y,P1,ERROR]=mcgm(x)
nc=length(x);
k=0;
[y,e]=gm1(x,k) ;
%-------mcgm(1,1)----程序
  %%%----区间划分的边界点求取----- 分为4个区间
r=4;n=nc+k;
stats=zeros(1,r+1);
r1=0:r-1;
stats(end)=max(e);%避免舍入误差
stats(1:end-1)=min(e)+(max(e)-min(e))*r1/r;
L=stats(1:end-1);
U=stats(2:end);
for i=1:r+1
   Y(i,:)=y(1:n)-stats(i);
end

  %%% 寻找原始点所在的区域-----
ys=Y;
rate=zeros(r,nc);
for j=1:nc
   AAA={[ys(1,j),ys(2,j)] [ys(2,j),ys(3,j)] [ys(3,j),ys(4,j)] [ys(4,j),ys(5,j)]};%如果r要增加,这个地方需要修改
   for i=1:r      
      c=find((AAA{i}(1))>=x(j)&AAA{i}(2)<x(j));
      if c==1,rate(i,j)=1;end
   end
  %-----修正最下方数据点在区间端点时的情况--------
  c0=find((AAA{4}(2))>=x(j)&(AAA{4}(2))<=x(j));
  if c0==1,rate(i,j)=1; end                     
end
%----判断是否所有数据点都在区间内部-----------------
xc=sum(rate);
s=sum(sum(rate,2));
if s==nc
  sprintf('恭喜您! 所有原始点在划分区间内,总数据为%d个',n)
elseif s>n
  sprintf('数据点有重复计算,请检查')
else
 %s1=n-s;num=find(xc>=0&xc<=0);
    sprintf('注意! 有%d个原始点不在区间内,请进行处理,程序已停止',s1)
    %num
end
%---------转移概率的计算----- 转移概率为P1------
for i=1:nc
   c(i)=find(rate(:,i)>0);
end   
cc=5-c;
P0=zeros(4,4);
for i=1:18
    c1=cc(i);c2=cc(i+1);
    P0(c1,c2)= P0(c1,c2)+1;
end
sumP0=sum(P0,2);
for j=1:r
   if sumP0(j)==0
       P(j,:)=0;
   else
    P(j,:)=P0(j,:)/sumP0(j);
   end
end

ss=fliplr(-stats);
L1=ss(1:end-1);U1=ss(2:end);
vc=(U1+L1)/2;
P1=rot90(P,90);
YF=flipud(Y);
Xmcgm(1)=y(1);
for j=2:nc
 Xmcgm(j)=y(j)+vc*P1(cc(j),:)';
end
hold on
tt=1:n;
plot(tt,Y,1:nc,Xmcgm,'-.b') % 画出区间分布图, 需要加如注释语句
hold off
%%%%%-----误差分析---------------------
AEgm=abs(y(1:nc)-x');
AEmcgm=abs((Xmcgm(1:nc)-x'));
AMEgm=sum(AEgm)/nc;               %gm(1,1)的误差和
MSEgm=(y(1:nc)-x')*(y(1:nc)-x')'/n;%
MSEmcgm=(Xmcgm(1:nc)-x')*(Xmcgm(1:nc)-x')'/nc;
AMEmcgm=sum(AEmcgm)/nc;

ERROR=[MSEgm      AMEgm;MSEmcgm    AMEmcgm];

⌨️ 快捷键说明

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