数学建模社区-数学中国

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

作者: 佛自业障    时间: 2018-10-31 09:23
标题: matlab 灰色系统预测 GM(1,1) 数学建模
本文代码主要是基于邓聚龙教授在20实际80年代提出的灰色系统理论。
! t  W+ E# a: o7 Z7 D" mGM0.m! u6 \: n4 o; P1 S/ p
%该函数为GM(1,1)模型返回还原值
$ w+ Y. z2 D; \+ n" V- ]function f=GM0(x0,t)  %数据数列 # t2 B+ n3 K7 T3 Z3 Y: p
[M,N]=size(x0);        %算出数据数列的大小 ; T9 g5 n% X$ H
x1(1)=x0(1);           %累加生成数列
0 b; _- I: H- ?: i: F. Zfor i=2:N;     
7 q+ v+ i' `) P. |3 ~9 W    x1(i)=x1(i-1)+x0(i); * @/ C3 x7 Z7 H, r% A" T' }8 O1 E
end+ Y1 o: _% \' q+ Y
x2=[];              %累加生成数列均值生成数列
4 y+ ]( z) F& E$ u8 Xfor j=1N-1);     ( E: f, H8 K; P% ]4 O7 z
    x2(j)=(x1(j)+x1(j+1))/2;
6 G7 v; J% W! A9 |end
5 [5 L" l# j/ q& N" vx=x0;              %数据数列镜像# O% D1 K' w) \' v! O: d
x(1)=[];           %删除第一个数据
( q1 n# b$ o6 E2 b4 T  cY=x';              %数据列向量 ) s9 a2 O; \) m2 ?: Y: T9 W. `- @
global a; 0 ^% j. d  H6 R" f
global b; , [( U2 S3 P% c0 \- z
B(:,1)=-x2';
" i4 X  U% _) y: l9 `3 e" @7 xB(:,2)=1; ' w6 ]' d7 e: e0 }6 [
A=inv(B'*B)*B'*Y;   %求参量a,b组成的参数向量
! _, y- _3 v+ U/ |9 aa=A(1,1);           %求参数a
0 x+ B- a& G/ `$ x) \  D2 ?b=A(2,1);           %求参数b  
, d. t' k+ L* @! rf=(1-exp(a))*(x0(1)-b/a)*exp(-a*(t-1));2 q/ D; {) N! [
f
5 n5 [, r% T- V. Z# ]* Y+ f/ {' j
$ z) s5 P& ~  lGM1.m:
0 H) {6 y* t4 s: S1 Q- `%该函数为GM(1,1)模型中数据数列进行光滑比检验 8 Q; Y( f3 j* e. T
function f=GM1(x0)   %数据数列
' S3 ?" F+ f  `, hN=max(size(x0));       %算出数据数列的大小  : G# l3 M- B' m3 y: i  u$ I2 `' D
x1=cumsum(x0);         %累加生成数列 7 U, A+ {0 V6 J; M0 a
global J; ! d, m& d! d7 s8 W- J6 L
global J1;/ P2 B# w4 ]6 h% ~
global J2; $ ?' P+ Y! J0 @& ?
x0(1)=[]; , K, N8 X; p7 O. W. h1 i
x1(N)=[]; " F- [3 }* t& ]% i" X2 N+ a
global r;: v4 ^5 G4 i4 M# {: e# E4 }
r=x0./x1;  
* H7 ?$ Y2 x) k, ]7 b) Cfor j=2N-1);           %判断数据数列是否满足准光滑条件1   
1 r- {& F1 X+ G$ V, r- v/ A' f   if(r(j)>=0.5||r(j)<0)         
6 b, k/ b, {3 |9 o       J1=0;         8 B# x* I9 A2 N$ m, ?
       break;     * x. |  ]# v! w: c% m
   else+ s/ N" y1 O0 c# w5 S
       J1=1;     
& K/ }% p+ K) l. I. s) Y   end  B  [& N2 t, s
end
& C9 a& I7 b& e0 F. d  H( Ifor l=1N-2);           %判断数据数列是否满足准光滑条件2     
/ F/ {2 G5 L8 N    if((r(l+1)/r(l))>=1)         
* r3 V9 `9 ^5 F) i7 T6 H7 q        J2=0;         ! Z$ p! ]4 ~" K: R" D( U
        break;     
8 k6 B, u3 ?+ I( g: w* N    else
. @0 x+ I, v& C7 b        J2=1;     
. j; M2 x' {; ?    end
4 ]4 |! h! z: pend+ ]( n$ X- A# }& U& E+ p
J=J1+J2;  
+ M% r! V# o6 ?if(J==2)                 %判断数据数列是否为准光滑数列     1 e1 ?6 }( G" F5 [: C' k8 D
    disp('数据为准光滑数列'); c4 B  l, ?+ s9 W: k
else7 |2 V* ]# c0 ]  Q% t& D  C- T
    disp('数据不是准光滑数列')
" e- A. n1 G( b# r4 qend
# F$ m" G7 k4 t! D1 ?/ }0 m
" s2 l; i. O' _$ f" c# A; dGM2.m
- Q: q2 ]9 w" U' U9 o%该函数为GM(1,1)模型还原值参数计算 ; R% a( b7 \" k2 A4 u, ^! N9 g
function f=GM2(x0)  %数据数列
7 |/ z4 h4 |9 i  ?0 ?% E[M,N]=size(x0);      %算出数据数列的大小  4 J! d7 d- v, F. w
x1(1)=x0(1);         %累加生成数列 ' W" m, @( F: W( l: M, w7 i
for i=2:N;      % j9 a5 y( u& V1 E4 q* P
    x1(i)=x1(i-1)+x0(i);
& s6 j% \% i: b; Hend
4 m% o2 b* q; E' W3 xx2=[];              %累加生成数列均值生成数列 5 z5 `) x3 r  g# @
for j=1N-1);      0 p1 \) F3 @' x) [! t
    x2(j)=(x1(j)+x1(j+1))/2;1 X7 S# F8 W* Z) s. Y
end" S5 w" }7 k8 V4 D0 T
  x=x0;              %数据数列镜像      0 D% M5 t1 l2 B9 G3 X9 G
  x(1)=[];           %删除第一个数据
- P2 H5 H! V' P9 v+ ]0 |! [  Y=x';              %数据列向量 0 a9 ]% C( H3 J# h
  global a; 7 g% q2 ]5 m/ i- G- B+ d
  global b;
