Układ równań liniowych 1 Cel zadania Wykształcenie umiejętności projektowania własnych klas modelujących pojęcia niezbędne do rozwiązania postawionego problemu. Rozwinięcie umiejętności przeciążania operatorów arytmetycznych oraz dostosowywania sposobu formatowania strumienia wejściowego i wyjściowego do potrzeb własnych struktur danych. 2 Opis zadania Należy napisać program, który umożliwia rozwiązanie układu równań liniowych z trzema niewiadomymi postaci: a 11 x 1 + a 12 x 2 + a 13 x 3 = b 1 a 21 x 1 + a 22 x 2 + a 23 x 3 = b 2 a 31 x 1 + a 32 x 2 + a 33 x 3 = b 3 Układ taki wygodnie jest reprezentować w postaci macierzowej jako a 11 a 12 a 13 x 1 b 1 a 21 a 22 a 23 x 2 = b 2 a 31 a 32 a 33 x 3 b 3 Tak więc można zapisać sformułowany problem w bardziej zwartej i ogólnej postaci: Ax=b gdzie A to macierz współczynników równania, x wektor nieznanych wartości, które należy wyliczyć, b wektor wyrazów wolnych. Ponadto program dla znalezionego rozwiązania powinien wyliczyć błąd wynikający z niedokładności obliczeń liczony jako norma wektora: ε= Ax b. Należy zbadać, kiedy wspomniany błąd staje się znaczący. Aby móc to określić należy odwołać się do interpretacji geometrycznej wspomnianego układu równań. Nie przypadkiem został wybrany układ z trzema niewiadomymi. Dla układu z czterema (i więcej) niewiadomymi byłoby to już niemożliwe (dlaczego?). UWAGA: Definiowane w programie klasy muszą odzwierciedlać kluczowe pojęcia znajdujące się w opisie problemu. Do pojęć takich należy między innymi układ równań liniowych. 3 Przykład działania programu W niniejszym rozdziale podany jest przykład działania programu. Przedstawioną formę interakcji z użytkownikiem należy traktować jako obowiązującą. 1
jkowalsk@panamint: rozwiazanie>./rownanie3 Rozwiazywane rownanie: Ax = b a - Wczytaj macierz wspolczynnikow A b - Wczytaj wektor wyrazow wolnych b w - Wczytaj wszystkie wspolczynniki (A i b) p - Pokaz rownanie r - Rozwiaz, pokaz wynik i blad? - Wyswietl menu k - Koniec dzialania programu a Wprowadz wspolczynniki macierzy A. Nalezy je podac w kolejnosci: A_11 A_12 A_13 A_21 A_22 A_23 A_31 A_32 A_33 > 8 2 1 2 9 1 4 1 2 w Wprowadz wspolczynniki dla calego ukladu rownan. Nalezy je podac w kolejnosci: A_11 A_12 A_13 b_1 A_21 A_22 A_23 b_2 A_31 A_32 A_33 b_3 > 2 1 1 1 1 2 1 2 1 1 1-1 r Rozwiazanie (x1,x2,x3): (2, 3, -6) Blad: 0 b Wprowadz wspołczynniki wektora wyrazow wolnych. Nalezy je podac w kolejnosci: b[0] b[1] b[2] itd. > 1 2-1.1 p 2*x1+1*x2+1*x3 = 1 1*x1+2*x2+1*x3 = 2 1*x1+1*x2+1*x3 = -1.1 r 2
Rozwiazanie (x1,x2,x3): (2.1, 3.1, -6.3) Blad: 6.84805e-07 k Koniec dzialania programu. jkowalsk@panamint: rozwiazanie> 4 Zalecenie W programie powinny znaleźć się przeciążenia pozwalające wczytywać macierz A oraz wektor wyrazów wolnych b. Osobne przeciążenia powinny zostać zdefiniowane dla układu równiań liniowych. 5 Testowanie programu Pomimo tego, że program dostarcza interfejs użytkownika przy jego uruchamianiu dobrze jest skorzystać z technik polegających na odpowiednim przekierowaniu strumienia wejściowego. Jest to przypadatne w momencie gdy testowana jest poprawność prowadzonych obliczeń (wyznaczanie rozwiązania równania oraz błędu). Zamiast wprowadzać za każdym razem odpowiednie sekwencje z klawiatury, należy zapisać je do pliku i zawartość pliku przekierować na wejście programu. Poniżej przedstawiony został przykład dla takiej właśnie sytuacji. Wywołanie programu: Zawartość pliku test_programu.txt: a 1 2 1 2 1 1 4 1 2 b 4.1 3.12 0.1 r k rowanie3 < test_programu.txt Działanie programu powinno sprowadzić się do wyświetlenia następującego tekstu: jkowalsk@panamint: rozwiazanie> rowanie3 < test_programu.txt Rozwiazywane rownanie: Ax = b a - Wczytaj macierz wspolczynnikow A b - Wczytaj wektor wyrazow wolnych b w - Wczytaj wszystkie wspolczynniki (A i b) p - Pokaz rownanie r - Rozwiaz, pokaz wynik i blad 3
? - Wyswietl menu k - Koniec dzialania programu Wprowadz wspolczynniki macierzy ukladu rownan. Nalezy je podac w kolejnosci: A[0,0] A[0,1] A[0,2] A[1,0] itd. A_11 A_12 A_13 A_21 A_22 A_23 A_31 A_32 A_33 > Twoj wybor?> Wprowadz wspolczynniki wektora wyrazow wolnych. Nalezy je podac w kolejnosci: b[0] b[1] b[2] itd. > Rozwiazanie (x1,x2,x3): (5.16, 6.14, -13.34) Blad: 6.0972e-07 Koniec dzialania programu. jkowalsk@panamint: rozwiazanie> Odpowiedzi użytkownika nie są widoczne, gdyż będą one brane z pliku. UWAGA: Wewnątrz w programie, niezależnie do tego czy treść wcześniej przedstawionych odpowiedzi będzie brana z klawiatury, czy też z pliku, czytanie będzie odbywało się zawsze z wejścia standardowego (na tym polega idea przekierowania wejścia standardowego). 6 Rozszerzenie zadania (nieobowiazkowe) Program w wersji rozszerzonej powinien umożliwiać rozwiązanie układu równań o dowolnej liczbie (ograniczonej jedynie przez zakres zmiennych i dostępne zasoby) zmiennych przy założeniu, że jest ona większa od 1. Należy przewidzieć również możliwość wczytania współczynników rówania i wyrazów wolnych z pliku i zmiany pojedynczego współczynnika lub wyrazu wolnego. Na obecnym etapie kursu nie jest zalecane tworzenie tablic dynamicznych. Właściwe ich użycie jako elementów obiektu wymaga znajomości konstruktorów kopiujących i umiejętności ich definiowania. 7 Materiały pomocnicze Przykładową realizację zadania znaleźć można na serwerze diablo lub panamint w katalogu bk/edu/po/zad/z4. W katalogu tym znajdują się następujące podkatalogi i pliki: bk/edu/po/zad/z4/. 4
bin.diablo/ukladrownan3 bin.panamint/ukladrownan3 bin.diablo/ukladrownan3, bin.panamint/ukladrownan3 Są to programy binarne. Stanowią one przykład realizacji programu, w wersji podstawowej, który został skompilowany odpowiednio na serwerze diablo i na serwerze panamint. 5