Zad. 5: Układ równa´n liniowych liczb zespolonych
Transkrypt
Zad. 5: Układ równa´n liniowych liczb zespolonych
Zad. 5: Układ równań liniowych liczb zespolonych 1 Cel ćwiczenia Wykształcenie zdolności abstrahowania operacji arytmetycznych od konkretnych typów. Unaocznienie problemów zwiazanych ˛ z programowaniem uogólnionym i potencjalnych zalet takiego podejścia. Tworzenie diagramów klas i diagramów czynności z wykorzystaniem programu dia. Tworzenie dokumentacji z wykorzystaniem systemu doxygen. 2 Program zaj˛eć • Ocena realizacji zadania z poprzedniego laboratorium – ocenie podlega poprawność realizacji zadania, styl pisania programu oraz opisy. • Ocena przygotowania do zaj˛eć – realizacja modułu liczb zespolonych (patrz podrozdział 5.1). • Modyfikacja programu wg wskazań osoby prowadzacej ˛ – ocenie b˛edzie podlegała poprawność realizacji modyfikacji. Prac˛e nad modyfikacja˛ programu (wszystkie operacje musza˛ być wykonywane na kopii) należy rozpoczać ˛ już w trakcie pierwszej fazy laboratorium, gdyż prowadzacy ˛ nie b˛edzie w stanie ocenić wcześniejszego programu wszystkim jednocześnie. • Realizacja wst˛epnej fazy prac nad nowym zadaniem – w ramach wst˛epnej realizacji zadania należy rozbudować klas˛e liczb zespolonych o niezb˛edne dodatkowe metody i przecia˛żenia. • Ocena realizacji wst˛epnej fazy zadania 3 Opis zadania programowego Należy przerobić program rozwiazuj ˛ acy ˛ układ równań z poprzedniego zadania, tak aby działał na liczbach zespolonych. W tym celu należy stworzyć dodatkowy moduł, który b˛edzie zawierał definicj˛e klasy liczb zespolonych oraz definicje odpowiednich metod. Niniejsze zadanie jest swego rodzaju sprawdzianem poprawności przyj˛etych wcześniej koncepcji. Im były one lepsze tym mniej problemów b˛edzie nastr˛eczała zamiana typów liczb, na których działa program. 3.1 Działanie programu Tak jak we wcześniejszym zadaniu, na wejście programu podawana jest macierz współczynników równania oraz wektor wyrazów wolnych. Podawane sa˛ one w postaci transponowanej. Dla przykładu rozważmy układ równań: 2x1 + (2 + i)x2 + 2ix3 = 5 + 2i x1 + 2x2 + 2x3 = 4 + 4i x1 + 3x2 + x3 = 4 + 4i 1 Tak wi˛ec dla tego problemu złożenie macierzy A i wektora b ma postać: 2 2 + i 2 5 + 2i 2 4 + 4i [A b] = 1 2 1 3 1 4 + 4i Postać transponowana to: 2 2+i [A b]T = 2 5 + 2i 1 2 2 4 + 4i 1 3 1 4 + 4i Dla ułatwienia operacji czytania, zakładamy, że liczby zespolone podawane sa˛ w nawiasach klamrowych. Tak wi˛ec zamiast zapisu: 2 + 4.2i Stosować b˛edziemy zapis: {2+4.2i} Kolejnym ułatwieniem jest zapisywanie liczby w pełnej notacji niezależnie od tego czy cz˛eść rzeczywista lub urojona jest zerowa lub nie, np. 2 -> {2+0i}, 3i -> {0+3i}, i -> {0+1i}. Aby uprościć sobie prac˛e, warto zapisać dane w pliku i później czytać je z niego poprzez przekierowanie go na wejście standardowe programu. Taki sposób post˛epowania przedstawiony jest poniżej. jkowalsk@noxon: rozwiazanie> cat rownanie_liniowe_zesp.dat {2+0i} {2+1i} {2+0i} {5+2i} {1+0i} {2+0i} {2+0i} {4+4i} {1+0i} {3+0i} {1+0i} {4+4i} jkowalsk@noxon: rozwiazanie> ./uklad_rownan_zesp < rownanie_liniowe_zesp.dat Macierz A^T: {2+0i} {2+1i} {2+0i} {1+0i} {2+0i} {2+0i} {1+0i} {3+0i} {1+0i} Wektor wyrazow wolnych b: {5+2i} {4+4i} {4+4i} Rozwiazanie x = (x1, x2, x3): {4+0i} {0+1i} {0+1i} 2 Wektor bledu: Ax-b = ({4.76e-7+1.2e-8} {2.3e-7+1.45e-9i} {0-0i} {1.31e-8+0i}) Dlugosc wektora bledu: ||Ax-b|| = 5.289517e-07 jkowalsk@noxon: rozwiazanie>_ Uwaga: Dane o bł˛edzie maja˛ jedynie charakter pogladowy. ˛ Nie sa˛ to faktycznie wyliczone wartości. Ułożenie znaków w linii w przypadku wyświetlania macierzy, nie musi być idealnie równe, aby jeden wiersz długościa˛ pasował do drugiego. Przedstawiony przykład należy uznać za obligatoryjny (dla wariantu podstawowego), jeśli chodzi o wyświetlane informacje. 3.2 Materiały pomocnicze Plik zawierajacy ˛ przykładowe dane znajduje si˛e w katalogu ∼bk/edu/kpo/zad/z5. W katalogu tym znajduje si˛e również plik nagłówkowy do modułu liczb zespolonych, który należy zdefiniować w ramach przygotowania do zaj˛eć (patrz rozdział 4.1). 4 Zalecenia (ważne) Istniejace ˛ konstrukcje w j˛ezyku C++ pozwalaja˛ na niejawne konwersje typów. Jeżeli mechanizmy nie sa˛ świadomie stosowane lub nie sa˛ dobrze zrozumiane, to moga˛ prowadzić do bł˛edów działania programu, które b˛eda˛ bardzo trudne do zdiagnozowania. Aby tego uniknać ˛ należy zastosować zalecenia przedstawione poniżej. Nie zaleca si˛e definiowanie konstruktora jednoargumentowego postaci: LZespolona::LZespolona(float r); Zalecane jest natomiast zdefiniowanie konstruktora bezparametrycznego oraz dwuargumentowego, tzn. LZespolona::LZespolona(); LZespolona::LZespolona(float r, float i); 4.1 Wymagania co do konstrukcji programu Oprócz wymagań sformułowanych w opisie zadania należy uwzgl˛ednić uwarunkowania przedstawione poniżej. • Program musi zachować struktur˛e modułowa˛ i odpowiednia˛ struktur˛e kartotek. O ile b˛edzie to konieczne, należy zmodyfikować plik Makefile (np. gdy dodany zostanie nowy moduł - np. moduł liczb zespolonych). • Wszystkie metody, które nie zmieniaja˛ stanu obiektu, na którym działaja,˛ powinny być metodami typu const. • Wszystkie klasy i metody powinny być opisane. Oprócz tego pozostaja˛ w mocy wszystkie wcześniejsze wymagania dotyczace ˛ struktury katalogów, pliku Makefile, modułowej struktury programu, jak też opisów. 3 4.2 Rozszerzenia nieobowiazkowe ˛ Proponuje si˛e, aby odpowiednio rozbudować przecia˛żenie operatora >> dla wczytywana liczb zespolonych ze strumienia wejściowego, tak aby można było wczytywać je w uproszonej notacji, tzn. bez cz˛eści rzeczywistej, jeśli jest równa 0 i odpowiednio tak samo w przypadku cz˛eści urojonej, z pomini˛eciem liczby przy oznaczeniu cz˛eści urojonej, gdy jest ona równa 1 lub −1, np. {5i} {10} {2-i} {1+i} {i} {-i} 5 Przygotowanie do zaj˛eć 5.1 Tydzień 0 Należy przygotować zaczatek ˛ modułu liczb zespolonych. Plik nagłówkowy z wymienionym minimalnym zestawem metod i przecia˛żeń operatorów, które należy oprogramować znajduje si˛e na panamincie i diablo w katalogu w lokalizacji: ~bk/edu/kpo/zad/z5/lzespolona/lzespolona.hh Zawartość tego pliku to definicja klas LZespolona oraz zapowiedzi definicji metod jak poniżej: #ifndef LZESPOLONA_HH #define LZESPOLONA_HH #include <iostream> class LZespolona { double _re; double _im; public: LZespolona(); double double& double double& Re() const; Re(); Im() const; Im(); LZespolona LZespolona operator + (const LZespolona& operator * (const LZespolona& Arg2) const; Arg2) const; }; std::ostream& operator << ( std::ostream& const LZespolona& ); StrmWy, WyswietlanaLiczba #endif Należy stworzyć własny moduł lzespolna.cpp, w którym znajda˛ si˛e definicje metod oraz przecia˛żenia operatora « dla wyświetlania liczby na strumieniu wyjściowym. Nast˛epnie należy przetestować poprawność konstrukcji modułu kompilujac ˛ go i konsolidujac ˛ plikiem typu object znajdujacym ˛ si˛e na panamincie w lokalizacji: 4 ~bk/edu/kpo/zad/z5/test/test-lzespolona.o Przykład instrukcji (dla panaminta): g++ -g -Wall -std=c++11 -pedantic -I/home/bk/edu/kpo/zad/z5/lzespolona lzespolona.cpp\ /home/bk/edu/kpo/zad/test/test-lzespolona.o Aby nie wpisywać za każdym razem tej instrukcji, zalecane jest stworzenie sobie odpowiedniego pliku Makefile, Dla ułatwienia w kartotece bk/edu/kpo/zad/z5/zalazek został umieszczony zala˛żek modułu wraz z odpowiednim plikiem Makefile. Kartotek˛e t˛e należy przekopiować do swojej kartoteki. Utworzony program po uruchomieniu testuje poprawność implementacji poszczególnych metod i wypisuje odpowiedni wynik testu. Poniżej przedstawiona jest jego przykładowa postać: jkowalsk> ./a.out Test wyswietlenia wartosci: {5+2i} ... Dobrze! Test realizacji operacji: {4+2i} + {3+2i} = {7+4i} ... Dobrze! Test realizacji operacji: {1+2i} * {3+2i} = {-1+7i} ... Dobrze! jkowalsk> _ Test należy przeprowadzić w obecności prowadzacego. ˛ 5.2 Tydzień 1 Klasa LZespolona powinna zawierać definicje wszystkich niezb˛ednych metod. Należy przygotować diagram klas i diagram czynności w wersji elektronicznej z wykorzystaniem programu dia. Materiały do nauki posługiwaniem si˛e programem dia dost˛epne sa˛ na stronie kursu. Ponadto należy odpowiednio skonfigurować i utworzyć dokumentacj˛e w wersji elektronicznej za pomoca˛ programu doxygen. W dokumentacji tej powinny być umieszczone już rysunki diagramów. Należy to zrobić na podstawie przykładów demonstrowanych w materiałach do wykładu. 5.3 Tydzień 2 Rozliczenie si˛e z gotowego programu i rozpocz˛ecie nast˛epnego zadania (tydzień 0 dla zadania nr 6). 5