8 W* m/ |" _6 M  B(:,1)=-x2';
3 Y; `. z9 f$ |2 {  B(:,2)=1;  
* G( u% E% [$ S3 _5 c4 F  A=inv(B'*B)*B'*Y;   %求参量a,b组成的参数向量
4 O$ G+ w4 P% P  a=A(1,1);           %求参数a 7 d* a- d/ ^8 l8 q4 [
  disp('参数a为:')
! N1 M& T) B5 N+ V3 }  a
' X  S( ?0 I2 ~. V2 @$ y  b=A(2,1);           %求参数b ) T. |( m) g( b6 E* e
  disp('参数b为:') : `' S# ]$ Q7 T& u5 w9 f* m' u
  b
7 l" Q# X+ P  V- F# k. p. H2 K+ L% K3 L7 k8 H, ~
GM3.m5 @- |! \9 H3 U# D0 K
%该程序实现G(1,1)模型的精度检验
/ k0 k8 A9 R5 j4 v( d' B%包括平均相对误差,绝对关联度,均方差比值,小误差概率检验
& _/ j+ r: a9 P5 p% Z1 g3 ifunction f=GM3(x0) ( E8 o$ k$ K3 P
N=max(size(x0)); 2 N; F% |% b! \% `
x=GM0(x0,1:N);  %利用已有程序GM2得出数据列模型估计值 ) V' \. V4 e0 L2 Y4 f
x(1)=x0(1);     %更正第一个估计值 ; i3 c* k% r0 L% z: i
disp('模型模拟估计值为')
; H, Q" F1 r: \/ E' `x
$ Z) H% b1 _# u, w8 T( g1 {, y6 cA=x-x0;         %计算绝对残差序列
2 M) b+ i$ D+ _  cdisp('模型估计值绝对残差序列为:')
( I3 z5 [. t7 H4 i( ~3 uA
3 P/ ~; N5 H' W3 [# J0 Y. sG=abs(A); * [# u5 V8 G% X# t2 v. D
Amin=min(G);    %计算最小绝对值绝对残差 + _7 y2 T" L. d( s- y
Amax=max(G);    %计算最大绝对值绝对残差
- {( _8 s, ~% T. Q% KB=A./x0;        %计算相对误差序列
% ]9 I* ~' U5 v2 M$ p, W, v+ `disp('模型估计值相对误差序列为:')
6 W8 {# S' ~7 O2 |B  
5 ^0 Q+ o7 m  U9 J& w2 MP=sum(abs(B))/N;     %计算平均相对误差 + ~9 v6 P$ N9 C1 h) T' X
disp('模型估计值平均相对误差为:')
) c. i8 U5 G; ^+ fP  
- \* S; x3 x+ Q$ mfor i=1:1:N       %通过循环计算关联系数序列     ; ^) @1 |8 g. L2 Q, d
    D(i)=(Amin+0.5*Amax)/(G(i)+0.5*Amax); 5 {0 ]( w3 y: D! M
end
4 ^# N& G5 o8 wR=sum(D)/N;  
7 u/ \  \/ m2 U$ ?' zdisp('关联度为:')
3 n+ Z8 f- H) u% Y# HR  % h2 D  _' Q2 x( {, }
x_=sum(x0)/N;    %计算数据的均值  + P) P4 D4 i- P: Z$ |3 F" a
S1=(sum((x0-x_).^2)/(N-1))^0.5;   %计算数据序列方均差' K5 j! b( m/ ~
A_=sum(A)/N;     %计算残差平均值  : G- q# t4 ?4 j. d" n/ f
S2=(sum((A-A_).^2)/(N-1))^0.5;    %计算残差序列方均差5 s, ~' ?7 Q! o' F' x6 Z1 W
C=S2/S1;         %计算方均差比值 ) ]9 b% ^; m$ L! i  @+ }  W
disp('均方差比值为:') 9 A5 P" y! S1 F" u- D: L! e
C  5 F: s$ \7 H9 T" D7 h# j4 F
S0=0.6745*S1;: ^! ?0 y7 k" k! P8 Z" K1 ]! x! }
E=A-A_; # n$ H, p7 l0 l% ?* g0 X9 y  b
F=find(E<S0); 9 w" n8 y8 Q# u" ^
M=max(size(F)); %计算小残差个数
9 x% ^' b# V# A0 |! Ip=M/N;          %计算小误差概率
. J% o: S4 S' Z  Q0 E8 u6 Edisp('小误差概率为:'), _# `' a/ m4 a2 t* r; e5 o
p
& o1 ~/ i# G' c% Z0 l  L' J$ Z+ N% O( b
& R2 O' W& M) I0 [: U3 _0 a6 G+ C
6 L$ H  P$ ^, O8 }  X+ _) B





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