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