数学建模社区-数学中国

标题: matlab 灰色系统预测 GM(1,1) 数学建模 [打印本页]

作者: 佛自业障    时间: 2018-10-31 09:23
标题: matlab 灰色系统预测 GM(1,1) 数学建模
本文代码主要是基于邓聚龙教授在20实际80年代提出的灰色系统理论。0 {0 l  ]  ~+ f& i" s
GM0.m
/ g4 r0 s) F5 T2 q7 C+ S  w%该函数为GM(1,1)模型返回还原值 4 `" D9 r7 m& H7 t# p1 d
function f=GM0(x0,t)  %数据数列 4 x5 x" u/ e! a9 K7 N
[M,N]=size(x0);        %算出数据数列的大小
$ {$ M. P: s! a- T2 D6 s% i# e" S, i7 \x1(1)=x0(1);           %累加生成数列
, r. j+ p! x( R4 g% ~. Afor i=2:N;     
) \, H% ^/ s, P! k& z4 N( r    x1(i)=x1(i-1)+x0(i); 6 C9 m+ D+ ~, R
end! m, \$ J( Q5 w1 ]
x2=[];              %累加生成数列均值生成数列
% N8 {7 O) k) a3 H8 Mfor j=1N-1);     
0 G! S3 O" q7 Y0 `3 P! d! N1 I    x2(j)=(x1(j)+x1(j+1))/2; % T% {9 ^7 m" x: o6 J
end
3 ~, Y3 Q) o6 g/ px=x0;              %数据数列镜像+ K/ `3 D8 C/ _' N4 c# r/ f
x(1)=[];           %删除第一个数据 5 k; L% u8 y6 [1 y! F6 v
Y=x';              %数据列向量
2 v& @1 b8 Q: g0 B# Eglobal a;
8 f/ ]4 r) Y/ e" |- Y: U9 ?global b; 0 p9 q% O. G5 j. C
B(:,1)=-x2';
5 N' P2 v/ {7 x9 b+ q$ cB(:,2)=1; 7 g0 d! X( C9 I' `: J5 R8 ]
A=inv(B'*B)*B'*Y;   %求参量a,b组成的参数向量 & Z7 r( f' S! x4 x$ b
a=A(1,1);           %求参数a
0 d. r' ]& t4 P- r, ?  T1 d, Rb=A(2,1);           %求参数b  
& X6 r% J. G5 N6 F! Wf=(1-exp(a))*(x0(1)-b/a)*exp(-a*(t-1));" H  g6 Y; B/ Q/ ^
f  |) `4 c3 b6 C) `

. C+ L: E6 ]6 L# J4 ?' wGM1.m:
4 Y, V0 x) P$ c' R/ s4 ?7 r9 b%该函数为GM(1,1)模型中数据数列进行光滑比检验
# T7 B  m; \" L: S6 b, |function f=GM1(x0)   %数据数列
/ _4 i8 j) w! k( L! u8 [N=max(size(x0));       %算出数据数列的大小  
9 R0 |* P1 H7 v  xx1=cumsum(x0);         %累加生成数列 . {6 e- f: A4 a" [- {( M7 y' o
global J; 6 S5 \: b& Z2 c, H& ?
global J1;
+ K" W  y, K' S7 u5 p8 \global J2;
1 @! k- \' {' W' N0 u- d& Vx0(1)=[]; " X& p9 Z1 ?* e9 ~' S+ U
x1(N)=[]; ) R$ E! D  O' o' }' I. i) P  G
global r;
' I# a  s+ n, Y! l6 Q- {, Br=x0./x1;  9 \# o5 A% `* d8 h& A. S
for j=2N-1);           %判断数据数列是否满足准光滑条件1   ! {5 ~! k- l: W
   if(r(j)>=0.5||r(j)<0)         
8 {: N  N" u( A4 Q       J1=0;         
7 t% _2 b! j) H, m) q$ g/ {       break;     
: X5 @9 I  [  @2 B   else
: H4 F7 ~+ ^+ ?, n. @9 {" U, }( C       J1=1;     0 f$ p# ~  h9 O' _
   end" d- x. T3 p6 P- H- \3 _
end
* e) X+ Y+ m" s" f4 z) qfor l=1N-2);           %判断数据数列是否满足准光滑条件2     
( R2 }; R8 o) ~7 x# e    if((r(l+1)/r(l))>=1)         9 E# n4 o. v1 v
        J2=0;         0 l( ^) {) K; v9 j
        break;     - \5 H8 I! s; y' Y
    else
