你做一下参考(做的是上海生产总值的灰色预测,画图等细节按照题目不同,写法不同,但基本思路就是如下):
数据预处理:
function [x0 c]=firstDo(x0)
n=length(x0);
m=0;
minX=exp(-2/(n+1));
maxX=exp(2/(n+1));
for c=0:1:2*max(x0)
y0=x0+c;
for k=2:n
lan=y0(k-1)/y0(k);
if lan<minX||lan>maxX
m=m+1;
break;
end
end
if m==0
break;
end
m=0;
end
x0=y0;
if c~=0
disp(c);
end
灰色预测以及检验:
function myGM(x0,x00)
[x0 c]=firstDo(x0);%数据预处理
if size(x0,2)>1
x0=x0';
end
n=length(x0);
x1=zeros(n,1);
x1(1)=x0(1);
for i=2:n
x1(i)=x1(i-1)+x0(i);
end
for i=1:n-1
z(i)=0.5*(x1(i)+x1(i+1));
end
z=z';
y=x0;
y(1)=[];
B=[-z ones(n-1,1)];
au=inv(B'*B)*B'*y;
syms t;
a=au(1);u=au(2);
gmFun=(x0(1)-u/a)*exp(-a*t)+u/a;
gmFun1=vpa((x0(1)-u/a),2)*exp(-vpa(a,2)*t)+vpa(u/a,2);
funStr=latex(gmFun1);
fprintf('\n');
fprintf('函数表达式代码:\n');disp(funStr);
fprintf('\n');
X1(1)=x0(1);
X0(1)=x0(1);
for i=1:n
X1(i+1)=subs(gmFun,t,i);
X0(i+1)=X1(i+1)-X1(i);
end
X0(n+1)=[];X0=X0';X0true=X0-c;
er=X0-x0;
q=er./x0;
disp('方差比C:');C=std(er)/std(x0);disp(C);
disp('小误差概率P:');P=length(find(abs(er)<0.6745*std(x0)))/n;disp(P);
for i=n:(n+7)
X1(i+1)=subs(gmFun,t,i);
X0(i+1)=X1(i+1)-X1(i);
end
X0(n+8)=[];
X0true=X0-c;
disp('预测值');disp(X0true);
years=1990:2010;
x0true=[x0-c;x00];
figure,plot(years,x0true,'*',years,X0true);
xlabel('年份');
ylabel('亿元');
hold on ;