登录论坛

查看完整版本 : GM(1,1)


lvlianggan
2008-11-07, 10:53
我写了一个GM(1,1)的求解函数,但是GM(1,1)只是计算行向量或是列向量,我现在想用这个函数计算一个矩阵中没一行的值,然后把计算出来的结果放到一个列向量里面,计算GM(1,1)函数测试通过,但是在记录到列向量的时候出错,请大家帮帮忙,谢谢!
代码:

gm.m

function gm(x0)
n=length(x0);
%由数列x0生成数列x1;
s=0;
for i=1:n
s=s+x0(i);
x1(i)=s;
end
%由数列x1生成矩阵B和Y;
for i=1:(n-1);
Q(i)=-(x1(i)+x1(i+1))/2;
end
M=ones(n-1,1);
B=[Q' M];
for i=1:(n-1);
C(i)=x0(i+1);
end
Y=C';
beta=inv(B'*B)*B'*Y;
%计算出a和u;
a=beta(1);
u=beta(2);
(x0(1)-u/a)*(1-exp(a))*exp(-a*3)


test.m

C=[0.8 0.9 0.6; 1.0 0.9 0.9;1 2 3];
f=zeros(3,1);

for a = 1: 3;
% eval(['X',num2str(a),'=','C(a,:)']);
% eval(['x',num2str(a),'=','gm(C(a,:))'])

f(:,1)= gm(C(a,:));

end

meatball1982
2008-11-07, 22:52
function [out]=gm(x0)
n=length(x0);
%由数列x0生成数列x1;
s=0;
for i=1:n
s=s+x0(i);
x1(i)=s;
end
%由数列x1生成矩阵B和Y;
for i=1:(n-1);
Q(i)=-(x1(i)+x1(i+1))/2;
end
M=ones(n-1,1);
B=[Q' M];
for i=1:(n-1);
C(i)=x0(i+1);
end
Y=C';
beta=inv(B'*B)*B'*Y;
%计算出a和u;
a=beta(1);
u=beta(2);
out=(x0(1)-u/a)*(1-exp(a))*exp(-a*3)

这是我写的一个GM11的函数程序,定义了一个输出。你的函数没有输出。

function [pre]=fun_GM11(X0,pre_num)
X1=cumsum(X0)
n=length(X0);
G(:,1)=-(X1(2:n)+X1(1:n-1))/2;
G(:,2)=ones(n-1,1);
Y(:,1)=X0(2:n);
pre=Y;
a1=inv(G'*G)*G'*Y;
a=a1(1);
u=a1(2);
X_pre(1)=X0(1);
for k=1:n-1+pre_num
X_pre(k+1)=(1-exp(a))*(X0(1)-u/a)*exp(-a*k);
end
pre=X_pre;

meatball1982
2008-11-07, 22:52
希望能有帮助。