?? 文章首發(fā)于我的個人博客:歡迎大佬們來逛逛
數(shù)學建模:灰色預(yù)測模型
灰色預(yù)測
三個基本方法:
累加數(shù)列:計算一階累加生成數(shù)列
x ( 1 ) ( k ) = ∑ i = 1 k x ( 0 ) ( i ) , k = 1 , 2 , ? ? , n , x^{(1)}(k)=\sum_{i=1}^kx^{(0)}(i),k=1,2,\cdots,n, x(1)(k)=i=1∑k?x(0)(i),k=1,2,?,n,
累減數(shù)列:計算一階累減生成數(shù)列
x
(
0
)
(
k
)
=
x
(
1
)
(
k
)
?
x
(
1
)
(
k
?
1
)
,
k
=
2
,
3
,
?
?
,
n
,
x^{(0)}(k)=x^{(1)}(k)-x^{(1)}(k-1),k=2,3,\cdots,n,
x(0)(k)=x(1)(k)?x(1)(k?1),k=2,3,?,n,
加權(quán)累加:計算一階等權(quán)鄰接生成數(shù),圖片描述有誤,此處計算的是一次累加的加權(quán)鄰值生成
z ( 0 ) ( k ) = 0.5 x ( 1 ) ( k ) + 0.5 x ( 1 ) ( k ? 1 ) , k = 2 , 3 , ? ? , n , z^{(0)}(k)=0.5x^{(1)}(k)+0.5x^{(1)}(k-1),k=2,3,\cdots,n, z(0)(k)=0.5x(1)(k)+0.5x(1)(k?1),k=2,3,?,n,
算法步驟
- 進行級比檢驗,檢查是否滿足建立微分方程的前提條件。
λ ( k ) = x ( 0 ) ( k ? 1 ) x ( 0 ) ( k ) \lambda(k)=\frac{x^{(0)}(k-1)}{x^{(0)}(k)} λ(k)=x(0)(k)x(0)(k?1)?
- 對原數(shù)據(jù)做一次累加,計算加權(quán)鄰值生成數(shù)
- 構(gòu)造數(shù)據(jù)矩陣 B B B ,與數(shù)據(jù)向量 Y Y Y
B ? = [ ? 1 2 ( x ( 1 ) ( 1 ) + x ( 1 ) ( 2 ) ? 1 2 ( x ( 1 ) ( 2 ) + x ( 1 ) ( 3 ) ) 1 ? ? ? 1 2 ( x ( 1 ) ( n ? 1 ) + x ( 1 ) ( n ) ) ] , Y ? = [ x ( 0 ) ( 2 ) x ( 0 ) ( 3 ) ? x ( 0 ) ( n ) ] B~=\left[\begin{array}{ccccc}-\dfrac{1}{2}\big(x^{(1)}\big(1\big)+x^{(1)}\big(&2\big)&\\-\dfrac{1}{2}\big(x^{(1)}\big(2\big)+x^{(1)}\big(&3\big)&\big)&1\\&\vdots&&\vdots\\-\dfrac{1}{2}\big(x^{(1)}\big(n-1\big)+x^{(1)}\big(&n\big)&\big)&\end{array}\right],Y~=\left[\begin{array}{ccc}x^{(0)}\big(&2\big)\\x^{(0)}\big(&3\big)\\\vdots\\x^{(0)}\big(&n\big)\end{array}\right] B?= ??21?(x(1)(1)+x(1)(?21?(x(1)(2)+x(1)(?21?(x(1)(n?1)+x(1)(?2)3)?n)?))?1?? ?,Y?= ?x(0)(x(0)(?x(0)(?2)3)n)? ?
- 計算 a a a 與 b b b 的值
u ^ = ( a ^ , b ^ ) T = ( B T ? B ) ? 1 B T Y \hat{u}=(\hat{a},\hat)^T=(B^T\cdot B)^{-1}B^TY u^=(a^,b^)T=(BT?B)?1BTY
- 構(gòu)建模型
x ( 1 ) ( t ) = ( x ( 0 ) ( 1 ) ? b a ) e ? a ( t ? 1 ) + b a . x^{(1)}(t)=(x^{(0)}(1)-\frac ba)e^{-a(t-1)}+\frac ba. x(1)(t)=(x(0)(1)?ab?)e?a(t?1)+ab?.
- 計算生成模型值 x ^ ( 1 ) ( k ) \hat{x}^{(1)}(k) x^(1)(k) 和模型還原值 x ^ ( 0 ) ( k ) \hat{x}^{(0)}(k) x^(0)(k) 并且?guī)腩A(yù)測
x ^ ( 0 ) ( k ) = x ^ ( 1 ) ( k ) ? x ^ ( 1 ) ( k ? 1 ) \hat{x}^{(0)}(k)=\hat{x}^{(1)}(k)-\hat{x}^{(1)}(k-1) x^(0)(k)=x^(1)(k)?x^(1)(k?1)
- 檢驗預(yù)測值
文章來源:http://www.zghlxwxcb.cn/news/detail-700383.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-700383.html
代碼實現(xiàn)
%95至04年數(shù)據(jù)
clc;clear;
data = [174 179 183 189 207 234 220.5 256 270 285];
n = length(data);
%% 級比檢驗通過
check = [];
for k = 2:n
lambda(k) = data(k-1)/data(k);
if (exp(-2/(n+1))<lambda(k))&&(lambda(k)<exp(2/(n+1)))
check(end+1) = 1;
else check(end+1) = 0;
end
end
%% 計算累加數(shù)列
X1 = cumsum(data);
%% 計算加權(quán)
for i=2:n
z(i) = 0.5*(X1(i-1)+X1(i));
end
%% 數(shù)據(jù)矩陣B及數(shù)據(jù)向量Y
Y = data(2:n)';
B = [-z(2:n)',ones(n-1,1)];
u = (B'*B)\B'*Y;
% u = B\Y; 表示B的逆 乘以 Y
a = u(1,1);
b = u(2,1);
%% 構(gòu)造模型并且?guī)腩A(yù)測值
% 生成預(yù)測一次累加數(shù)列
f_X1 = [];
f_X0 = [];
for k=1:n-1
f_X1(1)=data(1);
f_X1(k+1) = (data(1)-b/a)*exp(-a*k) + b/a;
end
% 前綴和反推原始數(shù)據(jù)
for k=2:n
f_X0(1)=data(1);
f_X0(k)=f_X1(k)-f_X1(k-1);
end
%% 殘差檢驗 與 級比偏差值檢驗
for k=1:n-1
sigma(k)=abs((data(k)-f_X0(k))/data(k));
rho(k+1)=abs(1-((1-0.5*a)*lambda(k+1))/(1+0.5*a));
end
%% 預(yù)測下n個值
test = input('nums:');
nums = 5;
n=n+test;
f_f_X1 = [];
f_f_X0 = [];
for k=1:n-1
f_f_X1(1)=data(1);
f_f_X1(k+1) = (data(1)-b/a)*exp(-a*k) + b/a;
end
for k=2:n
f_f_X0(1)=data(1);
f_f_X0(k)=f_f_X1(k)-f_f_X1(k-1);
end
%% 繪圖
xAxis = 1995:2004;
xAxisPredict = 1995:1995+n-1;
h = plot(xAxis,data,'o',xAxisPredict,f_f_X0,'-');
set(gca, 'XScale', 'log', 'YScale', 'log');
set(h,'LineWidth',1.5);
到了這里,關(guān)于數(shù)學建模:灰色預(yù)測模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!