Lab 7 – metoda Gaussa-Jordana. Szkic M. Głowacki, L-10, PK
1
Laboratorium komputerowe 7
Rozwiązywanie układów równań – metoda Gaussa-Jordana
Celem ćwiczenia jest implementacja metody Gaussa-Jordana (w wersji uproszczonej) do rozwiązywania układów równań. W pierwszej części rozpatrywany jest szczególny przypadek – układ 4 równań, w drugiej należy przygotować ogólną funkcję, dla dowolnie dużego układu.
Dla uproszczenia pomijamy operacje zamiany wierszy miejscami. Spowoduje to utratę ogólności metody i w pewnych szczególnych przypadkach może wystąpić błąd dzielenia przez zero. Dodatkowo, zamiast wykonywania operacji w dwóch etapach (krok w przód, krok wstecz), będą wykonywane operacje dla całych kolumn. Chętni mogą oczywiście zapisać ogólny algorytm, z wyborem elementu głównego i z podziałem na dwa etapy.
Uwaga:
Należy przypomnieć sobie metodę Gaussa-Jordana (z kursu Matematyki lub z wykładów z Informatyki stosowanej).
1. Wprowadzenie.
Zastosować metodę Gaussa-Jordana do rozwiązania poniższego układu równań:
{
2𝑥 + 2𝑦 = 7 + 𝑧 − 𝑤 2𝑧 + 3𝑤 + 𝑦 = 3 + 𝑥 3𝑥 + 4𝑧 = 31 + 𝑦 + 𝑤 𝑥 + 4𝑦 − 2𝑧 + 2𝑤 = 2 Po uporządkowaniu otrzymujemy:
{
2𝑥 + 2𝑦 − 𝑧 + 𝑤 = 7
−𝑥 + 𝑦 + 2𝑧 + 3𝑤 = 3 3𝑥 − 𝑦 + 4𝑧 − 𝑤 = 31 𝑥 + 4𝑦 − 2𝑧 + 2𝑤 = 2 Zapisujemy w postaci macierzowej 𝐴𝑥 = 𝑏 :
[
2 2 −1 1
−1 1 2 3
3 −1 4 −1
1 4 −2 2
] [ 𝑥 𝑦 𝑧 𝑤
] = [ 7 3 31
2 ]
Wykonujemy operacje elementarne dla macierzy [𝐴 𝑏] tak, aby w miejscu macierzy 𝐴 uzyskać macierz jednostkową. W kolejnych krokach będziemy doprowadzali kolejne kolumny (od pierwszej do ostatniej) do postaci kolumn macierzy jednostkowej. Operacje będą wykonywane na wierszach macierzy. Najpierw wiersz, w którym występuje element przekątniowy, a następnie pozostałe wiersze.
Lab 7 – metoda Gaussa-Jordana. Szkic M. Głowacki, L-10, PK
2 [
2 2 −1 1
−1 1 2 3
3 −1 4 −1
1 4 −2 2
| 7 3 31
2 ]
1 2 𝑤1
→ [
1 1 −0.5 0.5
−1 1 2 3
3 −1 4 −1
1 4 −2 2
| 3.5
3 31
2 ]
𝑤2 − (−1) 𝑤1 𝑤3 − 3 𝑤1 𝑤4 − 1 𝑤1
→
[
1 1 −0.5 0.5
0 2 1.5 3.5
0 −4 5.5 −2.5 0 3 −1.5 1.5
| 3.5 6.5 20.5
−1.5 ]
1 2 𝑤2
→ [
1 1 −0.5 0.5 0 1 0.75 1.75 0 −4 5.5 −2.5 0 3 −1.5 1.5
| 3.5 3.25 20.5
−1.5 ]
𝑤1 − 1 𝑤2 𝑤3 − (−4) 𝑤2 𝑤4 − 3 𝑤2
→
[
1 0 −1.25 −1.25 0 1 0.75 1.75
0 0 8.5 4.5
0 0 −3.75 −3.75
| 0.25 3.25 33.5
−11.25
] → …
Przeprowadzić odręcznie dalsze obliczenia, kontynuując rozpoczęty schemat obliczeń.
2. Implementacja metody – szczególny przypadek dla układu 4 równań.
Utworzyć nowy skrypt i zapisać instrukcje języka Matlab wykonujące wszystkie operacje zapisane w punkcie 1.
Część skryptu została przedstawiona poniżej:
A = [2 2 -1 1; -1 1 2 3; 3 -1 4 -1; 1 4 -2 2];
b = [7; 3; 31; 2];
A = [A b];
% dla j=1
A(1,:) = 1/A(1,1) * A(1,:);
A(2,:) = A(2,:) – A(2,1) * A(1,:);
A(3,:) = A(3,:) – A(3,1) * A(1,:);
A(4,:) = A(4,:) – A(4,1) * A(1,:);
% dla j=2
% dla j=3
% dla j=4
x = A(:,end); % ostatnia kolumna macierzy disp(x);
Dokończyć skrypt zapisując brakujące instrukcje.
j = 1 j = 1
j = 2 j = 2
Lab 7 – metoda Gaussa-Jordana. Szkic M. Głowacki, L-10, PK
3
3. Implementacja metody – ogólny przypadek dla układu n równań.
Napisać funkcję, która będzie rozwiązywała dowolnie duży układ równań uproszczoną metodą Gaussa-Jordana (zgodnie z przyjętym w poprzednich punktach schematem).
Podpowiedź: skorzystać z dwóch zagnieżdżonych pętli for.
function x = metodagaussa(A,b) [n,m] = size(A);
A = [A b];
...
x = A(:,end);
end
Sprawdzić poprawność funkcji dla kilku różnych układów równań. W Command Window zdefiniować macierze współczynników i wektory prawej strony, a następnie wywołać dla nich przygotowaną funkcję.
A1 = [...];
b1 = [...];
metodagaussa(A1,b1)
4. Odwracanie macierzy
Zmodyfikować funkcję przygotowaną w punkcie 3, aby zamiast rozwiązywania układów równań wyznaczała macierz odwrotną do podanej macierzy.