MATLAB 灰色模型GM(1,1)预测人口

clear
x0=[128453 129227 130765 129988 131448 132129 132802 133450 134091 135404];
pre_num=10;

n=length(x0);
disp('级比检验')
lambda=x0(1:end-1)./x0(2:end);
range=minmax(lambda)
x1=cumsum(x0);

z=0.5*(x1(2:end)+x1(1:end-1));
Y=x0(2:end)';
B=[-z(1:end)' ones(n-1,1)];
u=B\Y; %u=inv(B'*B)*B'*Y
a=u(1)
b=u(2)
x0_pre=[x0(1) ones(1,n+pre_num-1)];
for k=1:n-1+pre_num
x0_pre(k+1)=(x0(1)-b/a)*(exp(-a*k)-exp(-a*(k-1)));
end

err=[x0 - x0_pre(1:n)];
epsilon=abs(err)./x0(1:n).*100

disp('预测值')
disp(x0_pre)
disp('相对误差')
disp(epsilon)

t1=2002:2011;
t2=2002:2021;
plot(t1,x0,'d',t2,x0_pre,'LineWidth',2) %原始数据与预测数据的比较
xlabel('年份')
ylabel('人口')
此模型只能输入十年数据,然后预测十年。求大神修改或者直接给出新的函数。

第1个回答  推荐于2021-01-08
t1=2002:2021;
%n=10; %预测值10年
n1=length(t1);
pre_num1=n1;
for k=1:pre_num1-1
x0_pre1(k+1)=(x0(1)-b/a)*(exp(-a*k)-exp(-a*(k-1)));
end
plot(t1,x0_pre1,'r-','LineWidth',2) %预测数据表
xlabel('年份');ylabel('人口总量');
legend('预测数据')追问

不用输原始数据么

追答

原始数据已经包含在内

追问

在哪?。。

本回答被网友采纳
相似回答