
Приложение
Код программы
//Оценить моментные функции,
clear()
X = fscanfMat('D:\abc8.txt');//Чтение выборки из файла
F = '%16.4f'; // Формат вывода чисел с плавающей точкой
I = '%d'; // Вормат вывода целых чисел
function printMat(M, mformat),
[n, m] = size(M);
for i = 1:n,
for j = 1:m,
printf(mformat + " ", M(i, j));
end;
printf("\n");
end;
endfunction;
function [RX, MX]=Analiz(X)
MX = sum(X)/5000;
RX_=corr(X,30);
RX = RX_';
DX = RX_(1);
j=30;
while ((j>0) & (abs(RX(j)/DX)<1/%e))
j = j-1;
end;
rad = j;
printf("Минимальное значение : "+F+"\n",min(X));
printf("Максимальное значение : "+F+"\n",max(X));
printf("Выборочное среднее : "+F+"\n",MX);
printf("Выборочная дисперсия : "+F+"\n",DX);
printf("Выборочное СКО : "+F+"\n",sqrt(DX));
printf("Радиус корреляции : "+I+"\n",rad);
printf("Выборочная нормированная корреляционная функция :\n");
printf(F+"\n",RX/DX);
printf(" ...\n ...\n ...\n\n")
endfunction;
function [RX, m]=first_task(X)
[RX,m] = Analiz(X);
xgrid();
xtitle('','index number','Normalized correlation function');
plot2d(0:20,[RX(1:21)/RX(1) zeros(21,1)],axesflag = 1,style = [5 1],leg = "Normalized correlation function");
endfunction
//Построить модели АР, СС, АРСС до третьего порядка включительно
//Устойчивость модели
function [y]=stable(betas)
y = %T;
len = length(betas)
if abs(betas(len))>1 then
y = %F;
elseif (len == 2) then
if (abs(betas(1))>1-betas(2)) then
y = %F;
end;
elseif (len == 3) then
if ((abs(betas(1)+betas(3)) > 1-betas(2)) | (abs(betas(2)+betas(1)*betas(3))>abs(1-betas(3)^2))) then
y = %F;
end;
end;
endfunction
//Смешанная корреляционная функция
function R=Mcorr(k, alphas, betas)
R = alphas(k+1);
len = min(k, length(betas));
for j = 1 : len,
R = R + betas(j) * Mcorr(k - j, alphas);
end;
endfunction;
//2 Нахождение альфа и бета в модели АР
function [alpha, betas, is_correct, is_stable]=AR(rX, M)
RX = rX;
num = M;
function [y]=ar(x)
for i = 0:num,
y(i+1) = -RX(i+1);
for j = 1:num,
y(i+1) = y(i+1)+x(j) * RX(abs(j-i)+1);
end;
end;
y(1) = y(1)+x(num+1)^2;
endfunction;
[coef,values,info] = fsolve(zeros(1,num+1),ar);
is_correct = %T;
for i = 1:num+1
if (abs(values(i))>0.000001 | info == 4) then
is_correct = %F;
break;
end;
end;
betas = coef(1:M);
is_stable = %T;
if (~stable(betas)) then
is_stable = %F;
end;
alpha = coef(M+1);
endfunction
//3 Нахождение альфа в модели СС
function [alphas, correct]=MA(rX, N)
RX = rX;
num = N;
function [y]=ma(x)
for i = 0:num,
y(i+1) = - RX(i+1),
for j = 0:num-i
y(i+1) = y(i+1)+x(j+1)*x(j+1+i);
end;
end;
endfunction;
[alphas,values,info] = fsolve(zeros(1,num+1),ma);
correct = %T
for i = 1:N+1
if (abs(values(i))>0.000001 | info == 4) then
correct = %F;
break;
end;
end;
endfunction;
//4 Нахождение коэффициентов бета в общей модели АРСС
function [betas, is_stable]=arma_b(RX, M, N)
R = zeros(M, 1);
R_b = zeros(M, M);
for i = 1:M,
R(i) = RX(N+1+i);
for j = 1:M,
R_b(i, j) = RX(abs(N-j+i)+1);
end;
end;
betas = linsolve(R_b, -R);
is_stable = %T;
if (~stable(betas)) then
is_stable = %F;
end;
endfunction;
//Нахождение коэффициентов альфа в общей модели АРСС
function [alph, correct]=arma_a(RX, m, n, betas)
M = m, N = n;
function r_s=system(alph)
for k = 0 : N,
r_s(k+1) = -RX(k+1);
for i = k : N,
r_s(k+1) = r_s(k+1) + alph(i+1) * Mcorr(i - k, alph, betas);
end;
for j = 1 : M,
r_s(k+1) = r_s(k+1) + betas(j) * RX(abs(k - j) + 1);
end;
end;
endfunction;
[alph,values,info] = fsolve([1 : (N+1)], system);
correct = %T;
for i = 1:N+1
if (abs(values(i))>0.000001 | info == 4) then
correct =%F;
break;
end;
end;
endfunction;
//Общая функция нахождения параметров модели АРСС
function [alphas, betas, correct, is_stable]=ARMA(RX, M, N)
if (M == 0) then
is_stable = %T;
[alphas,correct] = MA(RX,N);
betas = [];
elseif (N == 0) then
[alphas,betas,correct,is_stable] = AR(RX,M)
else
[betas,is_stable] = arma_b(RX,M,N);
[alphas,correct] = arma_a(RX,M,N,betas);
end;
endfunction
//второй метод для нахождения коэффициентов альфа и бета модели АРСС(M,N)
function [betas2, alphas2, RX1]=ARMAmod2(RX, M, N)
RX1=zeros(5000,1)
if (M==1) then
if (N==1) then
betas2=RX(3)/RX(2)
psi=zeros(1,5000);
psi(1)=X(1);
for(i=2:5000)
psi(i)=X(i)-betas2*X(i-1);
end
RX1=corr(psi,30);
function [y]=f(x, RX1)
y(1)=x(1)^2+x(2)^2-RX1(1);
y(2)=x(1)*x(2)-RX1(2);
endfunction
alphas2=fsolve([0.5 0.5],f);
end
end
if (M==2) then
if (N==1) then
betas2=linsolve([RX(2) RX(1);RX(3) RX(2)],[RX(3); RX(4)]);
psi=zeros(1,5000);
psi(1)=X(1);
psi(2)=X(2)+betas2(1)*X(1);
for(i=3:5000)
psi(i)=X(i)+betas2(1)*X(i-1)+betas2(2)*X(i-2);
end
RX1=corr(psi,30);
function [y]=f(x, RX1)
y(1)=x(1)^2+x(2)^2-RX1(1);
y(2)=x(1)*x(2)-RX1(2);
endfunction
alphas2=fsolve([0.5 0.5],f);
end
end
if (M==3) then
if (N==1) then
betas2=linsolve([RX(2) RX(1) RX(2); RX(3) RX(2) RX(1) ; RX(4) RX(3) RX(2)],[RX(3) ;RX(4); RX(5)]);
psi=zeros(1,5000);
psi(1)=X(1);
psi(2)=X(2)+betas2(1)*X(1);
psi(3)=X(3)+betas2(1)*X(2)+betas2(2)*X(1);
for(i=4:5000)
psi(i)=X(i)+betas2(1)*X(i-1)+betas2(2)*X(i-2)+betas2(3)*X(i-3);
end
RX1=corr(psi,30);
function [y]=f(x, RX1)
y(1)=x(1)^2+x(2)^2-RX1(1);
y(2)=x(1)*x(2)-RX1(2);
endfunction
alphas2=fsolve([0.5 0.5 ],f);
end
end
endfunction
function second(RX) //вывод
for i = 0:3
for j = 0:3
[a,b,c,st] = ARMA(RX,i,j),
printf("Модель АРСС("+I+","+I+") :",i,j);
if c then
cor = " существует, ";
if st then
cor = cor + "устойчива :\n";
printf(cor);
printf(" альфа : ");
for k = 1:length(a)
printf(F+" ",a(k));
end;
printf("\n");
if (length(b)) then
printf(" бета : ");
for k = 1:length(b)
printf(F+" ",b(k));
end;
printf("\n");
end;
else
cor = cor + " но не устойчива :\n";
printf(cor);
end;
else
printf(" не существует\n");
end;
end;
end;
printf("\n");
[betas2,alphas2,rx2] = ARMAmod2(RX,1,1);
printf('-------\n');
printf(F+" ",betas2);
printf(F+" ",alphas2(1));
printf(F+" ",alphas2(2));
[betas2,alphas2,rx2] = ARMAmod2(RX,2,1);
printf('-------\n');
printf(F+" ",betas2(1));
printf(F+" ",betas2(2));
printf(F+" ",alphas2(1));
printf(F+" ",alphas2(2));
[betas2,alphas2,rx2] = ARMAmod2(RX,3,1);
scf(12);
xgrid();
xtitle('промежуточная последовательность для построения АРСС(3,3)','index number','Normalized correlation function csi');
plot2d(0:10,rx2(1:11)/rx2(1), axesflag = 1,style = i,leg = "Normalized correlation function" );
printf('-------\n');
for i=1:3
printf(F+" ",betas2(i));
end
for i=1:2
printf(F+" ",alphas2(i));
end
endfunction
//Рассчитать теоретические нормированные корреляционные функции
//для каждой из построенных моделей. На основе сравнения теоретических и выборочных функций
//выбрать наиболее адекватную модель из каждого класса.
//Построить графики корреляционных функций для трех наилучших моделей.
//5 Теоретическая корреляционная функция
function [r]=T_n_corr(RX, alphas, betas, num);
function R=Tcorr(RX, alphas, betas, k)
nm = length(alphas)+length(betas)-1;
k = abs(k);
if (k > nm) then
R = 0;
M = length(betas);
for j = 1 : M,
R = R + betas(j) * Tcorr(RX,alphas,betas, k - j);
end;
else
R = RX(k+1);
end;
endfunction;
for i = 0:num-1
R(i+1) = Tcorr(RX,alphas,betas,i);
end;
r = R/R(1);
endfunction
function [r]=T_n_corr2(RX, alphas2, betas2, num);
function R=Tcorr(RX, alphas2, betas2, k)
nm = length(alphas2)+length(betas2)-1;
k = abs(k);
if (k > nm) then
R = 0;
M = length(betas2);
for j = 1 : M,
R = R + betas2(j) * Tcorr(RX,alphas2,betas2, k - j);
end;
else
R = RX(k+1);
end;
endfunction;
for i = 0:num-1
R(i+1) = Tcorr(RX,alphas2,betas2,i);
end;
r = R/R(1);
endfunction
function [e]=T_error(rX, r);//Ошибка модели
e = 0;
for i = 1:11,
e = e + (rX(i)-r(i))^2;
end;
endfunction
function [E]=T_errors(RX)//Ошибки моделей
for i = 1:4
for j = 1:4
[a,b,c,s] = ARMA(RX,i-1,j-1);
if (c & s) then
r = T_n_corr(RX,a,b,15);
E(i,j) = T_error(RX/RX(1),r);
else
E(i,j) = %inf;
end;
end;
end;
endfunction
function [E]=T_errors2(RX)//Ошибки моделей
for i = 1:3
for j = 1:3
[betas2,alphas2,rx2] = ARMAmod2(RX,i,j);
r = T_n_corr(RX,alphas2,betas2,15);
E(i,j) = T_error(RX/RX(1),r);
end;
end;
endfunction
function [ar_, ma_, arma]=best_models(errors);
printMat(errors,F);
[min_,k] = min(errors(1:4,1));
ar_ = k-1;
[min_,k] = min(errors(1,1:4));
ma_ = k-1;
[min_,k] = min(errors(2:4,2:4));
arma = k';
endfunction
function [err, ar_, ma_, arma]=third(RX, num)
err = T_errors(RX);
printf('==========\n');
err2= T_errors2(RX);
printMat(err2, F);
printf('==========\n');
[ar_,ma_,arma] = best_models(err);
printf("Лучшие модели :\n");
printf("АР("+I+")\n",ar_);
[a,b,c,st] = ARMA(RX,ar_,0);
AR_corr = T_n_corr(RX,a,b,num);
printf("Нормированная крреляция:\n");
for i = 1:11
printf(F+"\n",AR_corr(i));
printf("\n");
end;
printf("CC("+I+")\n",ma_);
[a,b,c,st] = ARMA(RX,0,ma_);
MA_corr = T_n_corr(RX,a,b,num);
printf("Нормированная крреляция:\n");
for i = 1:11
printf(F+"\n",MA_corr(i));
printf("\n");
end;
printf("АРМА("+I+","+I+")\n\n",arma(1),arma(2));
[a,b,c,st] = ARMA(RX,arma(1),arma(2));
ARMA_corr = T_n_corr(RX,a,b,num);
printf("Нормированная крреляция:\n");
for i = 1:11
printf(F+"\n",ARMA_corr(i));
printf("\n");
end;
scf(1);
xgrid();
xtitle('','index number','Normalized correlation function');
plot2d(0:num-1,AR_corr, axesflag = 1,style = 13,leg='AR(3)');
plot2d(0:num-1,RX(1:num)/RX(1), axesflag = 1,style = 5);
scf(10);
xgrid();
xtitle('','index number','Normalized correlation function');
plot2d(0:num-1,MA_corr, axesflag = 1,style = 6,leg='MA(3)');
plot2d(0:num-1,RX(1:num)/RX(1), axesflag = 1,style = 5);
scf(11);
xgrid();
xtitle('','index number','Normalized correlation function');
plot2d(0:num-1,ARMA_corr, axesflag = 1,style = 2,leg='ARMA(3,1)');
plot2d(0:num-1,RX(1:num)/RX(1), axesflag = 1,style = 5);
endfunction
//Смоделировать процесс с использованием лучшей модели
//Результат изобразить графически
function X=Gauss(n, a, D) //функция генерирует нормальную СВ
X_norm=zeros(n,1), //по заданным параметрам
sigma=sqrt(D),
for i=1:n,
sum=0,
for j=1:12,
sum =sum+rand(),
end;
X_norm(i) = sigma*(sum-6)+a,
end;
X=X_norm;
endfunction;
function [X]=modeling_ARMA(alphas, betas, MX, num);
X_ = zeros(num+1000,1);
ksi = grand(num + 1000, 1, 'nor', 0, 1);
N = length(alphas) - 1;
M = length(betas);
for i = 0:num+999,
for j =0:N
if (i-j>=0) then
X_(i+1) = X_(i+1) + alphas(j+1)*ksi(i-j+1);
end;
end;
for j =1:M
if (i-j>=0) then
X_(i+1) = X_(i+1) + betas(j)*X_(i-j+1);
end;
end;
end;
X = X_(1001:num+1000)+MX;
endfunction;
function [ar_model, ma_model, arma_model]=fifth(Source process, ar_, ma_, arma)
w = 0:120;
RX' = corr(Source process,30);
MX = mean(Source process);
dx = sqrt(cmoment(Source process,2));
mx = ones(121,1)*MX;
dx1 = mx - dx;
dx2 = mx + dx;
[a,b,c,st] = ARMA(RX,ar_,0);
ar_model = modeling_ARMA(a,b,MX,5000)
[a,b,c,st] = ARMA(RX,0,ma_);
ma_model = modeling_ARMA(a,b,MX,5000)
[a,b,c,st] = ARMA(RX,arma(1),arma(2));
ARMA_corr = T_n_corr(RX,a,b,11);
arma_model = modeling_ARMA(a,b,MX,5000)
model_corr = corr(arma_model,11);
ma_RX=corr(ma_model,30);
ar_RX=corr(ar_model,30);
arma_RX=corr(arma_model,30);
scf(10);
plot2d(0:10,ma_RX(1:11)/ma_RX(1), axesflag = 1,style = 10);
scf(11);
plot2d(0:10,arma_RX(1:11)/arma_RX(1), axesflag = 1,style = 15);
scf(1);
plot2d(0:10,ar_RX(1:11)/ar_RX(1), axesflag = 1,style = 10);
scf(5);
xgrid();
xtitle('','index number','Random sequence value');
plot2d(w, Source process (1:121), axesflag = 1,style = 1);
plot2d(w,ar_model(1:121), axesflag = 1,style = 13,leg='AR(3)');
plot2d(w,mx, axesflag = 1,style = 2);
plot2d(w,dx1, axesflag = 1,style = 5);
plot2d(w,dx2, axesflag = 1,style = 5);
scf(6);
xgrid();
xtitle('','index number','Random sequence value');
plot2d(w, Source process (1:121), axesflag = 1,style = 1);
plot2d(w,ma_model(1:121), axesflag = 1,style = 13,leg='MA(0)');
plot2d(w,mx, axesflag = 1,style = 2 );
plot2d(w,dx1, axesflag = 1,style = 5);
plot2d(w,dx2, axesflag = 1,style = 5);
scf(7);
xgrid();
xtitle('','index number','Random sequence value');
plot2d(w, Source process (1:121), axesflag = 1,style = 1);
plot2d(w,arma_model(1:121), axesflag = 1,style = 13,leg='ARMA(3,3)');
plot2d(w,mx, axesflag = 1,style = 3);
plot2d(w,dx1, axesflag = 1,style = 5);
plot2d(w,dx2, axesflag = 1,style = 5);
endfunction;
//Построить оценки моментных функций смоделированного процесса,
//сравнить их с оценками моментных функций исходного процесса
//и с теоретическими моментными функциями, соответствующими выбранной модели АРСС.
function sixth(X, a, m, am, ar_best, ma_best, arma_best)
printf("Статистика исходной выборки :\n");
[RX,MX] = Analiz(X);
printf("Статистика модели АР("+I+"):\n",ar_best);
[rA,mA] = Analiz(a);
printf("Ошибка мат.ожидания :"+F+"\n",abs(MX-mA));
printf("Ошибка дисперсии :"+F+"\n",abs(RX(1)-rA(1)));
printf("Ошибка корреляции :"+F+"\n\n",T_error(RX/RX(1),rA/rA(1)));
printf("Статистика модели CC("+I+"):\n",ma_best);
[rM,mM] = Analiz(m);
printf("Ошибка мат.ожидания :"+F+"\n",abs(MX-mM));
printf("Ошибка дисперсии :"+F+"\n",abs(RX(1)-rM(1)));
printf("Ошибка корреляции :"+F+"\n\n",T_error(RX/RX(1),rM/rM(1)));
printf("Статистика модели АРCC("+I+","+I+"):\n",arma_best(1),arma_best(2));
[rAM,mAM] = Analiz(am);
printf("Ошибка мат.ожидания :"+F+"\n",abs(MX-mAM));
printf("Ошибка дисперсии :"+F+"\n",abs(RX(1)-rAM(1)));
printf("Ошибка корреляции :"+F+"\n",T_error(RX/RX(1),rAM/rAM(1)));
endfunction
[RX, MX] = first(X);
second(RX);
[errors,ar_best,ma_best,arma_best] = third(RX,11);
errors
printf("\n")
[a,m,am] = fifth(X,ar_best,ma_best,arma_best);
sixth(X,a,m,am,ar_best,ma_best,arma_best);