Matlab: Невозможно выполнить обратную операцию - Как создать неособую квадратную матрицу

Я пытаюсь матричные операции. Данные представляют собой модель временного ряда - модель авторегрессии, AR(2), где порядок модели p =2 представлен переменной Y возбуждается белым гауссовским шумом, epsilon, Я застрял с концептуальными вопросами, на которые я буду благодарен за ответы. Код вычисляет матрицу автокорреляции после умножения вектора выборки с задержкой по времени Y на транспонирование вектора задержки с выдержкой времени в 1 выборку. Общая формула для корреляции E(Y*Y'), В этом случае мне нужно сделать E(Y(1:end)*Y(1:end)'), Ответ скаляр, если сделано так. Но, основываясь на ответе математического ожидания Уолтера Робертса, я могу получить 9 by 9 matrix, Однако я не получаю неособую матрицу.

Как создать особую матрицу для матрицы автокорреляции, чтобы можно было вычислить обратную величину? Пожалуйста помоги

КОД:

clc;
clear all;
 var_eps = 1;
    epsilon = sqrt(var_eps)*randn(5000,1); % Gaussian signal exciting the AR model

   Y(1) = 0.0;
    Y(2) = 0.0;
    for n= 3:5000
    Y(n)=  0.1950*Y(n-1) -0.9500*Y(n-2)+ epsilon(n); %AR(2) model
    end

  y_tminus1 = Y(1:end-1).';
    mult = y_tminus1*y_tminus1';  %This creates a square matrix
    autocorr = xcorr2(mult);  %To perform autocorrelation of 1 sampled lag time series with itself(1 sampled lag)
  inverse_autocorr = inv(autocorr);  **%PROBLEM**        


%Warning: Matrix is singular to working precision. 
  trace_inv=trace(inverse_autocorr);

ОБНОВЛЕНИЕ: я сталкиваюсь с этой проблемой, так как я пытаюсь реализовать условия матрицы в выражении уравнения (20) и RHS уравнения (24) img1
img2

ОБНОВЛЕНИЕ: 01 декабря

В этом коде вопросы, аналитическая форма переменных

