数学建模社区-数学中国
标题:
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% ~. A
for 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 M
for j=1
N-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/ p
x=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# E
global 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$ c
B(:,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, R
b=A(2,1); %求参数b
& X6 r% J. G5 N6 F! W
f=(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 ?' w
GM1.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 x
x1=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& V
x0(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- {, B
r=x0./x1;
9 \# o5 A% `* d8 h& A. S
for j=2
N-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) q
for l=1
N-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
end
9 G8 @- N% ~2 U$ T0 z' s" W
end
6 F" S1 f$ Q5 C# }7 i/ H
J=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 L
GM2.m
0 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! ]
end
2 t2 w+ o1 z( r( E; _5 Y
x2=[]; %累加生成数列均值生成数列
0 {+ U, r8 i' B- ?8 Y
for j=1
N-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 O
end
; 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 z
GM3.m
+ e; i3 p( |6 x) k4 ?& c8 n
%该程序实现G(1,1)模型的精度检验
) n0 }: h* A6 \/ b
%包括平均相对误差,绝对关联度,均方差比值,小误差概率检验
4 }/ K+ q: _" v7 c% x
function 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 n
x(1)=x0(1); %更正第一个估计值
6 m c1 V# L# N8 t' I! t" @0 k) x5 \
disp('模型模拟估计值为')
" o+ n' b: D1 N+ @; x6 d
x
* v! c& a+ ? b f1 @# l
A=x-x0; %计算绝对残差序列
& m1 H* n- F+ m Q' X1 W
disp('模型估计值绝对残差序列为:')
. r) Y8 }8 a- A: p
A
) 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, m
disp('模型估计值相对误差序列为:')
( K9 L ~# g4 g# F: g$ b7 a3 q
B
7 o8 ~. B2 S) p& u; V" U
P=sum(abs(B))/N; %计算平均相对误差
" U8 v7 ~2 T) M7 a/ y2 B( H
disp('模型估计值平均相对误差为:')
: p; j+ O, n# [) k
P
/ 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
end
4 j* q! M: Y3 H8 b
R=sum(D)/N;
+ B0 I) C9 _4 U
disp('关联度为:')
& 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 c
S1=(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# t
S2=(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 N
C
$ f1 T4 v( l; N. c2 k! G
S0=0.6745*S1;
2 K5 Y2 t/ c( @' i
E=A-A_;
; l1 w8 u. p5 y/ U g" V* J
F=find(E<S0);
. ?1 p, p; v9 S; t) e9 `5 K
M=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" B
p
( 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