5 R7 E4 z: E. U0 Z        J2=1;     % T/ r& ]2 R0 E: x, Y
    end9 G8 @- N% ~2 U$ T0 z' s" W
end
6 F" S1 f$ Q5 C# }7 i/ HJ=J1+J2;  
3 f8 A8 o1 C% _if(J==2)                 %判断数据数列是否为准光滑数列     $ C5 H2 Z4 o0 k9 G6 Y( R: i& k
    disp('数据为准光滑数列')+ U; U6 P% Q" A6 n- u+ Y
else
5 L1 Y% g1 t5 @: I" S* }    disp('数据不是准光滑数列') 1 \0 I4 v1 a1 R. c
end
4 {4 w6 \8 {. h8 l; H: `
1 f! q% m6 F0 l5 b$ e8 LGM2.m0 c9 r1 T" m: k7 I2 p$ k5 C1 d# X
%该函数为GM(1,1)模型还原值参数计算 , T# g; F$ D9 c$ k0 }
function f=GM2(x0)  %数据数列1 ^' t, a! I3 y. P6 g% k8 U* X
[M,N]=size(x0);      %算出数据数列的大小  # G% J& j# s& ?8 [/ `5 o+ }
x1(1)=x0(1);         %累加生成数列 : A# ^$ u+ d9 z/ t" {) r5 }
for i=2:N;      * n9 x! p, P# V
    x1(i)=x1(i-1)+x0(i);
" J3 `1 l5 p& V9 f! ]end2 t2 w+ o1 z( r( E; _5 Y
x2=[];              %累加生成数列均值生成数列
0 {+ U, r8 i' B- ?8 Yfor j=1N-1);      
* r- X3 b9 T; @7 W5 g& r% D    x2(j)=(x1(j)+x1(j+1))/2;
; T( B( G' ]0 N; C7 R0 Oend; M* p* l0 v( u+ n4 Z
  x=x0;              %数据数列镜像      0 U# V5 L5 F% o. M7 s+ y
  x(1)=[];           %删除第一个数据
9 ^# D! P8 F: y7 u  Y=x';              %数据列向量 2 l5 l* u" F+ O* i) x
  global a;
+ v' ?. [' h) O' z  global b;
  i+ C# E; X) k) Q6 i  B(:,1)=-x2'; 2 g# y+ Y& l: F# d* r# k6 X# O% Z
  B(:,2)=1;  1 {, K; S' [" e  _9 [: J3 B0 i
  A=inv(B'*B)*B'*Y;   %求参量a,b组成的参数向量
4 i5 P" q1 N: A. B+ ?* m) p( I  a=A(1,1);           %求参数a 9 l1 z6 }% N% e  z' a, X0 ?
  disp('参数a为:') , h0 Q, O) W+ R1 Y" G+ R( {
  a ! d) W5 T3 ~, H; I$ g( h
  b=A(2,1);           %求参数b 3 n7 h& g* d6 i- C* I& M, H
  disp('参数b为:')
2 b8 _. B* |' o9 b  b
5 H$ d4 W0 N5 o( T
3 Y" V. s+ V- g5 zGM3.m
+ e; i3 p( |6 x) k4 ?& c8 n%该程序实现G(1,1)模型的精度检验 ) n0 }: h* A6 \/ b
%包括平均相对误差,绝对关联度,均方差比值,小误差概率检验
4 }/ K+ q: _" v7 c% xfunction f=GM3(x0) 1 r$ r0 ?  e3 h! N5 w5 S. O
N=max(size(x0)); # Z5 m4 o! V  E! s2 _9 L1 C
x=GM0(x0,1:N);  %利用已有程序GM2得出数据列模型估计值
: h9 Z! Y0 G3 F4 ^; N7 U7 a0 nx(1)=x0(1);     %更正第一个估计值
6 m  c1 V# L# N8 t' I! t" @0 k) x5 \disp('模型模拟估计值为')
" o+ n' b: D1 N+ @; x6 dx * v! c& a+ ?  b  f1 @# l
A=x-x0;         %计算绝对残差序列 & m1 H* n- F+ m  Q' X1 W
disp('模型估计值绝对残差序列为:')
. r) Y8 }8 a- A: pA ) t- T4 [1 D$ c! l
G=abs(A); % t" n8 S- W5 a& Z! v/ O0 g1 d  z
Amin=min(G);    %计算最小绝对值绝对残差 3 q3 L& x& n4 `1 ~4 R( M
Amax=max(G);    %计算最大绝对值绝对残差 1 G4 r7 a1 J% W$ m3 m6 o* c
B=A./x0;        %计算相对误差序列
* |+ i" \0 P/ L4 E7 z  A, mdisp('模型估计值相对误差序列为:') ( K9 L  ~# g4 g# F: g$ b7 a3 q
B  
7 o8 ~. B2 S) p& u; V" UP=sum(abs(B))/N;     %计算平均相对误差 " U8 v7 ~2 T) M7 a/ y2 B( H
disp('模型估计值平均相对误差为:')
: p; j+ O, n# [) kP  / T- n! i1 P) a' r9 x3 k
for i=1:1:N       %通过循环计算关联系数序列     
; t3 p  c5 N7 Q0 U7 Q    D(i)=(Amin+0.5*Amax)/(G(i)+0.5*Amax); 8 A" X0 g; Z1 d+ B' Z; W& Q. F" n
end4 j* q! M: Y3 H8 b
R=sum(D)/N;  
+ B0 I) C9 _4 Udisp('关联度为:') & u, a9 K/ G$ J1 k% f: F
R  ' `! F1 Z- i1 @+ D( h
x_=sum(x0)/N;    %计算数据的均值  
8 [4 I( K9 x( ~. o* k  cS1=(sum((x0-x_).^2)/(N-1))^0.5;   %计算数据序列方均差( i6 B7 B% D' o6 V7 Q( Y
A_=sum(A)/N;     %计算残差平均值  
4 B6 S- g- N# tS2=(sum((A-A_).^2)/(N-1))^0.5;    %计算残差序列方均差7 k, u, h% n. B+ {1 M/ u7 D
C=S2/S1;         %计算方均差比值 & M2 E3 A* E% D- h5 ^4 |5 X
disp('均方差比值为:')
0 }0 O' s# @: R4 NC  
$ f1 T4 v( l; N. c2 k! GS0=0.6745*S1;
2 K5 Y2 t/ c( @' iE=A-A_; ; l1 w8 u. p5 y/ U  g" V* J
F=find(E<S0);
. ?1 p, p; v9 S; t) e9 `5 KM=max(size(F)); %计算小残差个数# u* i8 [( d' C, X# q
p=M/N;          %计算小误差概率 : G  S  u) V+ g0 O! B3 f9 I1 Q
disp('小误差概率为:')
: m5 O. Z7 H0 f3 k4 t8 e" Bp( W+ R: n: m1 a  C& i4 s
! X& e( R  d7 o& u

+ H/ B: B! T% q% ]7 P  E$ k# G& b0 o- A7 y' m  ]. }





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5