-
灾变预测模型
这是某个地区降水量的数据,规定变量zeta < 320为灾年
计算用的matlab程序如下
clc, clear
%写出初始数据
a=[390.6, 412, 320, 559.2, 380.8, 542.4, 553, 310, 561, 300, 632,...
540, 406.2, 540, 406.2, 313.8, 576, 587.6, 318.5]';
t0=find(a<= 320);
n=length(t0);
%做累加运算
t1=cumsum(t0);
z1=0.5*t1(1:end-1)+0.5*t1(2:end);
%求出B矩阵
B=[-z1, ones(n-1, 1)];
Y=t0(2:end);
%左除法
r=B\Y;
y=dsolve('Dy+a*y=b', 'y(0)=y0');
%替换变量
y=subs(y, {'a','b','y0'}, {r(1), r(2), t1(1)} );
yucel=subs(y, 't', [0:n+1]);
%为了提高预测精度,先计算预测值,再显示微分方程的解
y=vpa(y, 6);
yuce=diff(yucel);
yuce=[t0(1), yuce]
yuce_new=yuce(n+1: end)
-
同样的一个类似的预测模型
代码如下
A=[83.0, 79.8,78.1,85.1,86.6,88.2,90.3,86.7,93.3,92.5,90.9,96.9;
101.7,85.1,87.8,91.6,93.4,94.5,97.4,99.5,104.2,102.3,101.0,123.5;
92.2,114.0,93.3,101.0,103.5,105.2,109.5,109.2,109.6,111.2,121.7,131.3;
105.0,125.7,106.6,116.0,117.6,118.0,121.7,118.7,120.2,127.8,121.8,121.9;
139.3,129.5,122.5,124.5,135.7,130.8,138.7,133.7,136.8,138.9,129.6,133.7;
137.5,135.3,133.0,133.4,142.8,141.6,142.9,147.3,159.6,162.1,153.5,155.9;
163.2,159.7,158.4,145.2,124,144.1,157.0,162.6,171.8,180.7,173.5, 176.5];
T=A(1:6, 1:12);
%对前六年求平均
x0=mean(T');
x1=zeros(size(x0));
n=length(x1);
x1(1)=x0(1);
%做一次累加求和
for i=2:n
x1(i)=x1(i-1)+x0(i);
end
z=zeros(size(x0));
af=0.4;
for i=2:n
z(i)=af*x1(i)+(1-af)*x1(i-1);
end
Y=zeros(n-1, 1);
B=zeros(n-1, 2);
%构造出B和Y矩阵,也就是灰色方程
for i=2:n
Y(i-1, 1)=x0(i);
B(i-1, 1)=-z(i);
B(i-1, 2)=1;
end
%计算(a, b)'
Para=inv(B'*B)*B'*Y;
a=Para(1);
b=Para(2);
%预测值
Pred=(x0(1)-b/a)*exp(-a*n)*(1-exp(a));
%预测第n+1年的数据
Total=12*Pred;
%估计各月所占比重
r=sum(T)/sum(sum(T));
%预测各个月销售量
Px=Total*r;
fprintf('输出203年预测值与实际值.\n');
for i=1:12
fprintf('%5d ', i);
end
fprintf('\n');
for i=1:12
fprintf('%6.1f', Px(i));
end
fprintf('\n');
for i=1:12
fprintf('%6.1f', A(7, i));
end
fprintf('\n');
Error=sum(Px(4:6))-sum(A(7, 4:6));
fprintf('2003年4,5,6月SARS导致减少销售额%6.2f亿元\n',Error);
%作图
subplot(2,1,1);
PA=[A(1,:),A(2,:),A(3,:),A(4,:),A(5,:),A(6,:),A(7,:)];
%变为一行数据
plot(PA);
grid on
title('原始数据');
subplot(2,1,2);
plot(1:12,A(7,:),'b*',1:12,Px,'r');
title('2003年对比数据'); grid on
最后得到的图形为