Dziś zajmujemy się układami równań liniowych w reprezentacji macierzowej.
Wykład będzie prowadzony prz tablicy, więc slajdów nie ma, ale potrzebne materiały ( i dużo więcej niż nam potrzeba) są dostępne w materiałach do wykładu z Metod numerycznych . Nas w szczególności interesują wykłądy 5 (eliminacja Gaussa) i 7 (uwarunkowanie problemu). Można też zajrzeć do wykładu 8 (macierze rzadkie), ale jest on o dla nas zdecydowanie zbyt obszerny, a jest to dla nas tylko temat niejako poboczny.
Jeśli chodzi o operacje algebry liniowej w pythonie, przydadzą nam się następujące biblioteki:
numpy.linalg – podstawowe operacje na macierzach, m.in. cond (A), det(A)
scipy.linalg – nieco więcej operacji na macierzach, m.in. hilbert(N), solve(A,B)
scipy.sparse.linalg – operacje na macierach rzadkich m.in. spsolve(A,B)
scipy.io – wczytywanie różnych ciekawych formatów – np. macierzy rzadkich w formacie matlaba loadmat(f)
Dodatkowo:
Warto zajrzeć pod adres https://notch.mimuw.edu.pl:8888/ gdzie zainstalowałem dla Państwa serwer jupyter. Można tam korzystać z wyświetlania seaborn, matplotlib i bokeh. Każdy z Państwa ma swój “notebook” do wykonywania obliczeń.
Zadania na laboratorium (ew. nierozwiązane jako praca domowa):
- Stwórz macierz Hilberta H[i,j]=1/i+j-1 i wyświetl ją przy pomocy serwera jupyter.
- Przypomnij sobie rozwiązywanie ukł. równań poprzez rozkład LU. Zaimplementuj ręcznię tę metodę (w wersji bez wyboru el. głównego) i spróbój rozwiązać tym sposobem układ postaci A= np.array([[1e-18,1.0],[1.0,2.0]]) B=np.array([1.0,4.0]). Porównaj wynik z wynikiem scipy.linalg.solve(A,B). Dlaczego w przypadku tej macierzy wybór elementu głównego ma takie znaczenie?
- Korzystając z metody scipy.rand(1000,1000) stwórz macierz losową. Użyj jej do przetestowania rozkładu macierzy LU (scipy.linalg.lu) w wersji z permutacją i bez. Rozwiąż taki układ (dla b=scipy.rand(1000)) przy pomocy scipy.linalg.solve()
- Załóżmy, że mamy teraz jedną macierz A (my użyjemy losowej) i bardzo wiele różnych warunków brzegowych B (my wylosujemy 1000). Spróbuj rozwiązać wszystkie układy równań powstałe z przyrównania tej samej macierzy A do wielu różnych wektorów B. Czy można zamiast korzystać wielokrotnie z funkcji solve() coś przyspieszyć? Np. korzystając z funkcji lu()?
- Duże macierze równań liniowych często powstają w problemach inżynierskich. Pobierz jedną z macierzy z kolekcji układów powstałych przy projektowaniu elementów samolotów Boeing (np. nr 38 ) i spróbuj wczytać ją jako macierz rzadką do ipython’a. Następnie rozwiąż ją dla losowych warunków brzegowych b.
http://www.cise.ufl.edu/research/sparse/matrices/Boeing/bcsstk38.html