CRB_LHS = (b_transpose_b/N)*tr(inv(E[y(t-1)y(t-1)']))

CRB_RHS = sigma2_v*tr(inv(sum_t =1 to N E[y(t-1)y(t-1)']))

где у (т-1) =

[y(t-1), y(t-2),..,y(t-p)]'

CRB_LHS рассчитывается по формуле (19) статьи

`Y_ARMA(n)=  0.1950*Y_ARMA(n-1)- 0.1950*Y_ARMA(n-2) + b*x_gauss(n);` where

 x_gauss = N(0,1)

CRB_RHS рассчитывается по формуле (1)

Y_AR (n) = 0,1950*Y_AR(n-1) -0,9500*Y_AR(n-2) + x_chaos(n); где

x_chaos(n)= f(x(n-1),x(n-2),...,x(n-d)); d = 2

Я принял коэффициенты b = 1 для белого шума в модели ARMA уравнения (19).

Для каждого уровня SNR snrbd = -3:1:2 Я симулирую M количество временных рядов (M независимых прогонов). Есть 2 сомнения относительно реализации: (1) для RHS уравнения (25), в коде Ожидание берется за независимые прогоны (согласно предложению в ответе, если я правильно понял) - выражение показывает, что сумма берется по всем точкам данных и ожиданию по M выборкам для (t-1). Это сбивает с толку для реализации. (2) Код выдает ошибку из-за обратного. Невозможно решить это.

Результат должен быть CRB_LHS > CRB_RHS за каждый снар.

clc;
clear all;
N = 10;
M = 100;  % number of independent runs over which the 

  snrdb = -3:1:2;
for snr_levels = 1:length(snrdb)



for monte_carlo = 1: M
     x_gauss = randn(1,N);
     x_chaos(1) = rand();
% generate the chaotic code
    for i =1 : N
        x_chaos(i+1) = 4*x_chaos(i)*(1-x_chaos(i));
    end

    x_chaos = x_chaos-mean(x_chaos);
    Y_AR(1) = 0.0;
    Y_AR(2) = 0.0;

   Y_ARMA(1) = 0.0;
    Y_ARMA(2) = 0.0;
    for n= 3:N
    Y_ARMA(n)=  0.1950*Y_ARMA(n-1)- 0.1950*Y_ARMA(n-2) + x_gauss(n); %Eq(19) model
    Y_AR(n) =   0.1950*Y_AR(n-1) -0.9500*Y_AR(n-2)  + x_chaos(n); %Eq(1)
    end
    % signalPower_Y_AR = var(Y_AR);
 signalPower_Y_AR = 1;

    sigma2_v = signalPower_Y_AR .*(10^(-snrdb(snr_levels))) ;
    v = sqrt(sigma2_v)*randn(1,length(Y_AR));
    z = Y_AR + v;  %Eq(3)

Y_LHS = Y_ARMA(end-2:end-1).';
Y_RHS = z(end-2:end-1).';

A1(:,monte_carlo) = Y_LHS;
B1(monte_carlo,:) = Y_LHS.';

A2(:,monte_carlo) = Y_RHS;
B2(monte_carlo,:) = Y_RHS.';
end


dimension = length(Y_LHS);
sum_of_products_LHS = zeros(dimension,dimension);
sum_prod_RHS = zeros(dimension,dimension);

for runs = 1:M
A = A1(:,runs);
B = B1(runs,:);
mult_LHS = A*B;

C = A2(:,runs);
D = B2(runs,:);
mult_RHS = C*D;

sum_of_products_LHS = sum_of_products_LHS+ mult_LHS;
sum_of_products_RHS = sum_prod_RHS + mult_RHS;
end 

  b_transpose_b = 1;

Expectation_LHS = mean(sum_of_products_LHS);
% Inverse_LHS = inv(Expectation_LHS);
% trace_LHS = tr(Inverse_LHS);

Expectation_RHS = mean(sum_of_products_RHS);

% Inverse_RHS = inv(Expectation_RHS);
% trace_RHS = tr(Inverse_RHS);
%MANUALLY MAKING A SQUARE MATRIX
size_Inverse = 7;
InverseMatrix_LHS = eye(size_Inverse,size_Inverse);
InverseMatrix_RHS = eye(size_Inverse,size_Inverse);

for i = 1:size_Inverse
    InverseMatrix_LHS(i:size_Inverse,i) = Expectation_LHS(1:size_Inverse-i+1);
    InverseMatrix_LHS(i,i:size_Inverse) = Expectation_LHS(1:size_Inverse-i+1);

    InverseMatrix_RHS(i:size_Inverse,i) = Expectation_RHS(1:size_Inverse-i+1);
    InverseMatrix_RHS(i,i:size_Inverse) = Expectation_RHS(1:size_Inverse-i+1);

end
  trace_LHS = tr(InverseMatrix_LHS);
  CRLB_RHS(snr_levels)=  (b_transpose_b/N).*trace_RHS;

  trace_RHS = tr(InverseMatrix_RHS);
  CRLB_RHS(snr_levels)= sigma2_v*trace_RHS;

 end

1 ответ

Решение

Для p=2 выражение для y_tminus1 должно быть (см. Выражения после уравнения в статье)

y_tminus1 = Y(end-2:end-1).' 

Ваш мульт в порядке. Для уравнения 20 нужно принять ожидание E(мульт). Для этого вам нужно сгенерировать несколько путей и взять среднее по ним. Для RHS уравнения 25, вам нужно использовать y_tminus1 для каждого шага вашего процесса ARMA, суммировать соответствующие матрицы множеств, принимать ожидания по ансамблю и только после этого принимать обратное. Может быть, попробуйте настроить ваш код в соответствии с этими направлениями, и я исправлю это.

Другие вопросы по тегам