szybkie i bezpamięciowe odwracanie macierzy!

0

jest taki fajny sposób odwracania macierzy, który podam na przykładowej

A =
1 0 0 0
0 2 1 0
0 1 1 1
1 1 0 1
  • wybieramy szybko niezerowy element z macierzy, czyli tu (1,1) = 1
  • następnie normalizujemy cały wiersz z tym wybranym elementem, w taki sposób:
  1. m = A[k][k]; pamiętamy ten wybrany (normalizator!)
  2. wstawiamy jedynkę w tym wybranym: A[k][l] = 1
  3. następnie dzielimy cały wiersz przez ten wybrany element, czyli tak:
    m = 1/m i teraz:
    A[k][j] *= m; dla j = 1..n

co w tym przypadku nic nie zmienia, ponieważ m = 1.

Następnie redukujemy pozostałe wiersze, znaczy dla każdego i <> k, w taki sposób:

m = A[i][l]; pamiętamy i zerujemy: A[i][l] = 0;
a teraz cały wiersz przeliczamy tak: A[i][j] -= m*A[k][j]; j = 1..n

otrzymamy macierz:

1 0 0 0; wybrany wiersz pomijamy
0 2 1 0; -= 0 * w1 co nic nie zmienia
0 1 1 1; też nic
-1 1 0 1; w4 -= w1; (0,1,0,1) - (1,0,0,0) = ...

teraz bierzemy element: (2,2) = 2, i robimy to samo

1 0 0 0
0 1/2 1/2 0
0 -1/2 1/2 1; = ( 0,0,1,1) - (0,1/2,1/2,0)
-1 -1/2 -1/2 1; = (-1,0,0,1) - (0,1/2,1/2,0)


element (3,3) = 1/2; w3 = 2(0,-1/2,1,1) = (0,-1,2,2) =

1 0 0 0
0 1 -1 -1; (0,1/2,0,0) - 1/2(0,-1,2,2) = (0,1,-1,-1);
0 -1 2 2
-1 -1 1 2; (-1,-1/2,0,1) + 1/2(0,-1,2,2) = (-1,-1,1,2);

finalnie:
w4 = 1/2(-1,-1,1,1) = (-1/2,-1/2,1/2,1/2);

1 0 0 0
-1/2 1/2 -1/2 1/2; (0,1,-1,0) + (-1/2,-1/2,1/2,1/2) = (-1/2,1/2,-1/2,1/2)
1 0 1 -1; (0,-1,2,0) - 2(-1/2,-1/2,1/2,1/2) = (0,-1,2,0) + (1,1,-1,-1) = (1,0,1,-1)
-1/2 -1/2 1/2 1/2

N i to powinna być już gotowa odwrotna:
A^-1 =
1 0 0 0
-1/2 1/2 -1/2 1/2
1 0 1 -1
-1/2 -1/2 1/2 1/2

w każdym razie powinna być... hihi!

Fajna metoda, wbrew pozorom - opis jedynie wygląda na skomplikowany, ale po zakodowaniu tam chyba z pięć linii będzie!

Zna ktoś to - jak ta metoda się nazywa?

2

Zakoduj, pokaż jakiś działający test.

6

Ja myśle że na podstawie wątków @kwalifika można oszacować którą książke do metod numerycznych czyta / na której uczelni studiuje xD Była już metoda Netwona / równania nieliniowe i szukanie pierwiastków, potem interpolacje i aproksymacje, teraz weszło odwracanie macierzy (więc pewnie też jakieś LU, macierze rzadkie). Obstawiamy co będzie dalej? :D Brakuje mi całkowania numerycznego, FFT, minimalizacji funkcji i metody elementów skończonych...

0

Faktycznie to chyba GJ (Gauss-Jordan).

Ale to bardzo fajne jest:
tym sposobem nawet w pamięci można odwracać macierze typu 3x3 albo i nawet 5x5,
a programowo... to już całkiem rakieta: 100x100, pyk, i gotowe! nie? :)

A =
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0

A^-1 = ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1