Ⅰ 數學建模灰色預測程序代碼
這里寫了四個函數,方便在Matlab裡面調用,分別是GM(1,1),殘差GM(1,1),新陳代謝GM(1,1),Verhust自己寫得難免有所疏忽,需要的朋友自己找本書本來試驗一下。。
Gm(1,1)
function [px0,ab,rel]=gm11(x0,number)
%[px0,ab,rel]=gm11(x0,number)
%px0為預測數列,rel為平均相對誤差,rel為平均相對誤差(為百分比)
%默認的number參數為原數組大小
if nargin==1 %對輸入矩陣進行判斷,如不是一維列矩陣,進行轉置變換
number=max(size(x0));
end
n=max(size(x0)); %取輸入數據的樣本量
x1=zeros(size(x0));
for k=1:n
for i=1:k
x1(k)=x1(k)+x0(i); %計算累加值,並將值賦予矩陣be
end
end
z=zeros(size(x0));
for k=2:n
z(k)=0.5*(x1(k)+x1(k-1)); %計算數據矩陣B的第一列數據
end
y=x0';
y(1)=[];
b(:,1)=-z';
b(:,2)=1;
b(1,:)=[];
ab=inv(b'*b)*b'*y; %計算參數 矩陣
a=ab(1);
b=ab(2);
px0(1)=x0(1);
%求還原值系列
for k=1:number-1
px0(k+1)=(1-exp(a)) * ( x0(1)-b/a ) * exp(-a*k);
end
temp=px0(1:n);
x0;
temp=(temp-x0)./x0; %相對誤差
temp(1)=[]; %刪除第一個為零的誤差
temp=abs(temp);
rel=sum(temp)/(n-1)*100;
殘差Gm(1,1)
function [px0,ab,rel]=ccgm11(x0,number)
%[px0,ab,rel]=gm11(x0,number)
%px0為殘差預測數列,ab為求得的系數,rel為平均相對誤差(為百分比)
%默認的number參數為原數組大小
if nargin==1
number=max(size(x0));
end
n=max(size(x0)); %數組大小..
[px0,ab,rel]=gm11(x0,number);
wucha=x0-px0(1:n);
i=n;
%求後面的同號的數目.
while(wucha(i)*wucha(i-1)>0 & i>=2)
i=i-1;
end
start=i;
length=n-i+1;
new=wucha(start:n);
if length>=4
pwucha=gm11(new);
px0(start:n)=px0(start:n)+pwucha
clear wucha;
wucha=px0-x0;
wucha=wucha./x0; %相對誤差
wucha=abs(wucha);
rel=sum(wucha)/(n-1)*100;
end
verhust
function [px0,ab,rel]=verhust(x1,number)
%[px0,ab,rel]=verhust(x0,number)
%px0為預測數列,rel為平均相對誤差,rel為平均相對誤差(為百分比)
%默認的number參數為原數組大小
if nargin==1
number=max(size(x1));
end
n=max(size(x1));
x0(1)=x1(1);
for k=2:n
x0(k)=x1(k)-x1(k-1);
z(k)=0.5*(x1(k)+x1(k-1));
end
x0;
z;
B=[-(z(2:n))' (z(2:n).^2)'];
B;
Y=(x0(2:n))';
Y;
ab=inv(B'*B)*B'*Y;
a=ab(1);b=ab(2);
for k=1:number
px0(k)=(a*x1(1))/(b*x1(1)+(a-b*x1(1)).*exp(a*(k-1)));
end
temp=px0(1:n);
x1;
temp=(temp-x1)./x1; %相對誤差
temp(1)=[]; %刪除第一個為零的誤差
temp=abs(temp);
rel=sum(temp)/(n-1)*100;
新陳代謝Gm(1,1)
function [px0,ab,rel]=xcdxgm11(x0,number,step)
%[px0,ab,rel]=xcdxgm11(x0,number,step)
%x0為原系列,number為要預測的數目,step為基本步長
%px0為預測數列,rel為平均相對誤差,rel為平均相對誤差(為百分比)
%默認的number參數為原數組大小
%模型假設預測的數據和原始數據都要大於等於5
if nargin==1
number=max(size(x0));
step=max(size(x0));
end
if nargin==2
step=max(size(x0));
end
n=max(size(x0));
if n<step | n<5
error('此模型要求至少有五個原始數據,並且原始數據個數要大於新陳代謝的步長.');
end
[px0,ab,rel]=gm11(x0,n);
last=n;
x0;
px0;
while last<number
begin=last-step+1;
temp=px0(begin:last);
temp=gm11(temp,step+1);
last=last+1;
px0(last)=temp(step+1);
end
Ⅱ 求數學建模論文,簡單的,最好是原創,而且沒給其他人用過,謝謝了 [email protected] 可以加分 嘿嘿
簡單原創的?哪種類型的啊?我們練習的時候 寫過,絕對簡單,也原創啊
Ⅲ 這一個數學建模題怎麼寫急!!
ren wu
Ⅳ 數學建模論文
我的母校的數學建模站:mcm.ustc.e.cn
這里有一些數學建模方面的東西你可以看看