Нахождение обратной матрицы путем исключения Гаусса с частичным поворотом

Привет, ребята, я пишу программу для вычисления определителя (эту часть я уже сделал) и обратной матрицы с GEPP. Здесь возникает проблема, так как я совершенно не знаю, как инвертировать матрицу с помощью GEPP, я знаю, как инвертировать с помощью исключения Гаусса ([A|I]=>[I|B]). Я искал в Интернете, но до сих пор не знаю, не могли бы вы объяснить мне?

Вот мой код Matlab (может быть, кому-то он покажется полезным), на данный момент он решает AX=b и вычисляет определитель:

function [det1,X ] = gauss_czesciowy( A, b )
%GEPP
perm=0;

n = length(b);
if n~=m 
error('vector has wrong size');
end
for j = 1:n
    p=j;
    % choice of main element
    for i = j:n
        if abs(A(i,j)) >= abs(A(p,j))
            p = i;
        end
    end
    if A(p,j) == 0
        error('Matrix A is singular');
    end
    %rows permutation
    t       = A(p,:);
    A(p,:)  = A(j,:);
    A(j,:) = t;
    t       = b(p);
    b(p)    = b(j);
    b(j)    = t;
    if~(p==i)
    perm=perm+1;
    end

    % reduction
    for i = j+1:n
        t       = (A(i,j)/A(j,j)); 
        A(i,:)  = A(i,:)-A(j,:)*t; 
        b(i)    = b(i)-b(j)*t; 
    end 
end
%determinant
mn=1;
for i=1:n
    mn=mn*A(i,i);
end
det1=mn*(-1)^perm;
% solution
X   = zeros(1,n); 
X(n) = b(n)/A(n,n); 

if (det1~=0)
for i = 1:n
    s = sum( A(i, (i+1):n) .* X((i+1):n) ); 
    X(i) = (b(i) - s) / A(i,i); 
end
end
end

person e0n    schedule 09.06.2013    source источник
comment
Если вы ищете алгоритм (а не часть программирования), возможно, math.stackexchange.com лучше место, чтобы задать этот вопрос.   -  person Stewie Griffin    schedule 09.06.2013


Ответы (1)


Вот алгоритм для исключения Гуасса с частичным поворотом. По сути, вы выполняете исключение Гаусса, как обычно, но на каждом шаге вы обмениваетесь строками, чтобы выбрать самую большую доступную опорную точку.

Чтобы получить обратное значение, вам нужно отслеживать, как вы переключаете строки, и создавать матрицу перестановок P. Матрица перестановок — это всего лишь единичная матрица того же размера, что и ваша А-матрица, но с теми же переключениями строк. Тогда у вас есть:

[A] --> GEPP --> [B] and [P]

[A]^(-1) = [B]*[P]

Я бы попробовал это на паре матриц, чтобы быть уверенным.

EDIT: вместо того, чтобы эмпирически проверять это, давайте обсудим это. По сути, когда вы переключаете строки в A, вы умножаете их на свою матрицу перестановок P. Вы можете просто сделать это до того, как запустите GE, и в итоге получите тот же результат, который будет таким:

[P*A|I] --> GE --> [I|B] or
(P*A)^(-1) = B

В силу свойств обратной операции это можно переписать:

A^(-1) * P^(-1) = B

И вы можете умножить обе части на P справа, чтобы получить:

A^(-1) * P^(-1)*P = B*P
A^(-1) * I = B*P
A^(-1) = B*P
person Engineero    schedule 09.06.2013
comment
Что такое Б? Строковая эшелонированная форма матрицы A? - person e0n; 09.06.2013
comment
B будет сокращенным эшелоном строки после того, как вы получили A->I через некоторые перестановки. Поскольку вы поменяли местами ряды вокруг мысли, это еще не ваша инверсия. Вам все еще нужно умножить на свою матрицу перестановок, чтобы отменить все сделанные вами переключения. - person Engineero; 09.06.2013
comment
Хорошо, вы уверены, что это работает [A]^(-1) = [B]*[P] , потому что мне это кажется подозрительным. - person e0n; 09.06.2013
comment
это так не работает, представьте, что вашему GEPP так повезло, что вам не нужно выполнять замену строк, поэтому ваша матрица перестановок - это просто матрица идентичности, поэтому вы утверждаете, что A ^ (-1) = B * I (что равно Б) не имеет смысла... - person e0n; 09.06.2013
comment
Конечно, это так. В ситуации, которую вы описываете, у вас было бы [A|I] --> GE --> [I|B] или A^{-1} = B. Я отредактировал свой ответ, чтобы сделать этот момент более ясным. - person Engineero; 09.06.2013