Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6307-Markeev-8.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.06 Mб
Скачать

Приложение

Код программы

//Оценить моментные функции,

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);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]