Tomasz Twardowski Tomasz Zieliński czyli {T3Z} MeNu - Metody numeryczne Dla studentów TeleInfoElektro - Zima 2023/24 15 października 2023 AGH, Kraków Przedmowa Nasz cel: pisać krótko, zrozumiale, z mała˛ liczba˛ prostych, praktycznych przykładów. Profil zaj˛eć: • rozwiazywanie ˛ praktycznych, naukowo-technicznych problemów inżynierskich z użyciem komputera i algorytmów numerycznych, • korzystamy z przykładów problemów-zadań zaczerpni˛etych z różnych dziedzin (np. fizyki, statystyki, elektroniki i telekomunikacji, grafiki, ...), • nie zajmujemy si˛e dowodami matematycznymi i samodzielnym implementowaniem skomplikowanych algorytmów (tylko prostymi, pogladowymi), ˛ • koncentrujemy si˛e na świadomym, “madrym” ˛ korzystaniu z gotowych implementacji algorytmów, • pracujemy w nast˛epuj˛ecych środowiskach programowania: — wykład: Matlab, — laboratorium/projekt: Matlab, C/C++ lub Python z bibliotekami numerycznymi. Wykłady - tematyka: 1. Matlab — środowisko do obliczeń naukowo-technicznych: typy danych, program główny i funkcje, instrukcje sterujace, ˛ operacje na zbiorach. 2. Wprowadzenie do metod obliczeniowych — krótka historia, stało i zmiennopozycyjna reprezentacja liczb, dokładność obliczeń i bł˛edy, dobre i złe uwarunkowanie zadań obliczeniowych. 3. Macierze i zapis macierzowy — przypomnienie postawowych poj˛eć zwiazanych ˛ z macierzami i rachunkiem macierzowym, przykłady macierzowego zapisu wybranych problemów technicznych: 1) metoda potencjałów w˛ezłowych i pradów ˛ oczkowych, czyli I i II prawo Kirchhoffa dla obwodów elektrycznych, 2) równania splotowe dla układów dynamicznych, w szczególności kanałów telekomunikacyjnych, 3) modele autoregresyjne danych, 4) transformacje liniowe danych. 4. Rozwiazywanie ˛ układów równań liniowych — metody: wyznaczników (Cramera), eliminacji (Gaussa-Jordana, Gaussa) i podstawienia wstecz, dekompozycji macierzy (typu LU i Choleskiego), iteracyjne (Jacobiego, Gaussa-Seidla, Successive Overrelaxation (SOR)). 5. Interpolacja i ekstrapolacja — przybliżanie funkcji wielomianem (interpolacja, ektrapolacja, aproksymacja), interpolacja wielomianowa z dowolnymi w˛ezłami i w˛ezłami równoodległymi, wielomiany w zapisie Lagrange’a i Newtona, efekt Rungego, funkcje sklajane (splajny) i gładka interpolacja lokalna, interpolacja trygonometryczna, interpolacja 3D, ekstrapolacja. 6. Aproksymacja i nadokreślone układy równań liniowych — dopasowanie ciagłej ˛ funkcji (np. linii prostej, ogólniej wielomianu) do danych dyskretnych, aproksy- 3 4 Przedmowa 7. 8. 9. 10. 11. 12. 13. 14. macja: średniokwadratowa (np. regresja liniowa, suma ortogonalnych funkcji trygonometrycznych), jednostajna min-max (wielomiany Czebyszewa), Pade (iloraz dwóch wielomianów). Różniczkowanie i całkowanie funkcji — podstawy, numeryczne przybliżanie pochodnej (różniczkowanie wielomianu interpolujacego), ˛ filtry różniczkujace, ˛ różniczkowanie w 2D, numeryczne przybliżanie całki (kwadratury Newtona-Cotesa i Gaussa-Lagrange’a), całkowanie w 2D. Obliczanie wartości oraz wektorów własnych (eigen) i osobliwych (singular) macierzy — praktyczne znaczenie “inżynieskie” dekompozycji EVD/SVD macierzy (Eigen/Singular Value Decomposition), EVD: definicja i własności, przykłady zastosowania, klasyfikacja zadań, metoda pot˛egowa, transformacji przez podobieństwo oraz dekompozychi QR; SVD: definicja, interpretacja, przykład użycia. Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań i układów równań nieliniowych — przykłady zastosowań, ogólna metodologia rozwiazywania ˛ zadania, metody iteracji z otaczaniem i podziałem (bisekcja, regula-falsi), metody iteracji w obszarze otwartym (siecznej, stycznej Newtona-Raphsona), metody interpolacji/ekstrapolacji kwadratowej Mullera oraz odwrotnej interpolacji kwadratowej, przypadek układu równań nieliniowych. Optymalizacja - minimalizacja funkcji kosztu — zadanie optymalizacji i metody jego rozwiazania, ˛ proste metody szukania minimum funkcji (złotego podziału, Fibonacciego, interpolacji kwadratowej), metody gradientowe, czyli różniczkowe pierwszego rz˛edu (np. najwi˛ekszego spadku), metody różniczkowe drugiego rz˛edu (np. Newtona i quasi-Newtona), ich zastosowanie do minimalizacji nieliniowej najmniejszej sumy kwadratów, minimalizacja: z ograniczeniami, globalna, dyskretna, programowanie liniowe i kwadratowe. ODE - Rozwiazywanie ˛ równań różniczkowych zwyczajnych — przykład rozwiazania ˛ numerycznego równania różniczkowego Van der Pola z użyciem funkcji Matlaba, ogólna klasyfikacja algorytmów (ekstrapolacyjny, interpolacyjny), omównienie istniejacych ˛ funkcji Matlaba, algorytmy: Runngego-Kutty, AdamsaBashfortha, Adamsa-Moulona i Geara; kompletny przykład: analiza matematyczna i symulacyjna układu RLC. PDE - Rozwiazywanie ˛ równań różniczkowych czastkowych ˛ — analityczne i numeryczne rozwiazanie ˛ prostego równania (eliptyczne 1D); standardowe typy równań: 1) eliptyczne (np. Poissona, w szczególności Laplace’a, dotyczace ˛ statycznego pola potencału ze zródłem), 2) paraboliczne (np. dyfuzji), 3) hiperboliczne (np. falowe Maxwella); rodzaje warunków brzegowych (Dirichleta - wartość, Neumanna - pochodna); równanie dyfuzji (paraboliczne) i jego rozwiazanie ˛ jako przykład; metoda różnic skończonych i przykłady jej zastosowania: ustalony rozkład (pole) ciepła 1D i 2D (równanie eliptyczne Laplace’a), nieustalony przepływ ciepła (równanie paraboliczne dyfuzji), propagacja fali elektromagnetycznej 1D (równanie hiperboliczne Maxwella). Wybrane zagadnienie #1 — generowanie liczb pseudolosowych i metody Monte Carlo — generator liczb całkowitych o rozkładzie równomiernym R[0,P-1]: addytywny, multiplikatywny i kongruentny, transformowanie rozkładu losowego liczb rzeczywistych R[0,1] na inny rozkład (metoda odwracania dystrybuanty, przekształcenie Boxa-Mullera), binarne sekwecje pseudo-losowe PRBS (PseudoRandom Binary Sequences) i ich zastosowania, metody Monte Carlo z zaburzeniem losowym i ich zastosowania, np. podczas szukania minimum globalnego funkcji. Wybrane zagadnienie #2 — obliczanie wartości funkcji standardowych — generatory funkcji sin()/cos(): tablica LUT plus interpolacja, aproksymacja wielomianem (szeregiem Tayora) i funkcja˛ wymierna˛ (metoda Pade), oscylator programowy, w tym metoda p rotacji CORDIC; generatory funkcji ln(), log2 (), log10 (); przybliżanie funkcji () oraz ex wielomianem. Przedmowa 5 15. Wybrane zagadnienie #3 — obliczania numeryczne stałoprzecinkowe — wady arytmetyki liczb zmiennoprzecinkowych i zalety arytmetyki liczb stałoprzecinkowych, operacje arytmetyczne w implementacji stałoprzecinkowej, przykłady stałoprzecinkowej implementacji wybranych algorytmów (np. CORDIC, FFT), procesory/kontrolery stałoprzecinkowe. 16. Wybrane zagadnienie #4 — uczenie maszynowe — wprowadzenie; uczenie maszynowe i rozpoznawanie wzorców, typowy przykład rozpoznawania, regresja liniowa, regresja logistyczna, sieci neuronowe płytkie i głebokie, algorytm propagacji wstecznej bł˛edów. LAORATORIUM/PROJEKT. W zależności od organizacji zaj˛eć (tylko laboratorium ALBO laboratorium a po nim projekt) wykonywanych jest kolejno: • tylko laboratorium - 14 ćwiczeń laboratoryjnych, zwiazanych ˛ z pierwszymi 14 wykładami, • laboratorium+projekt - tylko pierwszych 10 ćwiczeń laboratoryjnych, zwia˛ zanych z pierwszymi 10 wykładami, po których studenci wykonuja˛ indywidualny, wybrany przez siebie projekt, dotyczacy ˛ jednego zagadnienia wybranego z wszystkich wykładów (dowolny j˛ezyk programowania). ZALICZENIE LABORATORIUM. Każdy student powinien wykonać wszystkie zadania, oznaczone jako (L), gdyż na ich podstawie b˛edzie oceniany. Dodatkowo może wykonać inne zadania wybrane przez siebie, co wpłynie na podniesienie oceny. Im trudniejsze zadanie, z wi˛eksza˛ liczba punktów { *, **, *** }, tym uzyskana ocena b˛edzie wyższa. Polecana literatura polska: • J. Brzózka, L. Dorobczyński, Matlab środowisko obliczeń naukowo-technicznych. PWN, Warszawa 2008. • Z. Fortuna, B. Macukow, J. Wasowski, ˛ Metody numeryczne. WNT, Warszawa 2005. • D. Kincaid, W. Cheney, Analiza numeryczna. WNT, 2006. • P. Rudra, Matlab 7 dla naukowców i inżynierów. PWN, Warszawa 2007. Polecana literatura zagraniczna: • S.C. Chapra, R.P. Canale, Numerical Methods for Engineers. Boston, McGrawHill, 2010. • G.H. Golub, Ch.F. Van Loan, Matrix Computations, Johns Hopkins University Press, Batlimore, 2013 • C. Moler, Numerical Computing with Matlab, PDF do pobrania: https:// www. mathworks.com/ moler/ chapters.html.html • J.H. Mathews, K.D. Fink, Numerical Methods Using Matlab. Upper Saddle River, Prentice-Hall, 2005. • W.H. Press, S.A. Teukolsky, W.T. Vetterling, B.P. Flannery, Numerical Recipes: The Art of Scientific Computing. Cambridge University Press, 2007. • W.Y. Yang, W. Cao, T.-S. Chung, J. Morris, Applied Numerical Methods Using Matlab. Wiley, Hoboken 2005. Życzymy przyjemnej lektury! Kraków, Październik 2023 Tomasz Twardowski Tomasz Zieliński Spis treści 1 Matlab - środowisko do obliczeń technicznych . . . . . . . . . . . . . . . . . . . . . . . 1.1 Zmienne i programy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Tablice - wektory i macierze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Instrukcje sterujace ˛ i warunki logiczne . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4 Funkcje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5 Zbiory - funkcje odczytu i zapisu danych . . . . . . . . . . . . . . . . . . . . . . . . . 1.6 Rysunki - wizualizacja danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7 Tryb live-script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.8 Alternatywne środowiska programowe . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.9 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 16 19 21 22 23 24 25 26 26 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń . . . . . . . . . 2.1 Historia obliczeń w pigułce - nie jesteśmy pierwsi . . . . . . . . . . . . . . . . . 2.2 Wybór j˛ezyka i środowiska obliczeniowego . . . . . . . . . . . . . . . . . . . . . . . 2.3 Komputerowe reprezentacje liczb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4 Komputerowe reprezentacje liczb - dodatkowe zadania . . . . . . . . . . . . . 2.5 Bł˛edy obliczeń ogólniej . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6 Przykłady zadań dobrze i źle uwarunkowanych . . . . . . . . . . . . . . . . . . . . 2.7 Matematyczny wskaźnik uwarunkowania zadania obliczeniowego . . . . 2.8 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 27 28 30 37 43 44 47 49 49 3 Macierze i zapis macierzowy równań . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Podstawowe własności macierzy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Przykłady zadań macierzowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1 Prawa Kirchhoffa w układach elektrycznych . . . . . . . . . . . . . . . 3.3.2 Równania splotowe w układach dynamicznych . . . . . . . . . . . . . 3.3.3 Modele autoregresyjne danych . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.4 Macierzowe transformacje liniowe . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 51 51 54 55 57 59 61 65 65 4 Dekompozycje macierzy i rozwiazywanie ˛ układów równań liniowych . . 4.1 Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Określone układy równań . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2 Nadokreślone układy równań . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.3 Aspekty obliczeniowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.4 Przykład zastosowania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Wybrane dekompozycje macierzy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 67 67 68 69 70 70 7 8 Spis treści 4.2.1 Dekompozycja LU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2 Dekompozycja Choleskiego . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3 Dekompozycja QR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Klasycze metody rozwiazywania ˛ układów równań liniowych . . . . . . . . 4.3.1 Demonstracja - użycie funkcji bibliotecznych . . . . . . . . . . . . . . 4.3.2 Metoda macierzy dołaczonej ˛ - minorów . . . . . . . . . . . . . . . . . . . 4.3.3 Metoda Cramera - wyznaczników . . . . . . . . . . . . . . . . . . . . . . . . 4.3.4 Metoda eliminacji i podstawienia . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 Efektywne metody rozwiazywania ˛ układów równań liniowych . . . . . . 4.4.1 Metoda dekompozycji LU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.2 Metoda dekompozycji QR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5 Zastosowania dekompozycji Choleskiego . . . . . . . . . . . . . . . . . . . . . . . . 4.6 Metody dla macierzy rzadkich - iteracyjne . . . . . . . . . . . . . . . . . . . . . . . . 4.7 Rozwiazywanie ˛ układów równań liniowych w Matlabie . . . . . . . . . . . . 4.8 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 72 73 74 74 75 75 76 81 81 81 82 84 86 86 87 5 Interpolacja i ekstrapolacja wielomianowa . . . . . . . . . . . . . . . . . . . . . . . . . . 89 5.1 Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 5.1.1 Definicja poj˛ecia interpolacji, aproksymacji i ekstrapolacji danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 5.1.2 Przykłady zastosowań interpolacji . . . . . . . . . . . . . . . . . . . . . . . . 91 5.2 Najprostsze zadanie interpoacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 5.3 Interpoacja wielomianowa - definicja i rozwiazanie ˛ . . . . . . . . . . . . . . . . 93 5.4 Interpolacja wielomianami Lagrange’a i Newtona . . . . . . . . . . . . . . . . . 95 5.4.1 Zastosowanie wielomianów Lagrange’a . . . . . . . . . . . . . . . . . . . 95 5.4.2 Zastosowanie wielomianów Newtona . . . . . . . . . . . . . . . . . . . . . 98 5.4.3 Przypadek w˛ezłów równoodległych . . . . . . . . . . . . . . . . . . . . . . . 101 5.4.4 Efekt Rungego . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 5.5 Funkcje sklejane i gładka interpolacja lokalna . . . . . . . . . . . . . . . . . . . . . 103 5.6 Wybrane przykłady interpolacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 5.6.1 Interpolacja 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 5.6.2 Interpolacja sygnałów cyfrowych . . . . . . . . . . . . . . . . . . . . . . . . . 110 5.7 Ekstrapolacja i inne nie omówione zaganienia . . . . . . . . . . . . . . . . . . . . . 111 5.8 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 6 Aproksymacja - rozwiazywanie ˛ nadokreślonych układów równań liniowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 6.1 Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 6.1.1 Nadokreślone układy równań Ax=b . . . . . . . . . . . . . . . . . . . . . . . 113 6.1.2 Rozwiazywanie ˛ nadokreślonych układów równań . . . . . . . . . . . 114 6.1.3 Scenariusze aproksymacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 6.1.4 Dopasowania funkcji do danych eksperymentalnych . . . . . . . . . 115 6.1.5 Przybliżenie przebiegu funkcji prostsza˛ funkcja˛ . . . . . . . . . . . . . 116 6.1.6 Przykłady zastosowań aproksymacji . . . . . . . . . . . . . . . . . . . . . . 116 6.2 Regresja liniowa - estymator LS sumy najmniejszych kwadratów . . . . 117 6.2.1 Regresja jednowymiarowa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 6.2.2 Regresja wielowymiarowa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 6.3 Aproksymacja z użyciem wielomianów ortogonalnych . . . . . . . . . . . . . 124 6.4 Aproksymacja jednostajna min-max wielomianami Czebyszewa . . . . . 128 6.5 Aproksymacja Pade funkcjami wymiernymi . . . . . . . . . . . . . . . . . . . . . . 130 6.6 Aproksymacja funkcja˛ nieliniowa˛ wzgl˛edem parametrów . . . . . . . . . . . 131 6.7 Przykład - projektowanie filtrów cyfrowych . . . . . . . . . . . . . . . . . . . . . . 132 6.8 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Spis treści 9 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 7 Różniczkowanie i całkowanie funkcji/danych . . . . . . . . . . . . . . . . . . . . . . . . 135 7.1 Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 7.2 Estymacja pochodnej i całki z 3 punktów . . . . . . . . . . . . . . . . . . . . . . . . . 136 7.3 Różniczkowanie numeryczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 7.3.1 Zastosowanie wielomianu interpolacyjnego w postaci Newtona138 7.3.2 Zastosowanie szeregu Taylora . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 7.3.3 Wrażliwość przybliżeń różnicowych na bł˛edy i zakłócenia danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 7.3.4 Problem różniczkowania zaszumionych danych rzeczywistych 141 7.3.5 Filtry różniczkujace ˛ w przetwarzaniu sygnałów . . . . . . . . . . . . . 142 7.3.6 Różniczkowanie w wielu wymiarach . . . . . . . . . . . . . . . . . . . . . . 144 7.4 Całkowanie numeryczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 7.4.1 Proste kwadratury Newtona-Cotesa . . . . . . . . . . . . . . . . . . . . . . . 146 7.4.2 Złożone kwadratury Newtona-Cotesa . . . . . . . . . . . . . . . . . . . . . 148 7.4.3 Adaptacyjny dobór kroku całkowania . . . . . . . . . . . . . . . . . . . . . 149 7.4.4 Kwadratury Gaussa-Lagrange’a . . . . . . . . . . . . . . . . . . . . . . . . . . 150 7.4.5 Całkowanie w wielu wymiarach . . . . . . . . . . . . . . . . . . . . . . . . . . 154 7.5 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy . . . 157 8.1 Wprowadzenie - przykłady zastosowań EVD . . . . . . . . . . . . . . . . . . . . . 157 8.2 Dekompozycja EVD: wartości i wektory własne macierzy . . . . . . . . . . 158 8.2.1 Definicja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 8.2.2 Przykłady liczbowe dla szczególnych macierzy . . . . . . . . . . . . . 159 8.2.3 Ważne właściwości i interpretacje . . . . . . . . . . . . . . . . . . . . . . . . 159 8.3 Praktyczne inżynierskie przykłady użycia EVD . . . . . . . . . . . . . . . . . . . 161 8.3.1 PCA - dekorelacja informacji wektorowej . . . . . . . . . . . . . . . . . . 161 8.3.2 Rozprz˛eganie różniczkowych układów równań stanu układów dynamicznych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 8.3.3 Rozrzut dwuwymiarowy wektora losowego . . . . . . . . . . . . . . . . 164 8.4 Wyznaczanie wartości i wektorów własnych . . . . . . . . . . . . . . . . . . . . . . 166 8.4.1 Klasyfikacja rodzajów zadań obliczeniowych i metod . . . . . . . . 166 8.4.2 Metoda pot˛egowa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 8.4.3 Metoda przekształceń macierzy przez podobieństwo . . . . . . . . . 168 8.4.4 Metoda dekompozycji QR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 8.5 Dekompozycja SVD: wartości i wektory osobliwe macierzy . . . . . . . . . 172 8.5.1 Definicja i interpretacja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 8.5.2 Przykłady zastosowań SVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 8.6 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 9 Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań nieliniowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 9.1 Wprowadzenie - równania i funkcje nieliniowe w technice . . . . . . . . . . 179 9.2 Wyznaczanie miejsc zerowych równania nieliniowego - trudności i podstawowe metody . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 9.3 Metody itercji w obszarze zamkni˛etym - z otaczaniem zera i podziałem przedziału . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 9.3.1 Metoda bisekcji połowienia przedziału . . . . . . . . . . . . . . . . . . . . 181 9.3.2 Metoda regula-falsi interpolacji liniowej . . . . . . . . . . . . . . . . . . . 183 9.4 Metody itercji w obszarze otwartym . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 9.4.1 Metoda siecznych - ekstrapolacji liniowej . . . . . . . . . . . . . . . . . . 184 10 Spis treści 9.4.2 Metoda Newtona-Raphsona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 9.4.3 Metoda Mullera ekstrapolacji-interpolacji kwadratowej . . . . . . 187 9.4.4 Metoda odwrotnej ekstrapolacji-interpolacji kwadratowej . . . . 188 9.5 Przypadek szczególny - miejsca zerowe wielomianu charakterystycznego macierzy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 9.6 Wyznaczanie miejsc zerowych funkcji w Matlabie - funkcja fzero() . . 190 9.7 Wybrane przykłady . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 9.8 Problem wielowymiarowy: rozwiazywanie ˛ układów równań nieliowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 9.9 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 10 Optymalizacja, czyli szukanie minimum funkcji . . . . . . . . . . . . . . . . . . . . . 201 10.1 Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 10.2 Gradient, hesjan, jakobian - definicja i użycie . . . . . . . . . . . . . . . . . . . . . 204 10.3 Przykłady prostych zadań optymalizacji do rozwiazania ˛ . . . . . . . . . . . . 206 10.4 Rodzaje zadań optymalizacyjnych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 10.4.1 Definicja optymalizacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 10.4.2 Minimum globalne funkcji wielu zmiennych . . . . . . . . . . . . . . . 207 10.4.3 Programowanie liniowe, kwadratowe, nieliniowe i dyskretne . . 207 10.5 Szukanie minimum funkcji jednoargumentowej . . . . . . . . . . . . . . . . . . . 208 10.6 Przykład złożonej optymalizacji jednoargumentowej . . . . . . . . . . . . . . . 212 10.7 Minimalizacja wieloargumentowa bez pochodnych . . . . . . . . . . . . . . . . 212 10.8 Metody gradientowe - użycie pochodnych . . . . . . . . . . . . . . . . . . . . . . . . 213 10.9 Metody różniczkowe drugiego rz˛edu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 10.10Metody różniczkowe drugiego rz˛edu dla nieliniowej najmniejszej sumy kwadratów (NLS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 10.11Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 11 ODE - Rozwiazywanie ˛ równań różniczkowych zwyczajnych . . . . . . . . . . 221 11.1 Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 11.2 Ogólna idea rozwiazywania ˛ równań różniczkowych . . . . . . . . . . . . . . . . 222 11.3 Przykład rozwiazywania ˛ równań różniczkowych w Matlabie . . . . . . . . 224 11.4 Algorytmy rozwiazywania ˛ równań różniczkowych [6] . . . . . . . . . . . . . . 226 11.4.1 Wprowadzenie - ogólna klasyfikacja stosowanych metod . . . . . 226 11.4.2 Algorytmy Rungego-Kutty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 11.4.3 Inne algorytmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 11.5 Układ RLC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 11.5.1 Analiza matematyczna układu RLC . . . . . . . . . . . . . . . . . . . . . . . 231 11.5.2 Typowa symulacja układu RLC w Matlabie . . . . . . . . . . . . . . . . 233 11.5.3 Nasza symulacja układu RLC - rozwiazanie ˛ układu równań różniczkowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 11.6 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 12 PDE - Rozwiazywanie ˛ równań różniczkowych czastkowych ˛ . . . . . . . . . . . 239 12.1 Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 12.2 Analityczne i numeryczne rozwiazanie ˛ równania różniczkowego [1] . . 240 12.3 Standardowe rodzaje równań różniczkowych czastkowych ˛ [3][7] . . . . . 243 12.4 Metoda różnic skończonych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 12.5 Przykłady użycia metody różnic skończonych . . . . . . . . . . . . . . . . . . . . . 246 12.5.1 Ustalony rozkład ciepła 1D - równanie Laplace’a . . . . . . . . . . . 246 12.5.2 Nieustalony przepływ ciepła 1D - równanie dyfuzji . . . . . . . . . . 248 12.5.3 Ustalony rozkład ciepła 2D - równanie Laplace’a . . . . . . . . . . . 250 Spis treści 11 12.5.4 Jednowymiarowa propagacja fali elektromagnetycznej równanie Maxwella . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 12.6 Zastosowanie wbudowanej funkcji Matlaba pdepe() . . . . . . . . . . . . . . . . 254 12.7 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 13 Generowanie liczb pseudolosowych i metody Monte Carlo . . . . . . . . . . . . 259 13.1 Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 13.2 Generatory liczb pseudolosowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 13.3 Transformacje rozkładów losowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 13.4 Binarne sekwencje pseudolosowe PRBS . . . . . . . . . . . . . . . . . . . . . . . . . 264 13.5 Przykłady zastosowań sekwencji PRBS w teleinformatyce . . . . . . . . . . 266 13.6 Metody Monte Carlo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 13.7 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 14 Obliczanie wartości funkcji standardowych . . . . . . . . . . . . . . . . . . . . . . . . . 275 14.1 Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 14.2 Generatory funkcji sinus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 14.3 Zastosowania generatorów funkcji sinus/kosinus . . . . . . . . . . . . . . . . . . 282 14.4 Obliczanie wartości funkcji logarytmicznych log2() i log10() . . . . . . . . 284 14.5 Przybliżanie wartości różnych funkcji wielomianem . . . . . . . . . . . . . . . 287 14.6 Zastosowania algorytmów obliczania funkcji . . . . . . . . . . . . . . . . . . . . . 287 14.7 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 15 Obliczania numeryczne stałoprzecinkowe . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 15.1 Wprowadzenie - komputerowe reprezentacje liczb . . . . . . . . . . . . . . . . . 291 15.2 Liczby zmiennoprzecinkowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 15.3 Liczby stałoprzecinkowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 15.4 Typ stałoprzecinkowy 16-to bitowy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 15.5 Podstawowe operacje arytmetyczne w implementacji stałoprzecinkowej . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 15.6 Wybór reprezentacji liczb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 15.7 Przykłady implementacji stałoprzecinkowej algorytmów . . . . . . . . . . . . 300 15.8 Procesory sygnałowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 15.9 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 16 Podstawy numeryczne sztucznej inteligncji . . . . . . . . . . . . . . . . . . . . . . . . . . 313 16.1 Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 16.1.1 Uczenie maszynowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 16.1.2 Sztuczne sieci neuronowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 16.1.3 Splotowe sieci neuronowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 16.1.4 Gł˛ebokie sieci neuronowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 16.2 Uczenie maszynowe klasycznie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 16.2.1 Program demonstracyjny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 16.2.2 Miary skuteczności rozpoznawania . . . . . . . . . . . . . . . . . . . . . . . 327 16.2.3 Ekstrakcja cech . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 16.2.4 Wybór klasyfikatora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 16.2.5 Przykład 1 - prosty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 16.2.6 Przykład 2 - K-fold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 16.3 Regresja liniowa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 16.4 Regresja logistyczna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 16.5 Sztuczne sieci neuronowe - płytkie i głebokie . . . . . . . . . . . . . . . . . . . . . 361 12 Spis treści 16.5.1 Zwiazek ˛ ANN z regresja˛ liniowa˛ i logistyczna˛ . . . . . . . . . . . . . . 361 16.5.2 Uczenie sieci ANN algorytmem back-propagation . . . . . . . . . . 366 16.5.3 Przykład . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 16.6 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 Rozdział 1 Matlab - środowisko do obliczeń technicznych Streszczenie Krótkie wprowadzenie do Matlaba: typy danych, wymiarowość danych (tablice), arytmetyka wektorowo-macierzowa, program główny i funkcje, instrukcje sterujace, ˛ operacje na zbiorach, wizualizacja, tryb pracy skryptowy i live-skryptowy. 1.1 Zmienne i programy Matlab jest interpreterem: uruchamiamy go, wybieramy na samej górze zakładk˛e HOME, potem Layout: Dafault i w oknie komend (Command Window) możemy pisać kolejne instrukcje, przedzielać je średnikiem oraz kończyć każda˛ lini˛e naciśni˛eciem na klawiaturze klawisza Enter, dokładnie tak samo jak komendy w linii komand systemu Windows i Linux. Na przykład: Listing 1.1: Pierwszy kod w interpreterze j˛ezyka Matlab >> a = 1; b = 3; c = a+b, [ENTER] c= 4 >> d = sqrt(c), [ENTER] d= 2 >> _ Po opuszczeniu interpretera Matlaba tracimy wszyskie wpisane instrukcje, dlatego lepiej jest pracować w trybie skyptowym, tzn. otworzyć edytor programów HOME, New, Scipt, tam wprowadzić wszystkie linie programu oraz zapisać utworzony skypt na dysku w zbiorze o rozszerzeniu .m, np. EDITOR, Save as matlab_start.m. Jest to sytuacja analogiczna jak w dowolym systemie opracyjnym: możemy w linii komend systemu napisać i wykonać sekwencj˛e różnych instrukcji konfiguracyjnych, jedna po drugiej, albo zapisać wszystkie instrukcje razem do jednego zbioru/skyptu typu batch, a potem kazać systemowi zbiorczo je wykonać, podajac ˛ tylko nazw˛e utworzonego zbioru. Na rysunku 1.1 jest przedstawione przykładowe okienko Matlaba w standardowym układzie: Editor | Command Window | Workspace, z edytowanym (modyfikowanym) programem po lewej stronie, interpreterem po środku oraz lista˛ zmiennych po prawej stronie. 13 14 1 Matlab - środowisko do obliczeń technicznych Rysunek 1.1: Okienko Matlaba z przykładowym programem. Przyjmijmy, że napisaliśmy nastepujacy program 1.2, b˛edacy ˛ modyfikacja˛ powyższego kodu, która została uzupełniona o: 1) komentarze, opis tego co robimy, czyli text poprzedzony znakiem %, 2) komendy usuwania wszystkich zmiennych (clear all; i rysunków (close all;) z pami˛eci przed wykonaniem programu (bardzo dobry zwyczaj!), 3) rozkaz wydruku kodu programu podczas jego wykonywania (echo on)√ oraz 4) definicj˛e liczby zespolonej (c=a+j*b, gdzie j to predefiniowana stała równa −1) oraz obliczenie jej sprz˛eżenia (d=conj(c)): Listing 1.2: Pierwszy program w j˛ezyku Matlab % Moj pierwszy program - to komentarz, tekst po znaku % % Program matlab_start.m clear all; close all; % zerowanie pamieci, usuwanie rysunkow echo on % wyswietlanie linii programu na ekranie a = 1; b = 3; c = a+b, d = sqrt(c), e = a + j*b, f = conj(e), whos % inicjalizacja zmiennych, nie wyswietlaj wyniku (poniewaz srednik ;) % oblicz +,-,*,/,^(potega), wyswietl wynik (poniewaz przecinek ,) % oblicz pierwiastek kwadratowy, wyswietl wynik (poniewaz przecinek ,) % liczba zespolona, j=sqrt(-1) % sprzezenie liczby zespolonej % wyswietlanie zawartosci pamieci % funkcje: log (zamiast ln), log2, log10, exp, sqrt, rem(a,b) % sin/cos/tan, asin/acos/atan, sinh/cosh/tanh, asinh/acosh/atanh Po wcześniejszym zapisaniu naszego dowolnego programu na dysku (Save as) i napisaniu w linii kommend nazwy tego programu (bez obowiazkowego ˛ rozszerzenia .m), w naszym przypadku matlab_start Enter, nasz program zostanie wczytany do Matlaba i wykonany. Musi być jednak “widziany” przez Matlaba, czyli znajdować si˛e w jego domyślnym katalogu dyskowym, którego nazwa jest wyświetlana na górze ekranu - co możemy sami ustawić (np. D :▶ Matlab ▶ Programy ▶ MetodyNumeryczne - patrz rys. 1.1) albo znajdować si˛e w jednym z katalogów, dla których została podana dla Matlaba ścieżka dost˛epu: HOME, Set path, Add Folder, np. D: \Matlab\Programy \MetodyNumeryczne. Napisanie w oknie komend rozkazu 1.1 Zmienne i programy 15 dir powoduje wyświetlenie nazw wszystkich zbiorów, znajdujacych ˛ si˛e w katalogu domyślnym. To pozwala nam w prosty sposób sprawdzić czy nasz program znajduje si˛e w nim. W j˛ezyku Matlab wszystkie zmienne sa˛ typu double (zapis zmiennopozyjny 64bitowy, cecha i mantysa), dlatego nie ma potrzeby dokonywania deklaracji typu zmiennych a,b,c,d. Komentarzem jest tekst, które wyst˛epuje po znaku procentu % — do końca linii. Wynik operacji zakończonej średnikiem “;” nie jest wypisywany na ekranie, natomiast zakończonej przecinkiem “,” - jest wypisywany. Program składa si˛e z: • opisu wst˛epnego (nagłówka) - co i jak liczymy, • czyszczenia pami˛eci/zawartości - usuwania wszystkich starych zmiennych i rysunków, • inicjalizacji wartości nowych zmiennych, np. a=1; b=3; (nazwy zmiennych, u nas a,b,c,d powinny nam pomóc rozpoznać znaczenie każdej zmiennej), • wykonywania prostych operacji arytmetycznych na zmiennych, np. c=a+b, c=a-b, c=a*b, c=a/b, c=aˆb (pot˛ ega), • obliczania wartości różnych funkcji na wartościach zmiennych, np. d=sqrt(c), ważne funkcje: sin, asin, sinh, asinh, cos, tan, sqrt, log, log2, log10, exp, • pokazywania wyniku obliczeń, np. w najprostszy sposób realizowane poprzez kończenie zapisu operacji przecinkiem, a nie średnikiem; możliwe użycie funkcji plot(x,y) dla wektorów (1D) oraz mesh(A); contour(A); imagesc(A) dla macierzy (2D) oraz plot3() dla danych 3D. Nazwy zmiennych powinny zaczynać si˛e od litery oraz różnić si˛e od wszystkich nazw zastrzeżonych, czyli nazw stałych predefiniowanych (np. pi czyli π) oraz wszystkich kommend (np. clear all; close all; echo on;) oraz funkcji wbudowanych/bibliotecznych. Aby zobaczyć jakie zmienne sa˛ aktualnie zdefiniowane w Matlabie oraz ile pami˛eci zajmuja,˛ należy użyć komendy whos. Aby sprawdzić jaka jest aktualna wartość konkretnej zmiennej, trzeba napisać jej nazw˛e i nacisnać ˛ klawisz Enter. Poprzedzajac ˛ powyższa˛ operacj˛e komenda˛ format ustawiamy sposób wydruku wartości zmiennej. Aby uzyskać pomoc na temat konkretnej komendy lub funkcji Matlaba, używany rozkazu help, np. piszac ˛ help format Enter otrzymamy informacje dotyczace ˛ użycia komendy format. Problem 1.1 (* Proste obliczenia w j˛ezyku Matlab). Napisz dowolny program, który oblicza cokolwiek. Przykładowo (do wyboru): 1) obwód (2πr) i powierzchni˛e (πr2 ) okr˛egu/koła o promieniu r, 2) powierzchni˛e (4πr2 ) i obj˛etość kuli ( 34 πr3 ) o promieniu r, 3) pr˛edkość samochodu vms w metrach na sekund˛e, znajac ˛ liczb˛e vkmh kilometrów na godzin˛e, 4) wymiary, szerokość d i wysokość h, telewizora c = 48, 55, 65, 75-calowego o proporcjach ekranu 16:9. Problem 1.2 ((L)*(*) Proste algebry w j˛ezyku Matlab). Oblicz pierwiastki (miejsca zerowe) równania ax2 + bx + c = 0 dla dowolnych, wybranych√przez ciebie wartości 2 parametrów (a, b, c), na podstawie znanego wzoru: p1,2 = −b± 2ab −4ac . Po obliczeniu wartości pierwiastków sprawdź czy rzeczywiście zeruja˛ one równanie kwadratowe. (*) Narysuj funkcj˛e f (x) = ax2 + bx + c dla wartości x z przedziału [−10, 10] za pomoca˛ komendy plot(x,f). Automatycznie znajdź i zaznacz na rysunku okr˛egiem najwi˛eksza˛ i najmniejsza˛ wartość funkcji w rozpatrywanym przedziale. Problem 1.3 (*** Proste zadanie optymalizacji w j˛ezyku Matlab). Napisz program do obliczenia wymiarów puszki napoju chłodzacego ˛ o kształcie walca (o promieniu r i wysokości h), która ma najwi˛eksza˛ obj˛etość V przy zadanym polu powierzchni całkowitej S, np. takiej samej jak pole powierzchni kartki papieru o wymiarach A4. 16 1 Matlab - środowisko do obliczeń technicznych 1.2 Tablice - wektory i macierze Nazwa Matlab wywodzi si˛e od dwóch angielskich słów: mathematics (alternatywnie matrix) oraz laboratory. W algebrze matematycznej podstawowa˛ rol˛e odgrywaja˛ operacje nie na pojedynczych liczbach tylko na ich uporzadkowanych ˛ sekwencjach: jednowymiarowych x(m), m = 1, 2, ..., M (wektorach poziomych albo pionowych), dwuwymiarowych x(m, n), m = 1, 2, ..., M, n = 1, 2, ..., N (macierzach składajacych ˛ si˛e z liczb, uporzadkowanych ˛ w wiersze i kolumny), trójwymiarowych x(m, n, k), m = 1, 2, ..., M, n = 1, 2, ..., N, p = 1, 2, ..., P (sekwencja P macierzy o wymiarach M × N). Matlab wspiera proste definiowanie i standardowe operacje na wektorach i macierzach. Aby w Matlabie zainicjalizować poziomy wektor liczb, np. h (ang. horizontal), to należy podać ich wartości w nawiasie kwadratowym i oddzielić je przecinkiem, np. h=[1,2,3] albo h=[a,b,c] - kiedy wartości zmiennych a,b,c zostały wcześniej zainicjalizowane. Natomiast kiedy liczby w nawiasie kwadratowym sa˛ oddzielone średnikiem, to otrzymamy pionowy wektor liczb, np. v=[4;5;6] (vertical). Macierze możemy składać z wektorów poziomych, umieszczajac ˛ je w kolejnych wierszach macierzy, np. H=[h1; h2; h3] i X=[1,2,3; 10,20,30; 100,200,300] (średnik oznacza przejście do nowego wiersza), albo z wektorów pionowych, umieszczajac ˛ je w kolejnych kolumnach macierzy np. V = [v1,v2,v3]. Po podstawieniu wartości Matlab pami˛eta wymiary wszystkich wektorów/macierzy i pozwala wykonywać na nich operacje matematyczne (+, -, *, /, ˆ), które domyślnie sa˛ wektorowo-macierzowe (wymiary argumentów musza˛ si˛e zgadzać!). Przykładowo, pomnożenie wektora poziomego h (jako pierwszy) przez wektor pionowy v (jako drugi), oba zdefiniowane powyżej, czyli obliczenie iloczynu skalarnego dwóch wektorów, da w wyniku tylko jedna˛ liczb˛e, czyli sum˛e iloczynów odpowiadajacych ˛ sobie elementów obu wektorów: 4 h · v = 1 2 3 · 5 = 1 · 4 + 2 · 5 + 3 · 6 = 32. 6 Natomiast iloczyn pionowego wektora v (jako pierwszy) przez poziomy wektor h (jako drugi), czyli obliczenie ich iloczynu wektorowego v*h, da w wyniku macierz o wymiarach 3 × 3, której elementy sa˛ uzyskane przez pomnożenie każdego elementu pierwszego wektora (u nas: 4,5,6 - kolejne wiersze) przez każdy element drugiego wektora (u nas 1,2,3 - kolejne kolumny). W tym przypadku jako wynik mnożenia wektorów otrzymamy macierz: 4 4 8 12 v · h = 5 · 1 2 3 = 5 10 15 6 6 12 18 Poniżej pokazano zawartość ekranu podczas interaktywnego prowadzenia opisanych powyżej obliczeń w j˛ezyku Matlab. Listing 1.3: Interaktywna definicja wektorów Wektory i macierze w Matlabie >> h = [1,2,3], [ENTER] h= 1 2 3 >> v = [4;5;6], [ENTER] 1.2 Tablice - wektory i macierze 17 v= 4 5 6 >> a=h*v, [ENTER] a= 32 >> A=v*h, [ENTER] A= 4 8 12 5 10 15 6 12 18 >> a=A*v, {ENTER] a= 128 160 192 >> b=h*A, [ENTER] b= 32 64 96 >> B=A*A, [ENTER] B= 128 256 384 160 320 480 192 384 576 Problem 1.4 (* Sprawdzenie poprawności operacji mnożenia wektorów i macierzy w Matlabie). Obliczenia przedstawione powyżej sa˛ przeprowadzane w programie matlab_basics.m. Zmodyfikuj ten program: użyj wektorów czteroelementowych. Sprawdź poprawność wszystkich wyników obliczeń. Spróbuj wykonać nast˛epujace ˛ operacje: h*h, v*v, v*A, A*h. Dlaczego Matlab protestuje? Jak już było zaznaczone, Matlab pami˛eta wymiary zainicjalizowanych wektorów i macierzy oraz wykonuje na nich operacje, domyślnie wektorowo-macierzowe, jeśli jest to możliwe (kiedy zgadzaja˛ si˛e wymiary). W przeciwnym przypadku, zgłasza bład. ˛ Czasami należy wykonać operacj˛e transpozycji (.’) wektora/macierzy (zamian˛e wierszy z kolumnami), co w Matlabie jest sygnalizowane sekwencja˛ znaków kropka-apostrof, np. y=x.’; B=A.’; (sam apostrof oznacza dwie operacje: transpozyj˛e oraz sprz˛eżenie zespolone liczb). Długość wektora v sprawdzamy instrukcja˛ length(v), natomiast wymiar macierzy A instrukcja˛ size(A). Możemy zainicjalizować pojedyncze wartości jakiejś macierzy, np. A(3,4)=10 w takim przypadku zostanie utworzona macierz A o 3 wierszach i 4 kolumnach, majaca ˛ wszystkie elementy równe zero oprócz tego ustawionego na 10. Możemy pobrać pojedynczy element macierzy piszac ˛ nazw˛e macierzy oraz współrz˛edne położenia interesujacego nas elementu, np. a=A(3,4). Jeśli chcemy wykonać operacj˛e na odpowiadajacych ˛ sobie elementach dwóch wektorów/macierzy, a nie wektorowo-macierzowo, to sygnalizujemy to poprzez dodanie kropki przed znakiem tej operacji. Przykładowo, możemy pomnożyć odpowiadajace ˛ sobie elementy dwóch wektorów/macierzy albo podnieść do pot˛egi etementy jakiegoś wektora/macierzy: h .* v’ = [ 1 2 3 ] .* [ 4 5 6 ] = [ 4 10 18 ] h .ˆ 2 = [ 1 2 3 ] .ˆ 2 = [ 1 4 9 ] 18 1 Matlab - środowisko do obliczeń technicznych W Matlabie jest dost˛epnych wiele funkcji wykonywanych na wektorach i macierzach. Jeśli jakaś funkcja nie jest zdefinowana dla całej macierzy, to jest wykonywana oddzielnie na jej wszystkich kolumnach, np. suma, iloczyn, wartość średnia, odchylenie standardowe. Do najważniejszych można zaliczyć nast˛epujace: ˛ • sum() - suma elementów wektora, suma elementów w kolumnach macierzy, • cumsum() - jak wyżej tylko kumulowana suma, • prod() - iloczyn elementów wektora, iloczyn elementów w kolumnach macierzy, • cumprod() - jak wyżej tylko kumulowany iloczyn, • mean(), std() - wartość średnia, odchylenie standardowe, • diag(), det(), poly(), inv() - diagonalna, wyznacznik, wielomian charakterystyczny i odwrotność macierzy. Problem 1.5 (* Abecadło obliczeń wektorowo-macierzowych w Matlabie). Program 1.4 w sposób skrótowy prezentuje zbiorczo podstawowe “smaczki” prowadzenia obliczeń wektorowo-macierzowych w j˛ezyku Matlab. Wymagane jest jego przeanalizowanie, uruchomienie i uważne prześledzenie otrzymywanych wyników. Zmień wektory 3 na 4-elementowe i odpowiednio zmodyfikuj program. Problem 1.6 ((L)*(*)(*) Audio-Video Fun). Skorzystaj z programu 1.4. Wygeneruj N=256-elementowe wektory h,v. Pierwszy z nich, poziomy, powinien zawierać 2 okresy sinusoidy (128 próbki na okres, np. h=sin(2*pi/128*(0:N-1))), a drugi, pionowy, 4 okresów (64 próbki na okres). Narysuj oba wektory (plot(h)), oblicz ich iloczyn wektorowy i pokaż kształ wynikowej macierzy (mesh(A)). (*) Wczytaj do Matlaba dwa różne, krótkie (np. 1000 liczb) fragmenty jakiegoś nagrania dźwi˛ekowego wektor liczb (np. [v]=audioread(’mowa.wav’,[start,stop]); [v]=audioread(’muzyka.wav’,[from,to]), narysuj je. Spróbuj wykonać jakieś operacje na wektorach obu nagrań. Oblicz ich iloczyn wektorowy oraz wyświetl wynikowa˛ macierz. (*) Wczytaj do Matlaba dowolny obraz [A]=imread(’test.xxx’) (xxx = bmp, tif, jpg, png) i wyświetl wartości elementów macierzy pikseli za pomoca˛ funkcji mesh(A), imagesc(A). Badź ˛ czujny: może zajść konieczność konwersji palety kolorów lub płaszczyzn kolorów RGB. Spróbuj wykonać jakieś funkcje na macierzy wartości pikseli obrazu. Listing 1.4: Wektory i macierze w Matlabie % Wektory i macierze w Matlabie % Program matlab_matrices.m clear all; close all; % zerowanie pamieci, usuwanie rysunkow echo on % wyswietlanie linii programu na ekranie % Definiowanie wektorow i macierzy h = [ 1, 2, 3 ], % wektor poziomy h, elementy oddzielone przecinkiem v = [ 4; 5; 6 ], % wektor pionowy v, elementy oddzielone srednikiem H = [ h; h; h ], % macierz H jako wynik skladania poziomych wierszy V = [ v, v, v ], % macierz V jako wynik skladania pionowych kolumn ht = h’, Ht = H’, % (’) transpozycja plus sprzezenie zespolone (.’) tylko transpozycja A = rand(3,3), % macierz A (liczb losowych) o wymiarach 3x3 B = A(2:3,2:3), % macierz B jako wycinek macierzy A: od 2-go do 3-go wiersza/kolumny Nh = length(h), % liczba elementow wektora h 1.3 Instrukcje sterujace ˛ i warunki logiczne [M,N] = size(H), 19 % wymiary macierzy H % Operacje wektorowo-macierzowe liczba = h*v, % iloczyn skalarny: wektor poziomy razy pionowy -> jedna liczba macierz = v*h, % iloczyn wektorowy: wektor pionowy razy poziomy -> macierz wektor1 = H*v, % iloczyn macierzy i wektora pionowego wektor2 = h*H, % iloczyn wektora poziomego i macierzy HdV = H+V, HmV = H*V, % dodawanie i mnozenie macierzy C(4,4) = h(1)+V(2,3), % suma jednego elementu wektora h oraz macierzy V % Operacja poprzedzona "." jest wykonywana na odpowiadajacych sobie elementach % dwoch wektorow lub macierzy potega = h.^2, % druga potega kazdego elementu wektora h iloczyn = h .* v’, % iloczyn odpowiadajacych sobie elementow dwoch wektorow iloraz = V ./ H, % iloraz odpowiadajacych sobie elementow dwoch macierzy % Przykladowe funkcje wykonywane na wektorach/macierzach hsum = sum(h), % suma wszystkich elementow wektora h hcumsum = cumsum(h), % kumulowana suma wszystkich elementow wektora h hmult = prod(h), % iloczyn wszystkich elementow wektora h hcumprod = cumprod(h), % kumulowany iloczyn Vmean = mean(V), % wartosc srednia poszczegolnych kolumn macierzy V Vstd = std(mean(V)), % odch. standardowe wartosci srednich kolumn macierzy V di = diag(A), % elementy lezace na przekatnej macierzy A de1 = det(A), % wyznacznik macierzy kwadratowej p = poly(A), % wspolczynniki wielomianu charakterystycznego macierzy A r = roots(p), % pierwiastki (miejsca zerowe) tego wielomianu de2 = prod(r), % wyznacznik macierzy jako iloczyn pierwistkow, porownaj z de1 Ainv = inv(A), % odwrotnosc macierzy I = A*inv(A), % powinna byc macierz identycznosciowa b=A*v, vest=inv(A)*b, % oblicz v, znajac watosci macierzy A oraz wektora b whos % pokazanie zawartosci pamieci 1.3 Instrukcje sterujace ˛ i warunki logiczne Aby móc zapisać w programie algorytmy, które sprawdzaja˛ czy sa˛ spełnione określone warunki logiczne, np. mniejszości/równości/wi˛ekszości, i w zależności od tego wykonuja˛ różne fragmenty programu, np. kod A/B/C, cz˛esto wielokrotnie powtarzajac ˛ wybrane fragmenty instrukcji, potrzebne jest istnienie w konkretnym j˛ezyku programowania określonych instrukcji sterujacych/kontrolnych. ˛ Należy do nich zaliczyć instrukcje p˛etli, np. for-end i while-end, oraz instrukcje wykonania warunkowego fragmentów kodu, np. if-elseif-else-end i switch-case-otherwise-end. W Matlabie relacje logiczne pomi˛edzy zmiennymi a i b oraz suma, koniunkcja oraz zaprzeczenia warunków logicznych sa˛ zapisywane w sposób nast˛epuj˛ecy: • • • • • • • • • a == b - równe, a ˜= b - różne, a > b - wi˛eksze, a >= b - wi˛eksze lub równe, a < b - mniejsze, a <= b - mniejsze lub równe, warunek1 | warunek2 - suma logiczna (OR), warunek1 & warunek2 - iloczyn logiczny (AND), ˜warunek - zaprzeczenie/negacja warunku. 20 1 Matlab - środowisko do obliczeń technicznych P˛etla for-end. Struktura oraz konkretny sposób użycia jest podany poniżej: for variable=expression, operation; operation; ...; end for n=1:2:9, a(n)=sqrt(n); b(n)=nˆ2; end W przykładzie zmienna n zmienia swoja˛ wartość od 1 co 2 do 9, czyli kolejno jest równa 1,3,5,7,9. Dla każdej wartości jest obliczany jej pierwiastek kwadratowy oraz druga pot˛ega. Wyniki obliczeń sa˛ podstawiane, odpowiednio, do kolejnych elementów wektorów a(n) i b(n). Należy zwrócić uwag˛e, że elementy obu wektorów o numerach 2,4,6,8 maja˛ wartości równe zero jeśli wcześniej ich wartości nie zostały zainicjalizowane. P˛etla while-end. Struktura oraz konkretny sposób użycia jest podany poniżej: while(condition), operation; operation; ...; end n=0; a=1; while(a>0), n=n+1, a=a/10; end W przykładzie zmienna a jest poczatkowo ˛ równa 1, a potem jest wielokrotnie dzielona przez 10, aż wreszcie staje si˛e równa 0. Ma to miejsce dla n=324. Czyli ostatnia liczba niezerowa była równa 10−323 . Warunek if-elseif-elseif-else-end. Struktura oraz konkretny sposób użycia jest podany poniżej: if(cond1), oper1; elseif(cond2), oper2; else oper3; end if(a>1), x=aˆ2; elseif(a>=0 & a<=1), x=a; else, x=0; end W przykładzie jeśli zmienna a jest wi˛eksza od 1, to jako wartość zmiennej x przyjmuje si˛e druga˛ pot˛eg˛e zmiennej a. Dla wartości a z przedziału obustronnie zamkni˛etego [0, 1] (wi˛eksze lub równe 0 oraz mniejsze lub równe 1), wartość zmiennej x jest równa wartości zmiennej a. Natomiast w pozostałym przypadku, tzn. dla a mniejszego od 0, x jest równe 0. Warunek switch-case-case-otherwise-end. Struktura oraz konkretny sposób użycia jest podany poniżej: switch(cond), case val1, oper1; case val2, oper2; otherwise, oper3; end switch(x), case 1, disp(’1’); case 2, disp(’2’); otherwise, disp(’nie 1, 2’); end switch(x), case ’a’, disp(’a’); case ’b’, disp(’b’); otherwise, disp(’nie a, b’); end W powyższym przykładzie jeśli zmienna x jest liczba˛ (np. x=1.23), to w przypadku kiedy przyjmuje ona wartości 1 albo 2, to zostaje to wypisane na ekranie dla wszystkich pozostałych wartości otrzymujemy komunikat nie 1, 2. Natomiast kiedy x jest litera˛ lub dłuższym tekstem (np. x=’abc’), to w przypadkach x=’a’ oraz x=’b’ zostaje to potwierdzone na ekranie - dla wszystkich pozostałych przypadków otrzymujemy komunikat nie a, b. Program z listingu 1.6 prezentuje kolejne przykłady użycia instrukcji sterujacych ˛ i operatorów logicznych w j˛ezyku Matlab. Listing 1.5: Przykład użycia instrukcji sterujacych i operatorów logicznych w j˛ezyku Matlab 1.4 Funkcje 21 % Program matlab_control.m clear all; close all; % zerowanie pamieci, usuwanie rysunkow % Petla FOR, warunek IF M=3; N=5; % inicjalizacja wymiarow wektora/macierzy for m=1:M % poczatek petli po "m" x(1,m)=m; % m-ty element poziomego wektora M-elementowego for n=1:N % poczatek petli po "n" (m-ty wiersz, n-ta kolumna) if(m<n) A(m,n)=2; % jesli warunek jest spelniony to podstaw 2 elseif(m==n) A(m,n)=1; % jesli warunek jest spelniony to podstaw 1 else A(m,n)=0; % w przeciwnym przypadku podstaw 0 end % koniec warunku (m<n) end % koniec petli po "n" end % koniec petli po "m" x, A, % pokaz wektor i macierz b = x*A, % pomnoz wektor (1,M) przez macierz (M,N) % Petla WHILE x = 0 : 0.1 : 0.5; xmean = sum(x)/length(x); nr = 1; while( x(nr) < xmean ) nr = nr + 1; end x, xmean, ostatni = nr-1, % wartosci elementow wektora: od-krok-do % oblicz wartosc srednia, inaczej mean(x) % nr - numer elementu, na poczatku rowny 1 % jesli wartosc x(n) jest mniejsza od sredniej, % to zwieksz numer elementu % oraz po raz kolejny sprawdz warunek % pokaz numer ostatniego elementy spelniajacego warunek % Warunek SWITCH opcja = ’tAk’; % ’tak’, ’nie’, ’cokolwiek’ switch( lower(opcja) ) case ’tak’, disp(’Wybrano opcje: TAK’); case ’nie’, disp(’Wybrano opcje: NIE’); otherwise, disp(’Niepoprawna opcja’); end liczba = 1; % 1, 2, cokolwiek switch( liczba ) case 1, disp(’Liczba: 1’); case 2, disp(’Liczba: 2’); otherwise, disp(’Niepoprawna liczba’); end 1.4 Funkcje Ponieważ pewne obliczenia moga˛ si˛e powtarzać, to lepiej zamknać ˛ je wewnatrz ˛ funkcji i wielokrotnie wywoływać w różnych miejscach tego samego programu lub z innych programów. Funkcja Matlaba jest oddzielnym skryptem, rozpoczynajacym ˛ si˛e od słowa function, po którym nast˛epuje: 1) określenie zmiennych wyjściowych (przed nazwa˛ funkcji wewnatrz ˛ nawiasów kwadratowych), 2) znak równości, 3) nazwa fukcji, 4) określenie zmiennych wejściowych (po nazwie funkcji wewnatrz ˛ nawiasów okragłych), ˛ przykładowo: function [wy1,wy2]=funName(we1,we2,we3). Zadaniem funkcji jest wyliczenie wartości wyjściowych na podstawie wejściowych, np. wy1=we1*we2; wy2=we2+we3;. Funkcja ma także dost˛ep do wartości zmiennych zadeklarowanych jako globalne, np. global a b c. W programie głównym zmienne wejściowe i wyjściowe moga˛ nazywać si˛e inaczej niż w definicji funkcji, dlatego wywołanie funkcji może być nast˛epujace: ˛ [x,y]=funName(a,b,c); [x1,x2]=funName(a1,a2,a3);. Informacja o wymiarach wejściowych wektorów i macierzy jest przekazywana do funkcji. 22 1 Matlab - środowisko do obliczeń technicznych W programie 1.6 przedstawiono podstawy użycia funkcji w środowisku Matlab. W nowszych wersjach Matlaba poszczególne funckcje nie musza˛ być oddzielnymi skryptami dyskowymi, ale moga˛ wyst˛epować bezpośrednio za programem głównym w blokach function-end. Krótkie funkcje używane wielokrotnie podczas wykonywania jakieś programu moga˛ być zdefiniowane na jego poczatku ˛ w sposób uproszczony z użyciem operatora . Przykładowo w lini 9 poniższego programu jest zdefiniowana funkcja o nazwie funName, argumentach (x,y) oraz stałych a,b. Podczas jej wywołania w linii 10 używamy nazwy funkcji oraz warości przekazywanych argumentów: 0.1 dla x oraz 0.2 dla y. Listing 1.6: Przykłady definiowania i używania funkcji w Matlabie % Program matlab_mainfun.m % Program glowny wywolujacy funkcje matlab_fun() clear all; close all; a=1; b=3; % pojedyncze zmienne u=(1:3)’; v=(3:-1:1); % wektor pionowy u=[1;2;3] i poziomy v=[3,2,1] A=reshape(1:9,3,3); % macierz A o wymiarach 3x3, w kolumnach liczby od 1 do 9 [x,y,z] = matlab_fun(a,b,u,v,A), % wywolanie funkcji funName = @(x,y) a*x+b*y; % funkcja typu "anonim", argumenty (x,y), stale (a,b) wynik = funName(0.1,0.2), % oblicz dla x=0.1, y=0.2 %########################################################################## function [wy1,wy2,wy3] = matlab_fun(we1,we2,we3,we4,we5) % opis funkcji wyswietlany przez komende "help matlab_fun" % "Wielki Brat" wszystko widzi i pamieta wy1 = we1+we2; wy2 = we3*we4; wy3 = we5*we3; % suma dwoch skalarow % iloczyn wektora pionowego i poziomego % iloczyn macierzy i wektora pionowego end 1.5 Zbiory - funkcje odczytu i zapisu danych Programy obliczeniowe potrzebuja˛ danych wejściowych, zaś same generuja˛ dane wyjściowe. Program powinien mieć możliwość wczytania i zapisania danych - zbiorów liczb. W Matlabie wszystkie albo wybrane wartości zmiennych moga˛ zostać w dowolnej chwili zapisane do binarnego zbioru o rozszerzeniu .mat oraz odtworzone na podstawie tego zbioru - patrz opis komend save oraz load, np. help save. Wartości poszczególnych wektorów i macierzy można także wczytać ze zbiorów tekstowych ASCII oraz zapisać do takich zbiorów. Niezb˛edne szczegóły sa˛ podane w poniższym programie. Powodzenia! Listing 1.7: Przykłady operacji wejścia i wyścia w Matlabie % Program matlab_files.m clear all; close all; x = 0 : pi/100 : 2*pi; % argument funkcji: wiele wartosci od-krok-do y = sin( x ); % funkcja: wiele wartosci figure; plot(x,y,’bo-’); xlabel(’x’); ylabel(’y’); title(’F1: y=f(x)’); grid; save( ’myFile.mat’ ); clear all; whos; pause % zapisz wartosci wszystkich zmiennych do zbioru myFile.mat % wyzeruj pamiec, sprawdz, ze nic nie ma 1.6 Rysunki - wizualizacja danych 23 load( ’myFile.mat’ ); % wczytaj wartosci wszystkich zmiennych ze zbiou figure; plot(x,y,’bo-’); xlabel(’x’); ylabel(’y’); title(’F2: y=f(x)’); grid; xy = [ x’ y’]; % zbuduj macierz dwukolumnowa xy save(’myFile.dat’,’xy’,’-ascii’,’-double’); % zapisz xy do zbioru myFile.dat clear all; whos; pause % wyzeruj, sprawdz load( ’myFile.dat’ ); % wczytaj x=myFile(:,1); y=myFile(:,2); % odtworz wektory x, y z macierzy myFile figure; plot(x,y,’bo-’); xlabel(’x’); ylabel(’y’); title(’F3: y=f(x)’); grid; 1.6 Rysunki - wizualizacja danych Najlepszym sposobem sprawdzenia wartości danych danych, tak wejściowych jak wyjściowych, jest ich wizualizacja. Matlab udost˛epnia nast˛epujace ˛ funkcje rysowania dla: 1. 1D (wektorów): plot(x,y), semilogx(x,y); semilogy(x,y); loglog(x,y); wektor y jako funkcja argumentu-wektora x z osiami w skali liniowej albo logarytmicznej, 2. 2D (macierzy 2-wymiarowych, powierzchi): mesh(X,Y,Z); contour(X,Y,Z);imagesc(x,y,Z); macierz Z jako funkcja argumentów-macierzy X i Y albo argumentów-wektorów x i y; w pierwszym przypadku siatka argumentów jest dowolna, 3. 3D (macierzy 3-wymiarowych - brył): plot3(X,Y,Z). Każdy rysunek może mieć: 1. tytuł, np. title(’y=f(x)’), 2. opis osi x,y,z, np. dla osi x i y: xlabel(’czas [s]’), ylabel(’predkosc [km/h]’), 3. podana˛ minimalna˛ i maksymalna˛ wartość na każdej osi: axis([xmin,xmax,ymin,ymax]), np. axis([0,20,0,200]) 4. podziałk˛e (kratk˛e), tzw. grid, umożliwiajac ˛ a˛ szybszy odczyt wartości. Na pojedynczym rysunku 1D: • • • • • kilka krzywych (np. plot(x1,y1,’bo-’,x2,y2,’r*-’), może być narysowanych różnymi kolorami (’r’,’b’,’g’,’k’,...), różnymi rodzajami linii (’-’,’-’,’.-’,...), oznaczonych różnymi symbolami (’o’,’*’,’ˆ’,’s’,...), i mieć legend˛e, np. legend(’pierwsze’,’drugie’,’trzecie’). . Domyślnie każdy kolejny rysunek zast˛epuje poprzedni. Aby tak si˛e nie stało, musimy przed rysunkiem dodać komend˛e figure. Domyślnie każdy rysunek jest pojedynczy, ale możemy utworzyć multi-rysunek, majacy ˛ w wierszy i k kolumn, czyli w · k pod-rysunków, które sa˛ numerowane wierszami. Przykładowo subplot(2,3,4) oznacza 2 wiersze po 3 rysunki, czyli łacznie ˛ 6 pod-rysunków, oraz odnoszenie si˛e do 4 rysunku, czyli pierwszego w drugim wierszu. Program z listingu 1.8 wprowadza nas w świat wizualizacji danych w j˛ezyku Matlab. Wygenerowane przez niego wykresy 1D i 2D sa˛ pokazane na rys. 1.2. 24 1 Matlab - środowisko do obliczeń technicznych Listing 1.8: Przykłady prezentacji wyników w Matlabie % Program matlab_figures.m clear all; close all; x = -3*pi : pi/10 : 3*pi; % argument y1 = exp( -0.1*x.^2 ); % gaussoida y2 = y1 .* cos( x ); % gaussoida razy kosinusoida figure; plot(x,y1,’bo-’,x,y2,’r*-’); grid; xlabel(’x’); ylabel(’y’); legend(’y1(x)’,’y2(x)’); title(’F1: y1=f1(x), y2=f2(x)’); y = x’; X = repmat( x, length(x), 1); Y = repmat( y, 1, length(x)); Z = exp( -0.1*(X.^2 + Y.^2) ) .* cos( sqrt(X.^2+Y.^2) ); figure; plot3(X,Y,Z); xlabel(’x’); ylabel(’y’); zlabel(’z’); title(’plot3 (x,y,z)’); figure; mesh(X,Y,Z); xlabel(’x’); ylabel(’y’); zlabel(’z’); title(’mesh z=f(x,y)’); figure; contour(X,Y,Z); xlabel(’x’); ylabel(’y’); zlabel(’z’); title(’contour z=f(x,y)’); figure; imagesc(x,y,Z); xlabel(’x’); ylabel(’y’); zlabel(’z’); title(’imagesc z=f(x,y)’); figure; % (liczba wierszy, liczba kolumn, numer rysunku - poziomo). subplot(121); plot(x,y1,’bo-’,x,y2,’r*-’); % (121) - rys. lewy subplot(122); mesh(X,Y,Z); % (122) - rys. prawy F1: y1=f1(x), y2=f2(x) 1 y1(x) y2(x) y 0.5 0 -0.5 -10 -8 -6 -4 -2 0 2 4 6 8 10 x Rysunek 1.2: Rysunki otrzymane z programu 1.8. 1.7 Tryb live-script Program Matlab umożliwia także prac˛e z programami w trybie live-script, który jest odpowiednikiem Jupyter Notebook, JupyterLab (zobacz w https:// jupyter.org/ ) oraz Google Colab. Tryb ten umożliwia deklarowanie oddzielnych fragmentów programu: 1) tekstu (opisu programu z edycja˛ równań w Letex-u oraz z importem elementów graficznych typu równania/rysunki), 2) oddzielnych sekcji programu (w ramkach z szarym tłem), które moga˛ być uruchamiane oddzielnie. Po prawej stronie sa˛ wyświetlane wyniki obliczeń oraz rysunki. Zapisane na dysku programy, napisane w trybie live-script, maja˛ rozszerzenie .mlx. Programy wraz z opisem i wynikami można eksportować do zbiorów PDF, DOCX (Word) oraz TEX (Latex). Na rysunku 1.3 pokazano proces edycji (zakładki LIVE EDITOR i INSERT) oraz uruchamiania (Run, Run section, Run to End programu. 1.8 Alternatywne środowiska programowe 25 Rysunek 1.3: Okienko Matlaba z przykładowym programem uruchamianym w trybie live-script. 1.8 Alternatywne środowiska programowe Środowisko Matlab jest płatne. Nie jest to problemem jeśli uczelnia ma wykupiona˛ licencj˛e dla każdego pracownika i studenta (potwierdzeniem dla firmy MathWorks naszego prawa do pobrania oprogramowania i zainstalowania go na swoim prywatnym komputerze jest posiadanie adresu mailowego z domeny uczelni, w naszym przypadku AGH - wcześniej musimy sobie otworzyć konto w ww. firmie). Jeśli tak nie jest albo jeśli nie chcemy si˛e przyzwyczajać do “luksusu”, to możliwe jest zainstalowanie środowiska Octave, które jest darmowym odpowiednikiem Matlaba. Prawie wszystkie podstawowe funkcjonalności Matlaba sa˛ w nim zaimplementowane. Niekompletne sa˛ jednak biblioteki dodatkowe, tzw. toolboxes. Dost˛epne funkcje z tych bibliotek można dograć/dołaczyć, ˛ np. z biblioteki signal w nast˛epujacy ˛ sposób: pkg load signal. Inna˛ alternatywa˛ dla “zakr˛econych lewoskr˛etnie” (przeciwnie do ruchu wskazówek zegara) jest używanie podczas zaj˛eć środowiska Jupyter Notebook albo JupyterLab z zainstalowanym, darmowym interpretem j˛ezyka Matlab jako wybranym j˛ezykiem programowania (to działa! sam sprawdziłem!). Dodatkowych funkcji bibliotecznych w tym przypadku także nie b˛edziemy mieli, ale jadro ˛ Matlaba b˛edzie dost˛epne, co powinno wystarczyć do realizacji wi˛ekszości zadań z MeNu. 26 1 Matlab - środowisko do obliczeń technicznych 1.9 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. 1. Matlab jest interpreterem. Można na nim pracować jak na kalkulatorze, ale także można zapisywać sekwencje komend w zbiorach o zadanaj nazwie, np. program.m, a nast˛epnie podawać t˛e nazw˛e w linii komend Matlaba, np. program (co spowoduje wykonanie programu zapami˛etanego w konkretnym skypcie). Programy Matlaba domyślnie maja˛ rozszerznie .m. Dobrym zwyczajem jest zerowanie wszystkich starych zmiennych (clear all;) i zamykanie starych rysunków (close all;) na poczatku programu. 2. W Matlabie wszystkie zmienne sa˛ typu double (zmiennopozyjne podwójnej precycji), dlatego nie ma potrzeby deklaracji ich typu. Dlatego np. piszemy: a=1, b=2, c=a+b. 3. W Matlabie wszystkie operacje sa˛ domyślnie interpretowane jako wektorowomacierzowe, zgodnie z ich definicja˛ matematyczna.˛ Jeśli chcemy jakaś operacj˛e wykonać na odpowiadajacych ˛ sobie elementach dwóch wektorów/macierzy, a nie w trybie wektorowo-macierzowym, to musimy poprzedzić kropka˛ symbol tej operacji, np. a=b.ˆ2 oznacza podniesienie do drugiej pot˛egi wszystkich elementów wektora b. 4. Funkcje w Matlabie sa˛ skryptami, które rozpoczynaja˛ si˛e linii postaci function [x,y,z]=nazwa(a,b,c), gdzie x,y,z to nazwy zmiennych (pojedynczych, wektorów lub macierzy), obliczanych wewnatrz ˛ funkcji, zaś a,b,c to nazwy zmiennych/wektorów/macierzy, których wartości sa˛ przekazywane do funkcji (jako kopia, a nie oryginał). 5. Podstawowe instrukcje sterujace ˛ w j˛ezyku Matlab to: p˛etle for-end oraz while-end, instrukcje warunkowe it-elseif-else-end oraz switch-case-end. Wykonanie petli przerywa si˛e instrukcja˛ break. Literatura 1. J. Brzózka, L. Dorobczyński, Matlab środowisko obliczeń naukowo-technicznych. PWN, Warszawa 2008. 2. P. Rudra, Matlab 7 dla naukowców i inżynierów. PWN, Warszawa 2007. 3. B. Mrozek, Z. Mrozek, Matlab i Simulink. Podr˛ecznik użytkownika. Helion, Gliwice 2004. 4. C. Moler: "Introduction to Matlab", in Numerical Computing with Matlab, on-line: https:// www. mathworks.com/ moler/ chapters.html.html 5. S. Osowski, A. Cichocki, K. Siwek, Matlab w zastosowaniu do obliczeń obwodowych i przetwarzania sygnałów. Warszawa, Oficyna Wydawnicza Politechniki Warszawskiej, 2006. Rozdział 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń Streszczenie Rys historyczny obliczeń. Środowiska obliczeniowe i biblioteki numeryczne. Reprezentacje liczb w komputerze: 1) stało-przecinkowe (fixed-point), czyli całkowite bez znaku (np. uchar, uint,...) i ze znakiem (np. char, int,...) oraz ułamkowe (Qx.y), 2) zmienno-przecinkowe (floating-point, czyli w zapisie cecha-mantysa, tj. ułamek-wykładnik (np. float, double, ...). Dokładność i bł˛edy obliczeń. Dobre i złe uwarunkowanie zadania obliczeniowego. 2.1 Historia obliczeń w pigułce - nie jesteśmy pierwsi Nie od razu Kraków zbudowano. Łatwo przyzwyczajamy si˛e do nowych, lepszych rozwiazań, ˛ ale post˛ep naukowo-techniczny “rodzi si˛e w bólach”, krok po kroku, dzień po dniu, z pokolenia na pokolenie, jednak ogólnie coraz szybciej. To czym dysponujemy dzisiaj powstawało przez tysiace ˛ lat, w różnym czasie i w różnych regionach świata — patrz rys. 2.1, przedstawiajacy ˛ histori˛e “wynalazków” obliczeniowych. Podwaliny współczesnej analizy numerycznej były stworzone przez wielu wybitnych matematyków - niektórzy z nich patrza˛ na nas z zaciekawieniem z rys. 2.2. Ciekawe czy b˛edziemy mieli odwag˛e spojrzeć im prosto w oczy po zakończeniu tego kursu? Nie wszystkie osoby z rys. 2.2 musza˛ być teraz dla nas znane, ale mamy nadziej˛e, że przestana˛ być anonimowe pod koniec tego kursu. Rysunek 2.1: Historia wynalazków obliczeniowych “w pigułce”. 27 28 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń Rysunek 2.2: Wybrani twórcy współczesych metod analizy numerycznej. 2.2 Wybór j˛ezyka i środowiska obliczeniowego Istnieje bardzo wiele różnych j˛ezyków programowania, np. C, C++, R, Python, Java, Perl, Fortran, Matlab, itd. Sa˛ one interpretowane (podczas każdego uruchomienia program tekstowy jest ponownie tłumaczony linia po linii na kod maszynowy i wykonywany linia po linii) albo kompilowane (cały zbiór tekstowy programu jest jednorazowo tłumaczony na jeden, duży, wynikowy kod maszynowy programu oraz potem wielokrotnie uruchamiany i wykonywany już bez konwersji). Każdy z j˛ezyków ma inne, specyficzne właściwości (zalety/wady) i w zwiazku ˛ z tym także różne zastosowania. Duże projekty informatyczne wykorzystuja˛ jednocześnie wiele j˛ezyków: fragmenty ich programów sa˛ łaczone ˛ (linkowane). W tabeli 2.1 scharakteryzowano kilka j˛ezyków komputerowych. Interpretery charakteryzuja˛ si˛e wolnym wykonaniem (z powodu konieczności wielokrotnego tłumaczenia każdej instrukcji), ale szybkim testowaniem kolejnych modyfikacji programu (gdyż nie ma konieczności czasochłonnej kompilacji): czyli “szybko tworzymy programy, które wolno działaja”. ˛ Z kolei kompilatory odznaczaja˛ si˛e szybkim wykonaniem (brak tłumaczenia), ale wolnym tworzeniem programu (wielokrotna 2.2 Wybór j˛ezyka i środowiska obliczeniowego 29 Tabela 2.1: J˛ezyki komputerowe i ich specjalizacja J˛ezyk Rodzaj pracy Zastosowanie Perl R Python, Java Matlab Interpreter Interpreter Interpreter Interpreter C, C++, Fortran Kompilator Wolne przetwarzanie tekstu Wolne obliczenia statystyczne Wolne przetwarzanie ogólne Wolny program ale szybkie funkcje algebry/statystyki, wiele bibliotek Szybkie sterowanie, duża wydajność obliczeniowa czasochłonna kompilacja): czyli “wolno piszemy programy, które szybko działaja”. ˛ Dodatkowo im j˛ezyk jest bardziej “niskopoziomowy”, bliższy sprz˛etu, z mała˛ liczba˛ mało-skomplikowanych instrukcji (np. C), tym wolniej piszemy program, gdyż jest on dłuższy i misterniej “rzeźbiony”. Przeciwnie, kiedy j˛ezyk jest wysoko-poziomowy z duża˛ liczba˛ ogólniejszych instrukcji (np. Matlab), to program jest krótki i pisany szybko. Dlatego dla kursu MeNu wybieramy Matlaba. Dodatkowym argumentem jest wspieranie przez niego arytmetyki wektoro-macierzowej, liczb zespolonych, bogactwo istniejacych ˛ funkcji matematycznych, dost˛epność wielu specjalizowanych bibliotek numerycznych oraz rozbudowanych funkcji wizualizacji danych. Nie bez znaczenia jest też istnienie środowiska Octave, uproszczonego, darmowego odpowiednika Matlaba. Matlab to nie tylko j˛ezyk komputerowy, to duże zintegrowane środowisko do obliczeń naukowo-technicznych. Dla nas szczególnie istotne sa˛ trzy szczególne cechy Matlaba, wymienione poniżej. 1. Dostepności w Matlabie rozbudowanych, specjalistycznych, sprawdzonych bibliotek funkcji, dotyczacych ˛ aktualnych zagadnień technicznych i zwiazanych ˛ z nimi standardów, np. telefonii 4G-LTE i 5G-NR, transmisji Wi-Fi/WLAN i satelitarnej, techniki radarowej, autonomicznej nawigacji samochodowej, uczenia maszynowego, ... 2. Fakt udost˛epnienia w Matlaba wielu funkcji importu/eksportu danych rzeczywistych, zapisanych w określonym formacie/standardzie (WAV, MP3, AAC, JPEG, BMP, GIF/TIFF, PNG, DICOM,...). 3. Zaoferowanie w Matlabie wielu rozbudowanych funkcji wizualizacji danych 1D, 2D i 3D, które znacznie ułatwiaja˛ analiz˛e i przetwarzanie tych danych. W tabeli 2.2 podjeto prób˛e porównania z Matlabem alternatywnych “środowisk” obliczeniowych. Wiele środowisk obliczeniowych wykorzystuje te same biblioteki funkcji numerycznych. Do najważniejszych z nich należa: ˛ • LAPACK – Linear Algebra Package, napisany w Fortranie, • BLAS - Basic Linear Algebra Subroutines, szybkie obliczenia macierzowe, w Fortranie, • NAG - Numerical AlGorithms, w j˛ezyku C i Fortranie, • Numerical Recipes - w j˛ezykach C/Fortran/Pascal/C++, • GSL - GNU Scientific Library, bezpłatny, w j˛ezyku C/C++, • FFTW – Fast Fourier Transform in the West, popularna implementacja algorytmów FFT, • CUDA – Compute Unified Device Architecture, obliczenia numeryczne na kartach graficznych nVidia, • ABAQUS, ANSYS, OPERA, NASTRAN - do rozwiazywania ˛ problemów polowych, czyli równań różniczkowych. Matlab wykorzystuje bibliteki LAPACK i BLAS. 30 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń Tabela 2.2: Porównanie istniejacych ˛ środowisk obliczeniowych Środowisko Dost˛epność Charakterystyka MathCAD Płatny Mathematica Płatny Matlab Płatny Matlab+Simulink Płatny SciLab Octave Maple Python + Biblioteki Płatny Darmowy Płatny Darmowy Julia Darmowy Graficzny edytor równań, tworzenie bloczków funkcjonalnych, program to sekwencja bloczków Interpreter komend, zarzadzanie ˛ bloczkami: komenda - wykonaj, wspiera obliczenia symboliczne (oferuje rozwiazania ˛ analityczne) Pisownia matematyczna, liczby zespolone, bardzo wiele funkcji, bardzo dobra grafika, wspiera obliczenia symboliczne Edytor i symulator diagramów połaczonych ˛ bloczków (w środku funkcja) Uproszczony tańszy odpowiednik Matlaba Uproszczony darmowy odpowiednik Matlaba Obliczenia symboliczne, wynik to rozwiazanie ˛ analityczne Python oraz biblioteki: 1) matematyczne - NumPy (numerical), SciPy (scientific), Numba (akceleracja JIT Just-In-Time Compiler, LLVM Low-Level-Virtual-Machine LLVM), 2) graficzne PyPlot (intefejs do matplotlib) Składnia zbliżona do Matlaba, zintegrowana z Jupyter Notebook, bardzo szybka - JIT+LLVM, wspiera obliczenia rozproszone 2.3 Komputerowe reprezentacje liczb Najwyższy czas przejść do “niskopoziomych” konkretów. Czy wszystkie liczby moga˛ być bezbł˛ednie reprezentowne w komputerze? Nie. Np. 13 . Czy obliczenia komputerowe sa˛ w 100% dokładne? Nie. Np. dodawanie 1 + 2125 da niepoprawny wynik równy 1 dla liczb zmiennoprzecinkowych typu single float, ale poprawny dla double float. Ale czy z tego powodu mamy oddać nasz komputer koleżance lub koledze? Nie, po raz trzeci. Jeśli czegoś nie można zmienić, to trzeba si˛e z tym pogodzić i świadomie (“madrze”) ˛ używać, starajac ˛ si˛e minimalizować (“obchodzić”) istniejace ˛ niedoskonałości. O tym b˛edzie dalsza cz˛eść tego rozdziału. W życiu codziennym używamy systemu dziesi˛etnego pozycyjnego: dziesi˛eć cyfr, od 0 do 9, tworzy sekwencje przedzielone przecinkiem (po polsku) albo kropka˛ (po angielsku): z każda˛ cyfra˛ jest zwiazana ˛ liczba 10, podniesiona do pot˛egi wynikajacej ˛ w pozycji danej cyfry: pot˛egi dodatnie 0, 1, 2, 3, .. od kropki (włacznie) ˛ w lewo oraz pot˛egi ujemne -1, -2, -3, ... za kropka˛ w prawo, przykładowo: 654.321 = 6 · 102 + 5 · 101 + 4 · 100 + 3 · 10−1 + 2 · 10−2 + 1 · 10−3 = 1 1 1 = 6 · 100 + 5 · 10 + 4 · 1 + 3 · +2· +1· . 10 100 1000 (2.1) W komputerach mamy bity, stany 0 albo 1 (tranzystory w stanie przewodzenia albo odci˛ecia, namagnesowanie w lewo albo w prawo), dlatego liczby zapisywane sa˛ w nich w dwójkowym systemie pozycyjnym, używajacym ˛ tylko dwóch cyfr 0 i 1, i do pot˛egi podnoszone sa˛ nie 10-tki tylko 2-ki, przykładowo: 110.011 = 1 · 22 + 1 · 21 + 0 · 20 + 0 · 2−1 + 1 · 2−2 + 1 · 2−3 = 1 1 1 = 1·4+1·2+0·1+0· +1· +1· = 2 4 8 1 1 3 = 4 + 2 + 0 + 0 + + = 6 = 6.375 4 8 8 (2.2) (2.3) 2.3 Komputerowe reprezentacje liczb 31 Co ciekawe liczby 31 nie można dokładnie wyrazić w kodzie dziesi˛etnym i dwójkowym za pomoca˛ skończonej sekwencji cyfr. “Uuuu .... (zdziwienie Czytelnika) ..., to po co kupiłem komputer?”. W j˛ezykach komputerowych zazwyczaj na poczatku ˛ programu deklaruje si˛e nazwy używanych zmiennych, liczb˛e bitów, jaka˛ b˛eda˛ one używać (8/16/32/64 bitów) oraz sposób zapisu i interpretacji BINARNEJ w komputerze, czyli typ zmiennej. Zmienne przyjmuja˛ wartości (szczegóły np. tutaj): • całkowite STAŁO-przecinkowe/pozycyjne: char (8b), integer (16b), long (32b), long long (64b), bez znaku (unsigned) albo ze znakiem (signed) • rzeczywiste ZMIENNO-przecinkowe/pozycyjne: float (32b), double (64b), long double (80b). Formaty różnia˛ si˛e mi˛edzy soba˛ interpretacja˛ poszczególnych bitów. W j˛ezyku Matlab domyślnie wszystkie zmienne sa˛ zapisywane w trybie double (64b), dlatego nie ma potrzeby deklaracji ich typu. W tabeli 2.3, jako wprowadzenie, podano trzy przykłady zapisu binarnego (b) i szesnastkowego/heksadecymalnego (h) tych samych sekwencji 8 i 16 bitów. Prawy skrajny bit jest najmniej znaczacy ˛ (LSB - least significant bit) i jest zwiazany ˛ z liczba˛ 2 podniesiona˛ do najniższej pot˛egi (czyli najbliżej 0). Natomiast lewy skrajny bit jest najbardziej znaczacy ˛ (MSB - most significant bit) i, tak jak w przypadku znaczenia cyfr w zapisie dziesi˛etnym, jest on zwiazany ˛ z liczba˛ bazowa˛ użytego systemu pozycyjnego. W rozpatrywanym przypadku jest to liczba 2, poniesiona˛ do najwyższej pot˛egi (7 albo 15). W tabeli podano także wartości dziesi˛etne (d), odpowiadajace ˛ tym zapisom bitowym, przy załozeniu, że koduja˛ one liczby całkowite bez znaku (zawsze +) i ze znakiem (±) w kodzie U2 (w tym przypadku wartość zwiazn ˛ a˛ z MSB neguje si˛e). Jeśli podane wartości nie budza˛ zdziwienia, to znaczy że w dalszej cz˛eści tego pod-rozdziału Czytelnik może si˛e skoncentrować wyłacznie ˛ na zapisie zmiennoprzecinkowym typu ułamek pomnożony przez liczb˛e przesuwajac ˛ a˛ przecinek, czyli w tym miejscu od razu przeskoczyć do rys. 2.6 oraz jego opisu. Tabela 2.3: Przykłady zapisu tych samych 8- i 16-bitowych liczb całkowitych bez znaku Binarnie 0100 0011 b 1010 1011 b 1111 1111 11111111 b Heksadecymalnie 43 h AB h FFFF h Dziesi˛etnie (+) 67 d 171 d 65535 d Dziesietnie (+/- U2) 67 d -85 d -1 d A teraz troch˛e teorii i praktyki. Poniżej zostana˛ podane wzory do interpretacji zapisu bitowego oraz przykłady ich użycia. Poprawność relacji bity-liczba można sprawdzić w środowisku Matlab wywołujac ˛ poniższa˛ sekwecj˛e komend: x=fi( value, sign, noBitsAll, noBitsFract ), x.bin, gdzie: • • • • value - wartość liczby rzeczywistej do zakodowania, sign - 0=bez znaku, 1=ze znakiem w kodzie U2, noBitsAll - liczba wszystkich użytych bitów, noBitsFract - liczba bitów tylko cz˛eści ułamkowej. 32 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń Na rysunku 2.3 przedstawiono wzory i przykłady dekodowania tej samej sekwencji N = 8 bitów 10001101b dla trzech różnych zapisów liczb całkowitych: 1. bez znaku (otrzymujemy 141), 2. ze znakiem jako znak-moduł (-13), 3. ze znakiem w kodzie uzupełnień do dwóch U2 (-115). Jak widać otrzymujemy trzy różne liczby: 141, -13 oraz -115. Mnożac ˛ liczby całkowite otrzymujemy liczby o wi˛ekszych wartościach bezwzgl˛ednych, dlatego możemy doprowadzić do przepełnienia akumulatorów procesora, dysponujacych ˛ skończona˛ liczba˛ bitów. Rysunek 2.3: Komputerowy zapis liczb całkowitych: bez znaku oraz ze znakiem z kodowaniem: 1) znak-moduł, 2) uzupełnienie do dwóch (U2) (liczba ujemna jest otrzymywana przez zanegowanie bitów liczby dodatniej i dodanie jedynki). Przykład dla 8 bitów. Problem 2.1 (* Liczby całkowite ze znakiem). Sprawdź poprawność zapisu liczb z rysunku 2.3 zapisanych bez znaku lub ze znakiem w kodzie U2, używajac ˛ nast˛epuja˛ cych komend: a=fi( 141,0,8,0), b=fi( 115,0,8,0), c=fi( 115,1,8,0), d=fi(-115,1,8,0), a.bin, b.bin, c.bin, d.bin, Sprawdź jak wyglada ˛ bitowo dzień twoich urodzin (czyli liczba całkowita od 1 do 31), zapisany na 8 bitach i 16 bitach, bez znaku oraz ze znakiem w kodzie U2. Z kolei na rysunku 2.4 przedstawiono wzory i przykłady dekodowania tej samej sekwencji bitów 11010000b dla trzech różnych zapisów liczb ułamkowych (tylko): 1) bez znaku (1.625, przedział [0,2)), 2) ze znakiem jako znak-moduł (-0.625, przedział (-1,1)) oraz 3) ze znakiem w kodzie uzupełnień do dwóch U2 (-0.375, przedział [-1,1)). W tym przypadku także otrzymujemy trzy różne liczby: 1.625, -0.625 oraz -0.375. 2.3 Komputerowe reprezentacje liczb 33 Mnożac ˛ liczby ułamkowe otrzymujemy liczby mniejsze od argumentów mnożenia, dlatego bity wyniku przesuwaja˛ si˛e w prawo w akumulatorze i moga˛ si˛e z niego wysunać, ˛ prowadzac ˛ do utraty precyzji obliczeń. Rysunek 2.4: Przykładowy zapis liczb ułamkowych: bez znaku oraz ze znakiem z kodowaniem: 1) znak-moduł, 2) uzupełnienie do dwóch (U2). Konkretne wartości podano dla 8 bitów. Problem 2.2 (* Liczby ułamkowe ze znakiem). Sprawdź poprawność reprezentacji liczb z rysunku 2.4, zapisanych bez znaku lub ze znakiem w kodzie U2, używajac ˛ nast˛epujacych ˛ komend: a=fi( 1.625,0,8,7), b=fi( 0.375,0,8,7), c=fi( 0.375,1,8,7), d=fi(-0.375,1,8,7), a.bin, b.bin, c.bin, d.bin, Sprawdź jak wyglada ˛ bitowo cz˛eść ułamkowa liczby π (w Matlabie pi), zapisana na 8 bitach i 16 bitach ze znakiem i bez znaku. Odtwórz wartość π z kodujacych ˛ ja˛ bitów. Oblicz bład ˛ w stosunku pi Matlaba. Uogólnieniem liczb tylko całkowitych (rys. 2.3) i tylko ułamkowych (rys. 2.4) sa˛ liczby całkowito-ułamkowe, takie jak przedstawione w równaniach (2.1)-(2.6). Na rys. 2.5 wytłumaczono ich kodowanie - zapis na 8 bitach, z 4-oma bitami w cz˛eści ułamkowej (M = 3, N = 4). W tym przypadku jest dekodowana sekwencja bitów 10110000b, dla której otrzymujemy: bez znaku (11.25), ze znakiem jako znakmoduł (-3.25) oraz ze znakiem w kodzie uzupełnień do dwóch U2 (-4.75). 34 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń Rysunek 2.5: Przykładowy zapis liczb całkowito-ułamkowych: bez znaku oraz ze znakiem z kodowaniem: 1) znak-moduł, 2) uzupełnienie do dwóch (U2). Konkretne wartości podano dla 8 bitów. Problem 2.3 (* Liczby całkowito-ułamkowe ze znakiem). Sprawdź poprawność reprezentacji liczb z rysunku 2.5, zapisanych bez znaku lub ze znakiem w kodzie U2, używajac ˛ nast˛epujacych ˛ komend: a=fi( 11.25,0,8,4), a.bin, b=fi( 4.75,0,8,4), b.bin, c=fi( 4.75,1,8,4), c.bin, d=fi(-4.75,1,8,4), d.bin, Sprawdź jak wyglada ˛ bitowo liczba π (w Matlabie pi), zapisana na 8 i 16 bitach ze znakiem i bez znaku, zakładajac, ˛ że bity cz˛eści ułamkowej stanowia˛ 43 wszystkich bitów. Odtwórz wartość π z kodujacych ˛ ja˛ bitów. Oblicz bład ˛ w stosunku pi Matlaba. Dla pozytywnie zakr˛econych - ogólny zapis reprezentacji stałoprzecinkowej. W morzu szczegółów można utonać. ˛ Nie każdy je lubi. Ale czasami warto uporzadko˛ wać słoiki w spiżarni. Opisane powyżej formaty liczb całkowitych, ułamkowych oraz całkowito-ułamkowych można sprowadzić do jednego wspólnego zapisu: v = s · q + b, s = f · 2e , 1 ≦ f < 2, (2.4) gdzie – s - współczynnik skalujacy ˛ (slope), w którym e, liczba całkowita ujemna, ustala pozycj˛e kropki, – b - współczynnik przesuwajacy ˛ (bias), – q - właściwy (pami˛etany) zapis binarny (quantity - bez znaku albo U2 ze znakiem). Współczynniki s oraz b nie sa˛ cz˛eścia˛ zapisu liczby, a określaja˛ one jedynie konwencj˛e interpretacji zapisu binarnego q. Niedogodność w tym formacie to brak dynamicznego skalowania, czyli możliwości reprezentacji ta˛ sama˛ zmienna˛ dużych i małych liczb z porównywalna˛ precyzja.˛ 2.3 Komputerowe reprezentacje liczb 35 Przykłady. Założenie: Qz.|e| - oznaczenie zapisu, z - 0 = bez znaku, 1 = U2 ze znakiem, |e| - moduł ujemnej liczby całkowitej e, N - liczba bitów reprezentacji): • radix point scaling with sign - f = 1, e dowolne, b = 0, np. Q1.14, N = 16 bitów, e = −14 - dla q = FFFFh mamy: v = 1 · 2−14 · (−1) − 0 = −0.00006103515625, • fractionals without sign - f = 1, e = −N, b = 0, np. Q0.8, N = 8 bitów, e = −8 - dla q = 01010001b mamy: 1 1 + 256 = 0.31640625. v = 2−8 · 26 + 24 + 20 = 41 + 16 Podczas obliczeń istnieje konieczność zapisu i działania na liczbach bardzo małych oraz bardzo dużych, ponieważ otaczajacy ˛ nas świat może być ogladany ˛ w skali micro i macro. W tym przypadku dowolna˛ liczb˛e przedstawia si˛e za pomoca˛ znaku oraz ułamka pomnożonego przez podstaw˛e użytego systemu liczbowego (10 albo 2), podniesiona˛ do pot˛egi: ujemnej, zerowej albo dodatniej, przykładowo: −0.009765625 = −0.9765625 · 10 −2 1 1 1 −6 =− + ·2 = − 1+ · 2−7 . 2 8 4 (2.5) Należy zwrócić uwag˛e, że ponieważ w zapisie binarnym ułamkowym przecinek jest przesuwany w lewa˛ stron˛e przed najstarszy bit równy 1, dlatego jesteśmy pewni położenia/wyst˛epowania tej jedynki i nie ma sensu tracić bitu na jej zapis: jest ona domyślna - kodowne sa˛ tylko bity pozostałe, na prawo od leading one! Na rys. 2.6 pokazano przykład kodowania bardzo małej liczby −5.877472·10−38 w zapisie single (32b) typu float ze zmiennym położeniem. Należy zwrócić uwag˛e, że domyślne 1 nie jest zapisywane w cz˛eści ułamkowej, tylko pozostałe bity. Istnieja˛ jednak wyjatki ˛ od tej reguły: • kiedy wszystkie bity eksponenty sa˛ równe zero E=000000..., to najstarsza jedynka jest zapisywana w cz˛eści ułamkowej; • kiedy wszystkie bity eksponenty sa˛ równe jeden E=111111..., to kodowana jest: – Inf-nieskończoność - kiedy najstarszy bit cz˛eści ułamkowej jest równy 0, – NaN-nieliczba - kiedy najstarszy bit cz˛eści ułamkowej jest równy 1. 36 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń Rysunek 2.6: Komputerowy zapis liczb zmiennoprzecinkowych (zmiennopozycyjnych) typu float (single precision) i double (precision), zgodnie z IEEE Standard 754 z 1985 roku. Konkretne wartości podano dla typu float czyli dla 32 bitów. Problem 2.4 ((L)* Liczby zmiennoprzecinkowe). Sprawdź poprawność zapisu liczby −5.877472 · 10−38 = (1 + 14 ) · 2−124 , analizowanej na rys. 2.5 i przedstawionej w trybie 32-bitowym single. W tym celu wywołaj poniższe funkcje: num2bitstr( single( (1+1/4)*2ˆ(-124) )), num2bitstr( single( -5.877472*10ˆ(-38) )); Zapoznaj si˛e z kodem funkcji num2bitstr(). Użyj jej do poznania reprezentacji bitowej pr˛edkości światła c = 299792458 [m/s], zapisanej w trybie single (32b) i double (64b). Odtwórz wartość światła z jej reprezentacji bitowych, wykorzystujac ˛ ogólne wzory podane na rys. 2.5. Zapis liczb w formacie zmienno-pozycyjnym (zmienno-przecinkowym) gwarantuje nam duża˛ rozpi˛etość wartości liczb, jednak nie zabezpiecza nas przed bł˛edem zaokragleń, ˛ wykonywanych operacji matematycznych. Na przykład, kiedy liczby sa˛ dodawane, przecinek musi zostać ustawiony w obu liczbach w tym samym miejscu, tzn. eksponenta obu liczb musi być taka sama. W zwiazku ˛ z tym wygrywa eksponenta liczby wi˛ekszej jako bardziej istotnej. Powoduje to: 1) zwi˛ekszenie eksponenty liczby mniejszej, 2) przesuni˛ecie przecinka w jej cz˛eści ułamkowej w lewo, 3) czyli przesuni˛ecie bitów jej cz˛eści ułamkowej w prawo, 4) i niebezpieczeństwo wysuni˛ecia najmniej znaczacych ˛ bitów ze sprz˛etowego (hardware-owego) akumulatora. Tak samo jak dla liczb w zapisie dziesi˛etnym pozycyjnym, przykładowo zakładajac ˛ tylko 3 cyfry znaczace ˛ w cz˛eści ułamkowej: 0.123 · 103 + 0.456 · 100 = 0.123 · 103 + 0.000456·103 = 0.123 · 103 . (2.6) Problem 2.5 (* Bład ˛ reprezentacji i dodawania liczb typu float). Sprawdź poprawność powyższych uwag dotyczacych ˛ bł˛edu dodawania liczb typu float. Wykonaj sekwencj˛e nast˛epujacych ˛ instrukcji: 2.4 Komputerowe reprezentacje liczb - dodatkowe zadania disp(’FLOAT: Dokladnosc’); disp(’1 + 2ˆ(-24)’); num2bitstr( single( 1 + 2ˆ(-24) disp(’1 + 2ˆ(-23)’); num2bitstr( single( 1 + 2ˆ(-23) disp(’1 + 2ˆ(-22)’); num2bitstr( single( 1 + 2ˆ(-22) disp(’1 + 2ˆ(-21)’); num2bitstr( single( 1 + 2ˆ(-21) disp(’1 + 2ˆ(-21) + 2ˆ(-23)’); num2bitstr( single( 1 + 2ˆ(-21) + 2ˆ(-23) )); disp(’1 + 2ˆ(-53) + 2ˆ(-53) ’); hex2bitstr( num2hex( 1 + 2ˆ(-53) + 2ˆ(-53) )); disp(’ 2ˆ(-53) + 2ˆ(-53) + 1’); hex2bitstr( num2hex( 2ˆ(-53) + 2ˆ(-53) + 1 )); disp(’ ’); 37 )); )); )); )); Przeanalizuj wartości wyświetlane na ekranie. Zauważ, m.in, przesuwanie si˛e najmniej znaczacego ˛ bitu wyniku ze strony prawej na lewa˛ w pierwszej cz˛eści programu. Zauważ, że kolejność wykonywanych operacji ma znaczenie w ostatnich 5 liniach programu (należy dodawać w kolejności od najmniejszych do najwi˛ekszych liczb). 2.4 Komputerowe reprezentacje liczb - dodatkowe zadania Problem 2.6 (* Reprezentacje liczb w pigułce). Zapoznaj si˛e z programem 2.3 bity_testowanie_vshort.m, podsumowujacym ˛ przekazane do tej pory informacje dotyczace ˛ komputerowego zapisu liczb. Zaprezentowane w nim przykłady obliczeń sa˛ dokładnie rozpisane/wytłumaczone na rysunkach 2.7-2.11. Listing 2.1: Reprezentacje liczb w pigułce % LICZBY Z PRZYKLADOW Z WYKLADU % bity_testowanie_vshort.m clear all; close all; % Integer U2 8 bitow: 01000110 disp(’########## U2 8b INTEGER: 70=64+4+2,-70=-128+32+16+8+2’); dec2bin( 70, 8) % 70 na 8 bitach dec2bin( -70, 8) % -70 na 8 bitach disp(’ ’); % Fractional U2 8 bitow: 0.546875 = 1/2 + 1/32 + 1/64 = +35/64 % -0.546875 = -1 + 1/4 + 1/8 + 1/16 + 1/64 = -35/64 disp(’########## U2 8b FRACTIONAL: +0.546875,-0.546875’); fp = fi( 0.546875,1,8,7), fp.bin, fm = fi(-0.546875,1,8,7), fm.bin, disp(’ ’); % Single precision 32 bity: -0.009765625 disp(’########## Single 32b: -0.009765625’); num2hex( single( -0.009765625 ) ), num2bitstr( single( -0.009765625 ) ), disp(’ ’); % Double precision 64 bity: -0.009765625 38 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń disp(’########## DOUBLE 64b: -0.009765625’); num2hex( -0.009765625 ); num2bitstr( -0.009765625 ); disp(’ ’); % Fractional U2 8 bitow: 1.625 oraz +/- 1.546875 disp(’########## SINGLE: 1.625 = 1+1/2+1/8, +/-(1.546875) = +/-(1+1/2+1/32+1/64)’); num2bitstr( single( 1 + 1/2 + 1/8 ) ); num2bitstr( single( +( 1 + 1/2 + 1/32 + 1/64 ) ) ); num2bitstr( single( -( 1 + 1/2 + 1/32 + 1/64 ) ) ); disp(’ ’); % Dokladnosc obliczen disp(’########## SINGLE: Dokladnosc obliczen’); disp(’1 + 2^(-24)’); num2bitstr( single( 1 + 2^(-24) )); disp(’1 + 2^(-23)’); num2bitstr( single( 1 + 2^(-23) )); disp(’1 + 2^(-22)’); num2bitstr( single( 1 + 2^(-22) )); disp(’1 + 2^(-21)’); num2bitstr( single( 1 + 2^(-21) )); disp(’1 + 2^(-21) + 2^(-23)’); num2bitstr( single( 1 + 2^(-21) + 2^(-23) )); disp(’1 + 2^(-24) + 2^(-24)’); num2bitstr(single(1)+single(2^(-24))+single(2^(-24))); disp(’2^(-24) + 2^(-24) + 1’); num2bitstr(single(2^(-24))+single(2^(-24))+single(1)); disp(’ ’); % Blad dla 64 bitow +/-0.5*eps disp(’########## DOUBLE: Blad obliczen’); eps_system = eps, eps_oblicz = 2^(-52), disp(’1 + 2^(-53) + 2^(-53) ’); hex2bitstr( num2hex( 1 + 2^(-53) + 2^(-53) )); disp(’ 2^(-53) + 2^(-53) + 1’); hex2bitstr( num2hex( 2^(-53) + 2^(-53) + 1 )); disp(’ ’); Rysunek 2.7: Wytłumaczenie zapisu liczb całkowitych dla 8 bitów 2.4 Komputerowe reprezentacje liczb - dodatkowe zadania 39 Rysunek 2.8: Wytłumaczenie zapisu liczb ułamkowych dla 8 bitów Rysunek 2.9: Wytłumaczenie zapisu liczb zmiennoprzecinkowych dla 32 i 64 bitów 40 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń Rysunek 2.10: Wyjatek: ˛ E = same zera: brak wysuni˛etej jedynki. Rysunek 2.11: Wyjatek ˛ E = same jedynki: infinity (Inf), not-a-number (NaN). Problem 2.7 (* Liczby najmniejsze, najwi˛eksze, rozdzielczość liczb int oraz float). Skorzystaj z poniższych nazw rodzajów reprezentacji liczb oraz funkcji Matlaba: ’single’, ’double’, realmin(’single’), realmax(’single’), eps(’single’), ’int8/16/32/64’, ’uint8/16/32/64’, intmin(’int8’), intmax(’uint64’), zjadź najmniejsze i najwi˛eksze wartości z ich pomoca,˛ oraz sam napisz program, który wyznacza niektóre z nich. Problem 2.8 (* Wyznaczanie liczby bitów mantysy/ułamka liczb single/double). Zapoznaj si˛e z programem 2.2, służacym ˛ do wyznaczania liczby bitów cz˛eści ułamkowej liczby typu float. Obecnie działa on tylko dla typu double. Uzupełnij go o typ single. 2.4 Komputerowe reprezentacje liczb - dodatkowe zadania 41 Listing 2.2: Obliczanie liczby bitów mantysy dla typu single/double % bity_mantysy.m clear all; close all; e=1/2; n=0; while( (1+e) > 1 ) e=e/2; n=n+1; end nbits = n, % inicjalizacja % czy "widac" dodanie "e" % jesli tak, to zmniejsz "e" 2 razy % % szukana liczba bitow mantysy Problem 2.9 (* Wyznaczanie liczby bitów wykładnika/eksponenty liczb single/double). Zapoznaj si˛e z programem 2.3, służacym ˛ do wyznaczania liczby bitów pot˛egi cz˛eści całkowitej liczby typu float. Obecnie działa on tylko dla typu double. Uzupełnij go o typ single. Listing 2.3: Obliczanie liczby bitów wykładnika dla typu single/double % bity_wykladnika.m clear all; close all; if(0) % Metoda #1 x=realmin; n=0; num2bitstr( x ); pause while( x < realmax ) n=n+1, x=2*x; num2bitstr( x ); pause end n=n+2 nbits = log2(n), end % x = wartosc najmniejsza, inicjalizacja licznika bitow % pokaz bity % jesli x mniejsze od wartosci najwiekszej, to ... % zwieksz licznik, pomnoz x przez dwa = zwieksz wykladnik o 1 % pokaz bity % analizuj je % eksponenta=[ 1]-1023=-1022 <-- 1 zwiazane z realmin % eksponenta=[2047]-1023=+1024 <--2047 zwiazane z realmax % 2046 % + 2 % 2048 if(1) % Metoda #2: x=1, mnozenie razy 2 ################################# x=1, n=0, % inicjalizacja num2bitstr( x ); pause % reprezentacja bitowa while(2*x > x) % czy widac mnozenie przez 2; jesli tak, to n=n+1, x=2*x, % zwieksz wykladnik o 1, pomnoz *2, num2bitstr( x ); % zobacz zmiane bitow reprezentacji pause % zobacz zmiane bitow reprezentacji end % nbits = log2(n) + 1, % +1 - potegi dodatnie i ujemne end % ################################################################### if(0) % Metoda #3: x=1, dzielenie przez 2 x=1; n=1, bity_mantysy=52; % inicjalizacja num2bitstr( x ); pause % zobacz reprezentacje bitowa while(x/2 < x) % czy widac dzielenie przez 2 n=n+1, x=x/2, % /2, zwiekszenie wykladnika o 1 num2bitstr( x ); % zobacz zmiane bitow reprezentacji pause % przeanalizuj ja end % n = n - bity_mantysy, % odejmij liczbe bitow mantysy nbits = log2(n) + 1, % +1 - potegi dodatnie i ujemne end % 42 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń Problem 2.10 (* Obliczanie wartości liczb zmiennoprzecinkowych o zadanej liczbie bitów eksponenty (K) i mantysy (L)). Zapoznaj si˛e z programem 2.4, służacym ˛ do wyznaczania wszystkich wartości liczb zmienno-przecinkowych o zadanym zapisie. Porównaj rozkład wartości wokół zera dla liczb z mantysa˛ znormalizowana˛ 1.f, czyli z domyślna˛ jedynka˛ (otrzymujemy “dziur˛e” rerezentacji wokół 0) oraz z mantysa˛ zdenormalizowana˛ 0.f (bez tej jedynki, co jest sygnalizowane przez wartość zerowa˛ eksponenty - brak ww. “dziury” wokół 0) - patrz, odpowiednio, górny i dolny wykres na rysunku 2.12, otrzymany dla N=5 K=2, L=2. Porównaj rozkłady wartości dla różnych wartości N, K i L. 1 0 -1 -8 -6 -4 -2 0 2 4 6 8 wartosci x 1 0 -1 -8 -6 -4 -2 0 2 4 6 8 wartosci x Rysunek 2.12: Rozkład przyjmowanych wartości przez liczby zmiennoprzecinkowe w programie 2.4 dla: N=5 (liczba wszystkich bitów z bitem znaku), K=2 (liczba bitów eksponenty/wykładnika), L=2 (liczba bitów mantysy/ułamka). Listing 2.4: Obliczanie wartości liczb zmiennoprzecinkowych o zadanej liczbie bitów eksponenty i mantysy % bity_interpretacja.m clear all; close all; N=5; K=2; L=2; denorm = 0; % liczba bitow: wszystkich (z b. znaku), eksponenty, mantysy % 0/1 NIE/TAK denormalizacja mantysy bias = 2^(K-1)-1; ex = 0 : 2^K-1; prec = 2.^(-L); mn = 0 : 2^L-1; % przesuniecie w eksponencie % wszystkie liczby calkowite w eksponencie bez przesuniecia % precyzja mantysy % wszystkie liczby calkowite w mantysie bez domyslnego 1 P = length(ex); % liczba wartosci eksponenty Q = length(mn); % liczba wartosci mantysy for n = 1 : Q for m = 1 : P if( denorm==0 | (denorm==1 & ex(n)~=0) ) x( (n-1)*P + m ) = ( 1 + mn(m)*prec) * 2^(ex(n)-bias); % domyslne 1 else x( (n-1)*P + m ) = mn(m)*prec; end end end x = [ -x, x ]; % dodajemy liczby ujemne plot( x, zeros(1, length(x)), ’bo’); grid; xlabel(’wartosci x’); 2.5 Bł˛edy obliczeń ogólniej 43 2.5 Bł˛edy obliczeń ogólniej Źródłem bł˛edów obliczeniowych, zwiazanym ˛ z obliczeniami komputerowymi, jest przybliżona reprezentacja liczb rzeczywistych w postaci zmiennoprzecinkowej. Bład ˛ zwiazany ˛ z tym przybliżeniem zależy od konkretnej wartości liczby, ale możemy podać jego wartość graniczna.˛ Zaokraglanie ˛ liczby rzeczywistej x do najbliższej liczby reprezentowalnej zmiennoprzecinkowo xe wia˛że si˛e z nast˛epujacym ˛ bł˛edem wzgl˛ednym (różnica pomi˛edzy wartościa˛ dokładna˛ x, zapisana˛ z użyciem nieskończonej liczby bitów bi , i = 1...∞, a wartościa˛ przybliżona,˛ zapisana˛ z użyciem tylko K bitów bi , i = 1...K, podzielona przez wartość dokładna˛ x): ε= x − x̃ = x (−1)s 2e ∞ ∞ K 1 + ∑ bi 2−i − 1 + ∑ bi 2−i ∑ bi 2−i eps i=K+1 i=1 i=1 = ≦ 2−(K+1) = ∞ ∞ 2 1 + ∑ bi 2−i (−1)s 2e 1 + ∑ bi 2−i i=1 i=1 (2.7) gdzie eps = 2−K oraz K to liczba bitów mantysy. W dalszej analizie dokładności algorytmów numerycznych b˛edziemy przyjmować wzgl˛edne „zaburzenie” danych ε: xe = x · (1 ± ε) . (2.8) eps 2 ) To małe zaburzenie (na poziomie może w przypadku niektórych zadań obliczeniowych prowadzić do dużych bł˛edów wyniku obliczeń. Tak jest w przypadku wyznaczania różnicy dwóch bliskich sobie dużych liczb obarczonych bł˛edem ε (catastrophic cancelation): |[x − y] − [x (1 ± ε) − y (1 ± ε)]| ε (|x| + |y|) ≦ |x − y| |x − y| (2.9) W rozpatrywanym przypadku wzgl˛edny bład ˛ wyniku odejmowania “zaburzonych” liczb x i y jest bardzo DUŻY! W trakcie prowadzania obliczeń dobrze jest przestrzegać nast˛epujacych ˛ prostych zasad, powodujacych ˛ zwi˛ekszenie liczby cyfr znaczacych ˛ wyniku: • unikamy odejmowania liczb o zbliżonych wartościach, • staramy si˛e dodawać liczby o zbliżonych wartościach, • staramy si˛e, aby wyniki przejściowe były bliskie jedynki, np. mnożymy liczby małe i duże, dzielimy podobne, • wielokrotne dodawanie rozpoczynamy od liczb najmniejszych, • zmniejszamy liczb˛e operacji, np. y(x) = a1 ∗ x3 + a2 ∗ x2 + a3 ∗ x1 + a4 = a4 + x ∗ (a3 + x ∗ (a2 + a1 ∗ x)), • unikamy funkcji rekurencyjnych (zagnieżdżonych), stosujemy rozwiazania ˛ iteracyjne, • stosujemy obliczenia wektorowe, zamiast p˛etli, jeśli jest to możliwe (SIMD - Single Instruction Multiple Data, MIMD - Multiple Instruction Multiple Data), • oczywiście staramy si˛e unikać bł˛edów wykonania, np. dzielenia przez zero. Problem 2.11 ((L)* Wpływ kolejności wykonywanych operacji na wynik). Załóżmy, że wykonyjemy w Matlabie nast˛epujac ˛ a˛ operacj˛e x*y/z. Sprawdź czy sugerowana poniżej kolejność działań ma pozytywny wpływ na wynik: • (x*y)/z - kiedy x i y bardzo si˛e różnia˛ wartościami bezwzgl˛ednymi, 44 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń • x*(y/z) - kiedy y i z maja˛ zbliżone wartości bezwzgl˛edne, • (x/z)*y - kiedy x i z maja˛ zbliżone wartości bezwzgl˛edne. Np. dla nast˛epujacych ˛ wartości: x = 10ˆ(-50); y=10ˆ200; z=10ˆ300;. Problem 2.12 (* Katastrofalne odejmowanie). Poniżej przedstawiono dwa zapisy matematyczne tej samej funkcji (z ksia˛żki Young “Applied Numerical Methods...”): √ √ √ x x+1− x √ x f2 (x) = √ √ x+1+ x f1 (x) = (2.10) (2.11) Wyra otrzymano mnożac ˛ i dzielac ˛ wyrażenie pierwsze przez √ żenie √drugie x + 1 + x . Wynika z niego, że dla dużych wartości x wynik f2 (x) da˛ży asympotycznie do 0,5. Równocześnie zwi˛ekszanie wartości x prowadzi do “katastrofalnego odejmowania” w definicji f1 (x). Oblicz i wyświetl obok siebie kolejne wartości f1 (x) p 10 oraz √ f2 (x)√dla x = 10 , p = 0, 1, 2, ..., 15. Dodatkowo dla x = 10 pokaż także wartości x + 1 i x oraz ich sum˛e i różnic˛e. Powinieneś otrzymać wynik zbliżony do przedstawionego na rysunku 2.13. Użyj instrukcji: format long e oraz fprintf() (formatowany wydruk). Rysunek 2.13: Spodziewany wynik obliczeń dla problemu 2.12. 2.6 Przykłady zadań dobrze i źle uwarunkowanych Poniżej przedstawiono trzy dodatkowe przykłady zadań źle uwarunkowanych obliczeniowo. 2.6 Przykłady zadań dobrze i źle uwarunkowanych 45 Rozwiazanie ˛ równania kwadratowego. Różnica dwóch liczb o zbliżonych wartościach pojawia si˛e podczas wyznaczania pierwiastków równania kwadratowego. Równanie: ax2 + bx + c = 0 Dane: a, b, c Szukane: x Rozwiazanie: ˛ √ −b − b2 − 4ac x1 = , 2a √ −b + b2 − 4ac x2 = 2a (2.12) √ Kiedy b2 ≫ 4ac, to b2 − 4ac ≈ b i z tego powodu w jednym z równań (2.12) mamy w liczniku katastrofalne odejmowanie: dla b ujemnego w równaniu na x1 , natomiast dla b dodatniego - w równaniu na x2 . Z tego powodu wskazane jest nast˛epujace ˛ post˛epowanie, zapewniajace ˛ dokładniejsze rozwiazanie: ˛ 1. Obliczamy x1 oraz x2 . 2. Wybieramy liczb˛e, która ma wi˛eksza˛ wartość bezwzgl˛edna.˛ 3. Druga˛ z liczb obliczamy z równania x1 · x2 = ac , np.: √ −b − b2 − 4ac 2c √ x1 = → x2 = . 2a −b − b2 − 4ac (2.13) Problem 2.13 ((L)*(*) Badanie rozwiazania ˛ równania kwadratowego). Napisz program w Matlabie sprawdzajacy ˛ powyższy “przepis kulinarny” (za **). Jeśli chcesz pójść na skróty (za *), to zainteresuj si˛e udost˛epnionym programem kwadratowe.m i tylko zmieniaj wartości parametrów a,b,c oraz sporzadź ˛ raport dla Centrali. Rozwiazanie ˛ układu równań liniowych. Układy równań liniowych z macierza˛ bliska˛ osobliwej (wyznacznik bliski 0, problem z obliczeniem odwrotności macierzy) to klasyczny przykład zadania źle uwarunkowanego. Rozważmy układ dwóch równań liniowych z parametrem “a”, opisanych nast˛epujacym ˛ równaniem macierzowym: 1 1 x1 1 = (2.14) a 1 x2 1 | {z } |{z} |{z} A x b Dla a = 1 układ równań jest zależny, tzn. określa t˛e sama˛ prosta˛ w przestrzeni (x1, x2), i nie posiada jednego rozwiazania. ˛ Można podejrzewać, że dla a bliskiego 1 zadanie b˛edzie wrażliwe na zaburzenie danych (czyli współczynników równań). Podejrzenie to potwierdza rysunek 2.14, na którym zaznaczono graficznie obszar rozrzutu obliczonych rozwiazań. ˛ W przypadku prostych prawie równoległych rozrzut rozwiazania ˛ jest bardzo duży, zaś dla prostych bliskich prostopadłości - bardzo mały. 46 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń Rysunek 2.14: Ilustracja graficzna dobrego (po lewej) i złego (po prawej) uwarunkowania rozwiazania ˛ prostego układu równań liniowych (2.14) - rozrzut rozwiazania ˛ jest zaznaczony za pomoca˛ okr˛egu/elipsy. Próba rozwiazania ˛ tego układu równań dla a ≈ 1 metoda˛ wyznaczników (patrz nast˛epny wykład i laboratorium) ujawnia powód złego uwarunkowania tego zadania: dzielenie przez różnic˛e (1 − a) bliskich sobie liczb: xk = det{Ak } det{Ak } = . det{A} 1−a (2.15) Problem 2.14 (* Badanie rozwiazania ˛ układu równanań liniowych). Napisz program w Matlabie sprawdzajacy ˛ powyższe “złote” rady/uwagi. Do wartości elementów macierzy A oraz wektora b z równania (2.14) dodaj małe liczby losowe, wygenerowane za pomoca˛ funkcji epsi=0.01; A=A+epsi*randn(2,2) (zmieniaj wartość epsi, czyli poziom zaburzeń). Rozwia˛ż równanie stosujac ˛ wzór: x = A−1 b, w Matlabie: x=inv(A)*b. Dla każdej, testowanej wartości a powtarzaj eksperyment wielokrotnie dla różnych wartości losowych zaburzeń, a nast˛epnie oblicz wartość średnia˛ otrzymanego wyniku (mean()) oraz jego odchylenie standardowe (std()). Narysuj wykres zmienności odchylenia standardowego rozwiazania ˛ układu równań w funkcji wartości a, zmienianej od -1 do 1. Oscylator programowy - generator przebiegu sinusoidalnego. Do generowania kolejnych wartości funkcji sinus: y(n) = sin(ω0 n + ϕ), f0 ω0 = 2π [rad], f pr n = 0, 1, 2, ..., N − 1, (2.16) (2.17) gdzie: f0 − liczba powtórzeń sinusoidy na sekund˛e, f pr − liczba próbek/wartości sinusoidy na sekund˛e, ϕ − kat ˛ poczatkowy, ˛ możemy użyć nast˛epujacego ˛ schematu iteracyjnego: y(n) = ay(n − 1) − y(n − 2), gdzie: (2.18) 2.7 Matematyczny wskaźnik uwarunkowania zadania obliczeniowego a = 2 cos(ω0 ), 47 (2.19) y(−1) = sin(ϕ − ω0 ), (2.20) y(−2) = sin(ϕ − 2ω0 ). (2.21) Ufff... Próba generowania sygnału sinusoidalnego 20 Hz i 40 Hz na karcie dźwi˛ekowej z próbkowaniem 192 kHz z 16-bitowym zapisem Q2.14 współczynnika a (2.18)(2.19) daje niepożadany ˛ efekt: 20 · 214 = 32768, a20Hz = 2 cos 2π 192000 40 a40Hz = 2 cos 2π · 214 = 32768. 192000 (2.22) (2.23) Ponieważ otrzymujemy takie same liczby, to generowana jest taka sama cz˛estotliwość! Rozdzielczość generowanego sygnału sinusoidalnego w pobliżu zera (czyli wielkości wyjściowej z generatora) jest o rzad ˛ wielkości gorsza niż rozdzielczość współczynnika a, który o niej decyduje (czyli wielkości wejściowej). Jaka jest przyczyna niepoprawnego zachowania generatora? Czy i jak można to naprawić? Problem 2.15 (*** Rekurencyjny generator sinusoidy w j˛ezyku Matlab i C/C++). Napisz program w j˛ezyk Matlab, implementujacy ˛ opisany powyżej generator sinusoidy. Nast˛epnie napisz program w j˛ezyku C/C++, sprawdzajacy ˛ powyższe uwagi. Na poczatku ˛ używaj tylko zmiennych typu int. Sprawdź prawdziwość równań (2.22)(2.23). Postaraj si˛e spowodować, aby oscylator zadziałał w j˛ezyku C. 2.7 Matematyczny wskaźnik uwarunkowania zadania obliczeniowego Wprowadźmy nast˛epujace oznaczenia: • • • • x - dane wejściowe zadania, xe - zaburzone dane wejściowe zadania, y = f (x) - rozwiazanie ˛ zadania, powiazane ˛ zależnościa/funkcj ˛ a˛ f (.) z danymi x, ye = f (e x) - zaburzone rozwiazanie ˛ zadania dla zaburzonych danych. Wskaźnik uwarunkowania zadania (condition number) określa liczbowo trudność obliczeniowa˛ zadania. Jest definiowany jako stosunek wzgl˛ednego zaburzenia wyniku zadania (wyjścia) do wzgl˛ednego zaburzenia danych (wejścia): cond f (x) = f (x)− f (x̃) f (x) x−x̃ x ≈ f (x) x d dx f (x) (2.24) czyli określa wrażliwość (czułość) wyniku na ewentualne bł˛edy danych wejściowych. W równaniu 2.24 symbol ∥.∥ jest norma˛ (pierwiastek z sumy kwadratów pojedynczych składników) w przypadku funkcji o wielu wartościach wyjściowych. Norma ta upraszcza si˛e do wartości bezwzgl˛ednej |.| w przypadku funkcji o tylko jednym wyjściu. 48 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń Zadania źle uwarunkowane obliczeniowo można rozwiazać ˛ z zadowalajac ˛ a˛ dokładnościa˛ stosujac ˛ wi˛eksza˛ precyzj˛e obliczeń (np. zmiana typu z float na double) lub stosujac ˛ zadanie równoważne (lub zapis równoważny), ale mniej wrażliwe na zaburzenie danych (tak jak w problemie 2.12, w którym istniały dwa alternatywne równania (2.10)(2.11)). Przykład - rozwiazywanie ˛ równania kwadratowego. Jako przykład potwierdzajacy ˛ poprawność i użyteczność definicji (2.24), zastosujmy ja˛ do rozwiazania ˛ równania kwadratowego x1 na podstawie wzoru (2.12). Na poczatek ˛ obliczmy pochodna˛ czastkow ˛ a˛ x1 wzgl˛edem b (prosz˛e wyprowadzić samemu poniższe równanie): 1 · 2b 1 dx1 , = − − √2 db 2a 2a b2 − 4ac (2.25) a nast˛epnie wstawmy ja˛ do definicji wskaźnika uwarunkowania (2.24)(prosz˛e sprawdzić poniższy wzór): condx1 (b) = 1 b · dx b db . =√ 2 x1 b − 4ac (2.26) Jeśli założymy a = 21 oraz c → 12 , to dla b = 1 otrzymujemy condx1 (b) → ∞ (dzielenie przez liczb˛e bliska˛ 0), czyli bardzo duża˛ wrażliwość wyniku na mały bład ˛ (zaburzenie) potencjalnie wyst˛epujace ˛ w wartości b. Problem 2.16 (*** Wskaźnik uwarunkowania dla rozwiazania ˛ równania kwdratowego). Sam wyprowadź równanie (2.26). Napisz program sprawdzajacy ˛ to równanie. Oblicz średnia˛ (mean()) oraz odchylenie standardowe (std()) wartości x1 , obliczonej ze wzoru 2.12, dla: a=0.5, jednej wybranej wartości c=0.490 : 0.001 : 0.500; oraz dla wielu wartości b=1+0.001*randn(1,1000). Powtórz eksperyment dla 2-3 różnych wartości c oraz porównaj otrzymane wartości x1 (ich średnie oraz rozrzuty). Wskaźnik uwarunkowania dla zadań macierzowych, np. dla rozwiazywania ˛ równań liniowych, zależy od własności macierzy, wyst˛epujacych ˛ w równaniach. Da˛żenie wyznacznika macierzy równań do zera powoduje szybki wzrost wskaźnika uwarunkowania obliczeniowego. Jak można wykazać (np. [2] lub [3]) w przypadku układu równań liniowych wskaźnik uwarunkowania dla zadania rozwiazania ˛ układu równań liniowych Ax = b (wg normy Euklidesa) jest wyrażony stosunkiem modułu najwi˛ekszej do najmniejszej wartości własnej macierzy A: condx (A) = |λmax (A)| . |λmin (A)| (2.27) Wyznaczanie wartości własnych macierzy jest kosztowne obliczeniowo, wi˛ec w praktyce stosuje si˛e mniej kosztowne oszacowanie wskaźnika uwarunkowania w postaci pierwiastka stosunku sumy kwadratów wszystkich elementów macierzy oryginalnej i macierzy do niej odwrotnej. Niestety ta definicja (wg. normy Frobeniusza macierzy) przeszacowuje wskaźnik uwarunkowania. Przykład - rozwiazywanie ˛ prostego równania macierzowego. Załóżmy, że rozwiazywane ˛ jest nast˛epujace równanie: 1001 −1000 · x = b. (2.28) −1000 1001 Literatura 49 Wskaźnik uwarunkowania rozwiazania ˛ jest dla niego rz˛edu 2000 = 103 , czyli grozi nam niebezpieczeństwo wzmocnienia bł˛edu wyniku (czyli w Matlabie bł˛edu repre−16 ) o 3 miejsca po przecinku, zentacji zapisu liczb typu double, równego eps 2 ≈ 10 co nie jest duża˛ liczba.˛ Dodatkowo nie robi to żadnego wrażenia, jeśli uwzgledni si˛e fakt, że znane liczby x moga˛ być także obarczone bł˛edem jakiegoś pomiaru rz˛edu 10−2 − 10−3 (nie ma pomiarów idealnych!). Problem 2.17 (* Wskaźnik uwarunkowania dla równania macierzowego). Wykorzystaj instrukcj˛e Matlaba lambda=eigen(A) do wyznaczenia wartości własnych macierzy A z powyższego przykładu oraz oblicz na tej podstawie dokładna˛ wartość wskaźnika uwarunkowania równania (2.28) na podstawie definicji (2.27). Powtórz obliczenia dla kilku innych wartości macierzy A. Potem zwieksz wymiar macierzy i powtórz eksperyment. 2.8 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. 1. Obliczenia numeryczne nie narodziły si˛e razem ze współczesnym komputerem, były stosowane od zarania dziejów. 2. Współczesne metody numeryczne, to połaczenie ˛ wiedzy matematycznej (algebra, analiza, geometria, statystyka ...) i komuterowej (programowanie). 3. Komputer, dzi˛eki szybkości działania, umożliwia wykonywanie bardzo złożonych obliczeń. 4. Liczby rzeczywiste nie sa˛ reprezentowane dokładnie w komputerze. 5. Reprezentacja zmiennoprzecinkowa liczb daje stała˛ dokładność wzgl˛edna.˛ 6. Dokładność wzgl˛edna dla typu double to 16 miejsc po przecinku w zapisie dziesi˛etnym. 7. Maksymalny bład ˛ reprezentacji zależy od liczby bitów typu zmiennoprzecinkowego. 8. Bład ˛ danych wejściowych propaguje si˛e na wynik obliczeń. 9. Czasami bład ˛ jest znacznie wzmacniany, zależy to od struktury zadania obliczeniowego. 10. W takim przypadku możemy ograniczyć bład ˛ wyniku przez zwi˛ekszenie precyzji danych (użycie wi˛ekszej liczby bitów) lub przez przeformułowanie zadania na równoważne, ale mniej wrażliwe. Literatura 1. 2. 3. 4. 5. S.C. Chapra, R.P. Canale, Numerical Methods for Engineers. Boston, McGraw-Hill, 2010. Z. Fortuna, B. Macukow, J. Wasowski, ˛ Metody numeryczne. WNT, Warszawa 2005. A. Jennings, Matrix Computation. Wiley, 2-nd ed., 1992. D. Kincaid, W. Cheney, Analiza numeryczna. WNT, 2006. C. Moler: "Introduction to Matlab", in Numerical Computing with Matlab, on-line: https:// www. mathworks.com/ moler/ chapters.html.html 6. J.H. Mathews, K.D. Fink, Numerical Methods Using Matlab. Upper Saddle River, Prentice-Hall, 2005. 7. S. Osowski, A. Cichocki, K. Siwek, Matlab w zastosowaniu do obliczeń obwodowych i przetwarzania sygnałów. Warszawa, Oficyna Wydawnicza Politechniki Warszawskiej, 2006. 50 2 Wprowadzenie do MeNu. Reprezentacje liczb. Bł˛edy obliczeń 8. W.H. Press, S.A. Teukolsky, W.T. Vetterling, B.P. Flannery, Numerical Recipes: The Art of Scientific Computing. Cambridge University Press, 2007. 9. W.Y. Yang, W. Cao, T.-S. Chung, J. Morris, Applied Numerical Methods Using Matlab. Wiley, Hoboken 2005. Rozdział 3 Macierze i zapis macierzowy równań Streszczenie Definicja podstawowych poj˛eć zwiazanych ˛ z macierzami i rachunkiem macierzowym, przykłady opisu i zapisu macierzowego problemów technicznych: transformaji liniowych danych oraz układów równań liniowych. 3.1 Wprowadzenie Metody numeryczne (MeNu) sa˛ ważne ponieważ prawa: fizyczne, biochemiczne, ekonomiczne,..., rzadz ˛ ace ˛ światem sa˛ opisane równaniami matematycznymi, a MeNu to komputerowe “wydanie” matematyki. Chcac ˛ zrozumieć i kontrolować na bieżaco ˛ otaczajacy ˛ nas świat musimy zaprzac ˛ do tego komputery i kazać im rozwiazywać ˛ zadania/równania matematyczne. Wiele zjawisk ma charakter wielowymiarowy, wielo-wejściowy i wielo-wyjściowy, i jest opisanych równaniami macierzowymi. Macierze sa˛ “sercem” algebry liniowej. W zwiazku ˛ z tym, w niniejszym rozdziale poznamy wybrane przykłady zastosowania zapisu macierzowego w wybranych zagadnieniach technicznych. Natomiast w rozdziale nast˛epnym zapoznamy si˛e z metodami rozwiazywania ˛ macierzowych układów równań liniowych. 3.2 Podstawowe własności macierzy Macierz dwuwymiarowa A to zbiór liczb A(m, n), uporzadkowanych ˛ w m = 1...M wierszy i n = 1...N kolumn. Macierze moga˛ być wielowymiarowe, np. A(m, n, p, q). Moga˛ też być jednowymiarowe, tzn. być wektorami i mieć postać tylko jednego poziomego wiersza (A(1, n), n = 1...N) albo tylko jednej pionowej kolumny (A(m, 1), m = 1...M). Poniżej zrobiono krótkie przypomnienie podstawowych definicji zwiazanych ˛ z rachunkiem macierzowym (do opuszczenia przez “wszystko wiedzacych”). ˛ W tabeli 3.1 zilustrowano je wybranymi przykładami wykonywania operacji macierzowych oraz wywoływania funkcji macierzowych w j˛ezyku Matlab. Aby łatwiej zrozumieć ich istot˛e, podano także przykładowe dane wejściowe i wyjściowe wszystkich operacji. Jeśli nie napisano inaczej, to wektory u, v, x sa˛ pionowe, zaś AT oznacza transpozycj˛e macierzy A (zamian˛e jej wierszy z kolumnami), a AH - jej transpozycj˛e i sprz˛eżenie zespolone. 1. [< u, v >= uH · v]. Iloczyn skalarny dwóch wektorów o tej samej długości, to suma iloczynów odpowiadajacych ˛ sobie elementów obu wektorów, pierwszych, drugich, ... itd, czyli tylko jedna liczba. Przed mnożeniem i dodawaniem elementy pierwszego wektora sa˛ transponowane i sprz˛eżone. 2. [u · vT ]. Iloczyn wektorowy dwóch wektorów, niekoniecznie o takiej samej długości, pionowego pomnożonego przez poziomy, to macierz zbudowana z iloczynów każdego elementu pierwszego wektora przez każdy element drugiego wektora. 3. [A + B]. Dodawanie macierzy o tych samych wymiarach to dodawanie ich odpowiadajacych ˛ sobie elementów (leżacych ˛ w tym samym miejscu). 4. [A · B]. Mnożenie macierzy A i B o odpowiednich wymiarach to mnożenie elementów kolejnych wierszy macierzy pierwszej przez odpowiadajace ˛ im ele51 52 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 3 Macierze i zapis macierzowy równań menty kolejnych kolumn macierzy drugiej, sumowanie tych iloczynów i zapisanie wyniku w odpowiednim miejscu macierzy wynikowej, tzn. do jej elementu: W (numer mnożonego wiersza, numer mnożonej kolumny). [uT · A]. Mnożenie wektora poziomego przez macierz to iloczyn elementów tego wektora z odpowiadajacymi ˛ im elementami kolejnych kolumn macierzy, sumowanie tych iloczynów i umieszczenie otrzymanych liczb w kolejnych elementach wynikowego wektora poziomego (operacja iloczynu skalarnego bez sprz˛eżenia). [A · u]. Mnożenie macierzy przez wektor pionowy to iloczyn skalarny tego wektora (bez sprz˛eżenia) z kolejnymi wierszami macierzy - wynikiem jest wektor pionowy. [a · A]. Mnożenie macierzy przez liczb˛e to oddzielne pomnożenie każdego elementu macierzy przez t˛e liczb˛e. [ (A+B)u=Bu+Au]. Operacje macierzowe sa˛ łaczne ˛ i przemienne. [A−1 ]. Macierz odwrotna do danej macierzy to taka, która pomnożona przez macierz oryginalna˛ daje macierz jednostkowa˛ A−1 · A = I (zerowa˛ z jedynkami na głównej przekatnej). ˛ Macierz odwrotna jest definiowana tylko dla macierzy kwadratowych. [Ax = b, x = A−1 b]. Rozwiazaniem ˛ równania macierzowego Ax = b, czyli układu równań liniowych, jest iloczyn odwrotności macierzy A i wektora b, czyli x = A−1 b. Równanie ma rozwiazanie ˛ jeśli macierz odwrotna istnieje. [poly(A)]. Z macierza˛ kwadratowa˛ jest zwiazany ˛ tzw. wielomian charakterystyczny. Miejsca zerowe tego wielomianu (roots(poly(A))) sa˛ wartościami własnymi macierzy. [det(A)]. Wyznacznikiem macierzy kwadratowej jest specyficzna liczba, charakteryzujaca ˛ t˛e macierz - jej definicja przekracza zakres tego wprowadzenia. Wyznacznik macierzy jest równy iloczynowi wartości własnych macierzy, które sa˛ pierwiastkami wielomianu charakterystycznego macierzy: det(A)=prod(roots(poly(A))). Macierz osobliwa to macierz, która ma wyznacznik równy 0 i z tego powodu nie posiada macierzy odwrotnej. [rank(A)]. Rzad ˛ macierzy (rank(A)) to liczba jej liniowo niezależnych kolumn albo wierszy, tzn. liczba kolumn, które nie moga˛ być przedstawione jako suma pozostałych kolumn pomnożonych przez jakiś skalar. [xT Ax]. Forma kwadratowa Q(x), zwiazana ˛ z macierza˛ kwadratowa˛ A, jest zdefiniowana jako: N N Q(x) = ∑ ∑ ai, j xi x j = xT Ax. (3.1) i=1 j=1 Jest ona dodatnio określona, zarówno forma jak i macierz, kiedy spełniony jest warunek Q(x) > 0 dla dowolnego wektora x ̸= 0. Zmieniajac ˛ znak > na ≧, <, ≦, otrzymujemy: dodatnia˛ półokreśloność, ujemna˛ określoność ujemna˛ półokreślność. 15. [Dekompozycja EVD macierzy]. Wektory własne vn (kolumny macierzy V o wymiarach N × N) i wartości własne λk (elementy przekatnej ˛ diagonalnej macierzy D o wymiarach N × N) symetrycznej macierzy kwadratowej A o wymiarach N × N, to takie które spełniaja˛ warunek: N A = ∑ λi · vi vTi = V · D · VT . (3.2) i=1 16. [Dekompozycja SVD macierzy]. M-elementowe ortgonalne wektory osobliwe um (pionowe, kolumny kwadratowej macierzy U o wymiarach M ×M), N-elementowe ortogonalne wektory osobliwe vn (pionowe kolumny kwadratowej macierzy V o wymiarach N × N) oraz wartości osobliwe σk (elementy na przekatnej ˛ prosto- 3.2 Podstawowe własności macierzy 53 katnej ˛ macierzy diagonalnej D o wymiaracg M × N) macierzy prostokatnej ˛ Ao wymiarach M × N, to takie które spełniaja˛ warunek: min(M,N) A(M,N) = σn · ui vTi = U(M,M) · D(M,N) · VT(N,N) ∑ (3.3) i=1 17. [Gradient ∇]. Wektor gradientu jednej funkcji wielu zmiennych f (x1 , x2 , ..., xN ) to wektor pochodnych czastkowych ˛ tej funkcji wzgl˛ednej każdej zmiennej oddzielnie: ∂f ∂f , ..., ∇f = . (3.4) ∂ x1 ∂ xN 18. [Hesjan H]. Macierz hesjanu jednej funkcji N zmiennych f (x1 , x2 , ..., xN ) to kwadratowa macierz H f (m, n) o wymiarach N × N pochodnych czastkowych ˛ tej funkcji wzgl˛edem każdej pary zmiennych: H f (i, j) = ∂f , i = 1...N, j = 1...N. ∂ xi ∂ x j (3.5) 19. [Jakobian J]. Macierz jakobianu M funkcji N zmiennych fm (x1 , x2 , ..., xN ), m = 1...M to macierz J f (m, n), która w kolejnych M wierszach posiada wektor pochodnych czastkowych ˛ kolejnej funkcji wzgl˛edem wszystkich N zmiennych, czyli gradienty tych funkcji: J f (m, n) = ∂ fm , m = 1...M, n = 1...N. ∂ xn (3.6) Macierz 2D może być (sprawdź w Wikipedii): – – – – zerowa - wszystkie elementy równe zero, diagonalna - tylko elementy na głównej przekatnej ˛ sa˛ różne od zera, jednostkowa - macierz diagonalna z jedynkami na głównej przekatnej, trójkatna ˛ górna/dolna - wszystkie elementy poniżej/powyżej (górna/dolna) głównej przekatnej ˛ sa˛ równe zero, • symetryczna - elementy leżace ˛ symetrycznie wzgledem głównej przekatnej ˛ maja˛ identyczne wartości, ogólnie A(m, n) = A∗ (n, m) gdzie ∗ oznacza sprz˛eżenie zespolone, • ortogonalna - wszystkie wiersze (albo kolumny) macierzy sa˛ do siebie ortogonalne, tzn. iloczyn skalarny dwóch różnych wierszy (wektorów poziomych wk ), jest równy 0 (wk · wH l = 0, k ̸= l), natomiast iloczyn skalarny każdego wiersza samego ze soba˛ jest różny od zera (wk · wH k ̸= 0 - definicja normy wektora); jeśli jest on dodatkowo równy 1, to macierz jest ortonormalna: ortogonalna i unormowana. Problem 3.1 (* Macierze i operacje na nich). W pierwszym rozdziale, b˛edacym ˛ wprowadzeniem do j˛ezyka Matlab, “bawiliśmy si˛e” już wektorami i macierzami. Ale ponieważ “ćwiczenie czyni mistrza”, przypomnijmy sobie teraz jeszcze raz podstawowe operacje macierzowe. Zdefiniuj wektory [u=[1;2;3]; v=[4;5;6]; oraz macierze A=[1,2,3;4,5,6;7,8,9]; B=eye(3); oraz wykonaj na nich maksymalna˛ liczb˛e operacji wymienionych w punktach w tym podrozdziale. Sprawdź “r˛ecznie” poprawność otrzmanych wyników. 54 3 Macierze i zapis macierzowy równań Tabela 3.1: Przykłady operacji macierzowych dla: 1 3 12 56 21 (matematyka) a = 10, u = x = ,v= ,A= ,B= ,S= 2 4 34 78 12 (Matlab) a=10; u=[1;2]; v=[3;4]; A=[1,2;3,4]; B=[5,6;7,8]; S=[2,1;1,2]; Nr Matematyka 1 uH · v 2 u · vT 3 A+B 4 A·B 5 uT · A 6 A·u 7 a·A 8 (A+B)u=Au+Bu 9 A−1 10 Ax = b, x = A−1 b 11 poly(A) 12 det(A) 13 rank(A) 14 xT Ax 15 evd(S) 16 svd(A) Matlab Przykład 3 12 · (u’)*v = 1 · 3 + 3 · 4 = 11 4 1 1·3 1·4 34 u*(v.’) · 34 = = 2 2·3 2·4 68 12 56 1+5 2+6 6 8 A+B + = = 34 78 3+7 4+8 10 12 12 56 1·5+2·7 1·6+2·8 19 22 A*B · = = 34 78 3·5+4·7 3·6+4·8 43 50 12 12 · = 1 · 1 + 2 · 3 1 · 2 + 2 · 4 = 7 10 (u.’)*A 34 12 1 5 A*u · = 1·1+2·2 3·1+4·2 = 34 2 11 12 10 · 1 10 · 2 10 20 a*A 10 · = = 34 10 · 3 10 · 4 30 40 (A+B)*u 12 56 1 6 8 1 22 A*u+B*u; + · = · = 34 78 2 10 12 2 34 B*u+A*u; −1 12 −2 1 inv(A) = 34 1.5 −0.5 −1 12 1 5 1 12 5 b=A*x; · = → = · 34 2 11 2 34 11 x=inv(A)*b 12 p(x) = x2 − 5x−1 − 2 poly(A) poly = 1 −5 −2 , 34 p(x) = (x − 5.37)(x + 0.37) 12 det(A) det = 1 · 4 − 2 · 3 = −2 34 12 rank(A) rank =2 34 12 1 5 12 · · = 12 · = 27 (x.’)*A*x 34 2 11 "" √1 √1 # # − 2 2 [V,D]=eig(S) 21 10 eig = , √1 √1 S=V*D*V’ 12 03 2 2 [U,D,V]=svd(A) 12 −0.40 −0.91 5.46 0 −0.58 0.82 svd = , , A=U*D*V’ 34 −0.91 0.40 0 0.37 −0.82 −0.58 3.3 Przykłady zadań macierzowych Obecny rozdział ma na celu przedstawienie kilku przykładów przejścia od układu fizycznego lub problemu technicznego do opisujacego go równania macierzowego. Zaprezentowane przykłady powinny być proste i pogladowe. ˛ 3.3 Przykłady zadań macierzowych 55 Rysunek 3.1: Obwód pradu ˛ stałego rozwiazywany ˛ metoda˛ oczkowa˛ (prawo Krirchhoffa II). 3.3.1 Prawa Kirchhoffa w układach elektrycznych Ponieważ wszystkie w˛ezły/oczka w obwodzie elektrycznym tworza˛ sieć “naczyń połaczonych”, ˛ to jesteśmy w stanie wyznaczyć stan równowagi obwodu, czyli rozkład wartości pradów ˛ i napi˛eć w stanie ustalonym, wynikajacy ˛ z: 1) konfiguracji obwodu, 2) wartości użytych elementów pasywych oraz 3) wartości zastosowanych źródeł pra˛ dowych i napi˛eciowych. W metodzie napi˛eć w˛ezłowych stosowane jest I prawo Kirchoffa: dla każdego w˛ezła obwodu elektrycznego przeprowadzamy bilans pradów ˛ - suma pradów ˛ w każdym w˛eźle powinna si˛e zerować (wartość konkretnego pradu ˛ jest obliczana jako wynik podzielenia spadku napi˛ecia na elemencie pasywnym przez wartość tego elementu). W metodzie pradów ˛ oczkowych wykorzystywane jest II prawo Kirchoffa: dla każdego oczka obwodu sporzadzamy ˛ bilans napi˛eć: wszystkie spadki napi˛ecia na elementach wyst˛epujacych ˛ w gał˛eziach oczka, pochodzace ˛ od płynacych ˛ pradów, ˛ oraz napi˛ecia, pochodace ˛ od źródeł napi˛ecia wyst˛epujacych ˛ w gałeziach każdego oczka, powinny si˛e zerować. Przykład. Obwody stałopradowe ˛ - metoda pradów ˛ oczkowych. W tym przypadku układamy równania zerowania si˛e wszystkich napi˛eć w każdym oczku dla obwodu przedstawionego na rys. 3.1, np. układu trzech akumulatorów (Ek - napi˛ecie, Rk - rezestancja wewn˛etrzna, k = 1, 2, 3) połaczonych ˛ równolegle i obcia˛żonych rezystancja˛ R0 : E1 − I1 (R1 + R2 ) + I2 R2 − E2 = 0 E2 − I2 (R2 + R3 ) + I1 R2 + I3 R3 − E3 = 0 (3.7) E3 − I3 (R3 + R0 ) + I2 R3 = 0 Po uporzadkowaniu ˛ równań ze wzgl˛edu na płynace ˛ prady ˛ oraz po przesieniu wartości źródeł napi˛ecia na prawa˛ stron˛e otrzymujemy: R1 + R2 −R2 0 I1 E1 − E2 I1 −R2 R2 + R3 −R3 I2 = E2 − E3 → I2 =? (3.8) I3 E3 0 −R3 R3 + Ro I3 | {z } macierz rezystancyjna Równanie (3.8) postaci Ax = b rozwiazujemy ˛ ze wzgl˛edu na x, czyli u nas ze wzgl˛edu na wektor nieznanych pradów ˛ oczkowych. Problem 3.2 ((L)* Rozwiazywanie ˛ obwodów elektrycznych metoda˛ oczkowa). ˛ Zapoznaj si˛e z programem 3.1. Uruchom go, sprawdź poprawność otrzymanych wyników (czy rzeczywiście otrzymane wartości pradów ˛ stanowia˛ rozwiazanie ˛ równania?). Zmień wartości elementów obwodu. Zmień struktur˛e połaczeń ˛ w obwodzie. 56 3 Macierze i zapis macierzowy równań Listing 3.1: Program do rozwiazania ˛ obwodu stałopradowego ˛ metoda˛ oczkowa˛ % matrix_obwod_dc.m clear all; close all; R1 = 10; R2 = 20; R3 = 30; R0 = 40; E1 = 1; E2 = 2; E3 = 3; A = [ R1+R2, -R2, 0; ... -R2, R2+R3, -R3; ... 0, -R3, R3+R0 ], b = [ E1-E2; ... E2-E3; ... E3 ], %x=? x1 = inv(A)*b; % inv(A) = A^(-1) x2 = pinv(A)*b; % pinv(A) = (A^T * A)^(-1) * A^T x3 = A \ b; % minimaliacja bledu sredniokwadratowego % Metoda Cramera for k=1:length(b) Ak = A; Ak(:,k) = b; % (w,k) = (:,k) x4(k) = det( Ak ) / det(A); end x4 = x4.’; [ x1, x2, x3, x4 ], pause Przykład. Obwody zmiennopradowe ˛ - metoda napi˛eć w˛ezłowych. W tym przypadku układamy równania zerowania si˛e wszystkich pradków ˛ w każdym w˛eźle dla obwodu przedstawionego na rys. 3.2, np. linii przesyłu energii elektrycznej, zamodelowanej elementami skupionymi (E - źródło napi˛ecia sieciowego o impedancji wyjściowej Ze , Zs1 , Zs2 - impedancja szeregowa linii, Zd - impedancja doziemna, Z0 impedancja odbiornika): U −E U −U 1 1 2 Ze + Zs1 = 0 U2 −U3 U2 U2 −U1 (3.9) Zs1 + Zs2 + Zd = 0 U3 −U U 2 3 = 0 + Zs2 Zo Po uporzadkowaniu ˛ równań ze wzgl˛edu na potencjały w˛ezłowe oraz po przesieniu znanych wartości pradów ˛ na prawa˛ stron˛e otrzymujemy: 1 + Z1 − 1 s1 Zs1 0 | Ze 1 Zs1 − Z1s1 + Z1s2 + Z1 d − Z1s2 {z E 0 U1 Ze − Z1s2 U2 = 0 1 1 U3 0 Zs2 + Zo } → U1 U2 =? U3 (3.10) Macierz admitancyjna Równanie (3.10) postaci Ax = b rozwiazujemy ˛ ze wzgl˛edu na x, czyli u nas ze wzgl˛edu na wektor nieznanych napi˛eć w˛ezłowych. Wynikiem sa˛ liczby zespolone: ich moduł informuje nas o wartościach skutecznych napi˛eć (dla zasilania sinusoidal√ nego to amplituda sinusoidy podzielona przez 2), natomiast kat ˛ - o katach ˛ fazowych napi˛eć, czyli przesuni˛eciu katowym ˛ w stosunku do źródła napi˛ecia E. Problem 3.3 (* Rozwiazywanie ˛ obwodów elektrycznych metoda˛ w˛ezłowa). ˛ Na podstawie listingu 3.1 napisz program do rozwiazania ˛ metoda˛ potencjałów w˛ezłowych 3.3 Przykłady zadań macierzowych 57 Rysunek 3.2: Obwód pradu ˛ zmiennego rozwiazywany ˛ metoda˛ w˛ezłowa˛ (prawo Krirchhoffa I). Rysunek 3.3: Liniowy układ dynamiczny: dane wyjściowe y(n) otrzymane sa˛ jako wynik splotu danych wejściowych x(n) z wagami układu wk . układu pradu ˛ zmiennego, przedstawionego na rys. 3.2. Sam przyjmij sensowne wartości elementów obwodu. Pami˛etaj: impedancja rezystancyjna (R, ohmy) to ZR = R, pojemnościowa (C, farady) to ZC = j2π1 fC , a indukcyjna (L, henry) to ZL = j2π f L, gdzie f oznacza cz˛estotliwość pracy układu wyrażona˛ w hercach. Sprawdź poprawność otrzymanych wyników (czy rzczewiscie otrzymane wartości napi˛eć stanowia˛ rozwiazanie ˛ równania?). Zmień wartości elementów obwodu. Zmień układ połaczeń ˛ elementów obwodu. 3.3.2 Równania splotowe w układach dynamicznych W układach liniowych liczby wychodzace ˛ (wyjściowe) y(n) zależa˛ od liczb wchodza˛ cych (wejściowych) x(n) oraz liczb w(k), k = 0, 1, 2, ..., M zwiazanych ˛ z systemem i determinujacych ˛ jego właściwości - patrz rysynek 3.3. Ogólnie dla każdej wartości n prawdziwa jest zależność: M y(n) = ∑ w(k) x(n − k) = w(0)x(n − 0) + w(1)x(n − 1) + ... + w(M)x(n − M), |{z} k=0 |{z} | {z } wy jscie uklad we jscie (3.11) czyli każda próbka wyjściowa y(n) jest suma˛ M + 1 ostatnich próbek wejściowych x(n − k), k = 0...M, pomnożonych przez odpowiadajace ˛ im wagi w(k), tzn. x(n − 0) przez w(0), x(n − 1) przez w(1), x(n − 2) przez w(2), itd. W systemach telekomunikacyjnych liczby x(n) sa˛ nadawane, liczby y(n) sa˛ odbierane, a liczby w(k) sa˛ nieznane i odpowiadaja˛ konkretnemu kanałowi transmisji. Odbiornik otrzymuje wi˛ec liczby inne (y(n)) niż te, które zostały nadane (x(n)). Aby odtworzyć liczby nadane na podstawie odebranych potrzebna jest znajomość wag w(k), charakteryzujacych ˛ konkretny kanał transmisyjny. W tym celu nadaje si˛e sygnał pilota p(n) jako x(n), i odbiornik znajac ˛ nadane i odebrane, po procedurze synchronizacji, jest w stanie obliczyć wagi kanału, rozwiazuj ˛ ac ˛ nast˛epujace ˛ równanie macierzowe: 58 3 Macierze i zapis macierzowy równań p(M) p(M − 1) · · · p(1) p(0) w(0) y(M) p(M + 1) p(M) · · · p(2) p(1) w(1) y(M + 1) · . = .. .. . . . . .. .. .. .. .. . . p(2M) p(2M − 1) · · · p(M + 1) p(M) w(M) y(2M) | {z } | {z } | {z } w P (3.12) y Czyli otrzymujemy układ M + 1 równań z M + 1 niewiadomymi, który trzeba rozwia˛ zać ze wzgl˛edu na wektor wag w: w = P−1 y (3.13) Kiedy wagi układu, u nas kanału transmisyjnego, sa˛ już znane, to można dekodować liczby nadane x(n) na podstawie odebranych y(n), rozwiazuj ˛ ac ˛ nast˛epujace ˛ równanie (zakładamy, że nadano tylko M + 1 danych oraz że przed nimi na wejściu układu były wyłacznie ˛ wartości zerowe): x(0) y(0) w(0) 0 ··· 0 0 w(1) w(0) · · · 0 0 x(1) y(1) · . = . (3.14) .. .. . . . . . .. .. .. .. . . x(M) y(M) w(M) w(M − 1) · · · w(1) w(0) {z } | {z } | {z } | x W y i otrzymujac: ˛ x = W−1 y (3.15) Problem 3.4 ((L)* Odzyskiwanie danych wejściowych z wyjścia układów liniowych opisanych funkcja˛ splotu). Zapoznaj si˛e z programem 3.2. Uruchom go, sprawdź poprawność otrzymanych wyników. Zmień liczb˛e oraz wartości wag układu. Zmień sygnał pilota (testowy, identyfikujacy) ˛ z losowego na badziej zdeterminowany. Zmień wartości przesyłaych danych. Listing 3.2: Program do testowania ukladow liniowych opisanych funkcja˛ splotu % matrix_splot.m clear all; close all; % Parametry M = 3; w = 1:M; N = M+(M-1); p = rand(1,N); y = conv(p,w); % liczba wag systemu/ukladu/kanalu % wagi % dlugosc sygnalu niezbedna do identyfikacji wag % wejscie - probki pilota % wejscie p(n) --> wyjscie y(n): splot wejscia z wagami ukladu % Estymacja wag ukladu for m = 0:M-1 P(1+m,1:M) = p( M+m : -1 : 1+m); end y = y( M : M+M-1 ); west = inv(P)*y’ % Estymacja liczb nadanych x = rand(1,M); % wejscie - probki nieznane y = conv(x,w); % wyjscie - splot wejscia z wagami ukladu W = zeros(M,M); % inicjalizacja 3.3 Przykłady zadań macierzowych 59 for m = 0:M-1 W(1+m,1:1+m) = w( 1+m : -1 : 1); end y = y(1:M); xest = inv(W)*y’; xerr = x’ - xest, 3.3.3 Modele autoregresyjne danych W wielu przypadkach liczba otrzymana z jakiegoś pomiaru jest liniowa˛ kombinacja˛ (liniowa˛ regresja) ˛ wyników z poprzednich pomiarów: P x(n) = ∑ a p x(n − p). (3.16) p=1 czyli nast˛epne wartości można prognozować/przewidywać na podstawie wartości poprzednich (stad ˛ oznaczenie p = 1...P). Dysponujac ˛ liczbami x(n) możemy wyznaczyć wartości współczynników autoregresji a p sygnału, rozwiazuj ˛ ac ˛ poniższy układ równań: x(P) x(P − 1) x(P + 1) x(P) .. .. . . x(2P − 1) x(2P − 2) | {z X x(1) a(1) x(P + 1) x(2) a(2) x(P + 2) .. · .. = .. . . . · · · x(P + 1) x(P) a(P) x(2P) } | {z } | {z } ··· ··· .. . x(2) x(3) .. . a (3.17) x ze wzgl˛edu na wektor: a = X−1 · x. (3.18) Przykładowo model autoregresyjny jest słuszny w przypadku sumy sinusoid tłumionych (“gaszonych”) eksponencjalnie oraz sygnałów rzeczywistych, które maja˛ zbliżona˛ budow˛e, np. dźwi˛eczne fragmenty sygnału mowy, podczas których struny głosowe rytmicznie pracuja.˛ Przyjmijmy, że x(n), n = 1, 2, ..., N, jest równe: K x(n) = K ∑ xk (n) = ∑ Ak e−dk (n·dt) cos (2π fk (n · dt) + ϕk ). k=1 k=1 (3.19) gdzie dt jest odst˛epem czasowym pomi˛edzy kolejnymi danymi (okresem próbkowania danych), natomiast Ak , dk , fk , ϕk oznaczaja˛ odpowiednio: amplitud˛e (“sił˛e”), tłumienie, liczb˛e oscylacji na sekund˛e oraz kat ˛ poczatkowy ˛ każdej kosinusoidy składowej danych (“sygnału”). W takim przypadku w równaniach (3.16)(3.17) należy przyjać ˛ P = 2K i można je wykorzystać do obliczenia, w pierwszej kolejności, współczynników predykcji a p z (3.18), oraz, w drugiej kolejności, wartości dk , fk , k = 1...K poszczególnych sinusoid, ukrytych w danych. W tym celu należy znaleźć zespolone miejsca zerowe (pierwiastki r p , p = 1....P,) nast˛epujacego ˛ wielomianu zmiennej zespolonej z: w(z) = 1 − a1 z−1 − a2 z−2 − ... − aP z−P = 1 − r1 z−1 ... 1 − rP z−1 , które sa˛ równe: (3.20) 60 3 Macierze i zapis macierzowy równań (±) rk = e−dk ·dt± j2π fk ·dt , k = 1, 2, ..., K, (3.21) pozostawić tylko połow˛e z nich, majacych ˛ dodatnia˛ cz˛eść urojona˛ w wykładniku eks(+) ponenty rk , oraz obliczyć: (+) (+) − Re ln rk Im ln rk dk = , fk = , . (3.22) dt 2πdt Problem 3.5 (* Znajdowanie współczynników autoregresyjnych dla sekwencji liczb). Zapoznaj si˛e z programem 3.3, w którym sygnałem analizowanym jest suma tłumionych sinusoid. Przeanalizuj go: szczególnie zwróć uwag˛e jak sa˛ wyznaczane współczynniki autoregresyjne a. Zauważ, że możliwe jest odzyskanie wartości cz˛estotliwości poszczególnych oscylacji oraz wartości ich tłumień nast˛epujac ˛ a˛ metoda: ˛ 1) potraktowania wartości współczynników a jako współczynników wielomianu, 2) wyznaczenia zespolonych miejsc zerowych tego wielomianu, 3) obliczenie na ich podstawie poszukiwanych wartości. Zmień wybrane parametry sygnału i sprawdź czy dalej sa˛ one poprawnie wyznaczane. Dodaj do sygnału jeszcze jedna˛ składowa˛ i oblicz wartości jej paramertów. Dodaj do sygnału bardzo słaby szum gaussowski (randn()) i sprawdź jak si˛e zmienił wynik. Listing 3.3: Program do obliczania współczynników autoregresyjnych danych % matrix_ar.m clear all; close all; fpr = 10000; dt = 1/fpr; % liczba probek danych na sekunde, okres probkowania f = [ 1000 2000 3000 ]; % liczba powtorzen na sekunde skladowych sinusoid d=[1 2 3 ]; % tlumienie skladowych A = [ 1 0.5 0.25 ]; % amplituda skladowych K = length(f); % liczba skladowych sygnalu P = 2*K; % rzad predykcji: podwojona liczba skladowych N = 2*P; % potrzebna liczba danych x = zeros(1,N); % inicjalizacja danych for k = 1 : K % generacja i akumulacja kolejnych sinusoid x = x + A(k) * exp(-d(k)*(0:N-1)*dt) .* cos(2*pi*f(k)*(0:N-1)*dt + pi*rand(1,1)); end X = toeplitz( x(P:2*P-1), x(P:-1:1) ), % macierz Toeplitza probek danych x = x( P+1 : P+P)’, % wektor danych a = inv(X)*x; % rozwiazanie rownania r = roots( [1, -a’] ); % pierwiastki wielomianu pow = log( r ); % logarytm naturalny z pierwiastkow omega = imag(pow); % czesc urojona [omega, indx] = sort( omega, ’ascend’ ); % sortowanie min-max fest = omega(K+1:2*K)/(2*pi*dt), % czestotliwosci skladowych (dodatnie) dest = -real( pow(indx(K+1:2*K)) )/dt, % tlumienie skladowych Dla bardzo ambitnych. Zawsze jest lepiej wiedzieć wi˛ecej niż mniej. Dlatego dla pozytywnie zakr˛econych proponujemy przejście Orla˛ Percia.˛ Czy jesteśmy w stanie odzyskać z sygnału sumarycznego także amplitudy Ak i katy ˛ fazowe ϕk ? Tak. Pojedyncza˛ składowa˛ sumy (3.19) możemy zapisać w sposób nast˛epujacy ˛ (∗ oznacza sprz˛eżenie zespolone): xk (n) = Ak e−Dk n cos (Ωk n + ϕk ) = ck Ek,1 (n) + c∗k Ek,2 (n), gdzie: (3.23) 3.3 Przykłady zadań macierzowych 61 Dk = dk · dt, (3.24) Ωk = 2π fk · dt, Ak ck = e jϕk , 2 Ek+ (n) = e j(Ωk + jDk )n , (3.25) − j(Ωk − jDk )n Ek− (n) = e (3.26) (3.27) . (3.28) (3.29) Współczynniki zespolone ck , zwiazane ˛ z kolejnymi kosinusami, można obliczyć rozwiazuj ˛ ac ˛ nast˛epujace ˛ równanie macierzowe ze wzgl˛edu na wektor c: Ec = x, E1+ (1) E1− (1) E1+ (2) E 1− (2) .. .. . . E1+ (N − 1) E1− (N − 1) E1+ (N) E1− (N) (3.30) · · · EK+ (1) EK− (1) c1 x(1) c∗ x(2) · · · EK+ (2) EK− (2) 1 .. .. .. .. .. · = . . . . . . · · · EK+ (N − 1) EK− (N − 1) cK x(N − 1) · · · EK+ (N) EK− (N) c∗K x(N) A znajac ˛ ck , możemy obliczyć Ak i ϕk ze wzoru (3.26), a potem dk korzystajac ˛ z (3.24). Problem 3.6 (*** Dodatkowe wyznaczanie wartości amplitud oraz katów ˛ kosinusoidalnych składowych danych). Uzupełnij programem 3.3 o obliczanie wartości amplitud i katów ˛ tłumionych kosinusoid, zawartych w sygnale (3.19). Skorzystaj ze wzoru (3.30). 3.3.4 Macierzowe transformacje liniowe Pomnożenie pionowego, N-elementowego wektora danych pomiarowych (eksperymentalnych) przez jakaś ˛ macierz kwadratowa˛ o wartościach rzeczywistych i wymiarach N × N (y = Ax) nie stanowi żadnego problemu. Pstryk ... i gotowe. Ale w jakim celu mamy to robić? Przykładowo, jeśli wybierzemy specjalna˛ macierz, np. z ortogonalnymi (niezależnymi, prostopadłymi) wierszami, to wynik takiego iloczynu może być dla nas bardzo cenny. Załóżmy, że analiz˛e wektora danych x przeprowadzamy równaniem y = Ax. Otrzymany wektor y, wynik iloczynu skalarnego wektora x z kolejnymi wierszami macierzy A, informuje nas wówczas o podobieństwie wektora x do kolejnych wierszy tej macierzy: “tego wiersza jest dużo w x, a tamtego bardzo mało”. Odtworzenie wektora danych x na podstawie wektora współczynników y jest realizowane równaniem x̂ = A−1 y. Ponieważ dla macierzy ortogonalnej o wartościach rzeczywistych zachodzi równość A−1 = AT , dlatego w tym przypadku mamy x̂ = AT y, czyli wektor x jest rekonstruowany jako suma kolumn macierzy AT (które sa˛ transpozycja˛ wierszy macierzy A, użytej do analizy). Z tego powodu elementy wektora y sa˛ dla nas bardzo ważne: rzeczywiście informuja˛ nas “ile” każdego wiersza macierzy A jest w wektorze x. Najprostszymi ortogonalnymi macierzami analizujacymi ˛ sa˛ macierze z wierszami, zawierajacymi ˛ kolejne, coraz szybciej oscylujace ˛ kosinusy albo sinusy (czy słyszałeś coś o szeregu Fouriera?). W taki sposób przeprowadza si˛e dyskretna˛ transformacj˛e 62 3 Macierze i zapis macierzowy równań kosinusowa˛ (DCT) lub sinusowa˛ (DST) danych. Przykładowo, dla transformacji DCTIV elementy macierzy analizujacej ˛ A(m, n) sa˛ równe: r A(m, n) = 2 (n + 0.5)(k + 0.5) cos π , N N m = 0...N − 1, n = 0...N − 1. (3.31) Problem 3.7 ((L)** Transformacje ortogonalne wektorów danych, np. mowy, muzyki). Zapoznaj si˛e z programem 3.4, w którym: 1) fragment sygnału mowy jest pomnożony przez ortogonalna˛ macierz kosinusów, 2) współczynniki wynikowego wektora odpowiadajace ˛ wysokim cz˛estotliwościom zostaja˛ wyzerowane, 3) sygnał jest syntezowany z pozostawionych współczynników. Zmodyfikuj program tak, aby można było pozostawić w wektorze y współczynniki w przedziale od-do. Odsłuchaj sygnał zsyntezowany dla kilku wybranych przedziałów: na dole, w środku, na górze. Zmodyfikuj program tak, aby analizowanym wektorem była suma 500 i 1000 wiersza macierzy A. Podczas modyfikacji wyzeruj 1000-ny element wektora y. Porównaj na rysunku wektor x danych wejściowych oraz wektor y danych wyjściowych. Odsłuchaj oba sygnały. Problem 3.8 (** Odsłanianie kanarka). Ze strony FindSounds pobierz dwa nagrania: słonia/hipopotama i kanarka/komara. Dodaj je do siebie. Nast˛epnie usuń z sumy sygnałów ryk słonia metoda: ˛ 1) analiza (y = Ax), 2) modyfikacja/zerowanie wybranych wartości wektora y, 3) synteza (ŝ = A−1 y). Listing 3.4: Program do przeprowadzania transformacji ortogonalnych wektorów danych % matrix_transform.m clear all; close all; % Dane wejsciowe [x,fpr]=audioread(’mowa.wav’,[1,2^14]); N = length(x); figure; plot(x); title(’x(n)’); % Transformacja liniowa/ortogonalna - ANALIZA n=0:N-1; k=0:N-1; A = sqrt(2/N)*cos( pi/N *(k’*n)); %x = A(500,:) + A(1000,:); x = x’; y = A*x; figure; plot(y); title(’y(k)’); % Modyfikacja wyniku y(N/8+1:N,1) = zeros(7*N/8,1); % y(1:N/8,1) = zeros(1*N/8,1); % y(1000)=0; figure; plot(y); title(’y(k)’); % Transformacja odwrotna - SYNTEZA xback = A’*y; figure; plot(xback); title(’xback(n)’); soundsc(x,fpr); pause 3.3 Przykłady zadań macierzowych 63 soundsc(xback,fpr); Problem 3.9 (* Ortogonalne transformacje macierzy danych, np. obrazów). Zapoznaj si˛e z programem 3.5, w którym: 1) wczytujemy macierz pikseli obrazu, 2) wykonujemy transformacj˛e ortogonalna˛ 1D DCT-II wszystkich kolumn macierzy (piksele obrazu sa˛ zastapione ˛ wynikiem transformacji, czyli współczynnikami podobieństwa kolumn macierzy do kosinusów), 3) wykonujemy transformacj˛e ortogonalna˛ 1D DCT-II wszystkich wierszy macierzy otrzymanej w kroku 2), 4) pozostawiamy tylko współczynniki leżace ˛ w lewym górnym rogu wynikowej macierzy 2D DCT, zwiazane ˛ z najniższymi cz˛estotiwościami obrazu, albo wspołczynniki o najwi˛ekszych wartościach, 5) wykonujemy dwie serie odwrotnych transformacji 1D DCT, czyli 1D IDCT, po wierszach i po kolumnach, 6) ogladamy ˛ wynik przetwarzania. Znajdź jaka jest najmniejsza liczba pozostawionych współczynników 2D DCT, która gwarantuje akceptowalna,˛ według ciebie, jakość odtworzonego obrazu. Listing 3.5: Program do przeprowadzania transformacji ortogonalnych macierzy danych % matrix_image.m - 2D DCT-II obrazu: analiza - synteza clear all; close all; % Wczytaj obraz i go wyswietl [img,map] = imread(’lena512.bmp’); figure; imshow(img,map); title(’Przetwarzany obraz’); pause % Przeksztalc na obraz czarno-bialy jesli obraz jest kolorowy if( size(img,3)==1 ) img = double( img )/255; else img = double( rgb2gray(img) )/255; end colormap(gray); figure; imshow(img); title(’Obraz B&W’); pause % Transformacja 2D DCT obrazu wsp = dct( dct( img ).’ ).’; % transformacja 1D DCT wszystkich kolumn, potem wierszy %wsp = dct2( img ); % to samo w jednej funkcji figure; imshow( abs(wsp) ); title(’Wspolczynniki DCT2’); pause % Pozostaw wspolczynniki o najwiekszych wartosciach K = 75; w = zeros( size(wsp) ); w(1:K,1:K) = wsp(1:K,1:K); % Odwrotna transformacja 2D DCT obrazu img2 = idct( idct( w ).’ ).’; % transformacja 1D IDCT wszystkich kolumn, potem wierszy %img2 = idct2( w ); % to samo w jednej funkcji figure; subplot(121); imshow(w); title(’Wybrane wspolczynniki DCT’); subplot(122); imshow(img2); title(’Zsyntezowany obraz’); pause % Pozostaw tylko najwieksze wspolczynniki maxim = max(max(wsp)); % najwiekszy wspolczynnik figure; % subplot(121); imshow(img); title(’Input image’); for k = -16 : 0 k % wartosc zmieniana w petli threshold = 2^k * maxim, % obliczony prog c = wsp; % oryginalne wsp. DCT c( abs(c) < threshold ) = 0; % wyzeruj wsp. mniejsze od progu before=numel(c), after=nnz(c), % liczba wsp.: wszystkich, pozostawionych/niezerowych 64 3 Macierze i zapis macierzowy równań img2 = idct2( c ); % odwrotne DCT 2D: rekonstrukcja obrazu subplot(121); imshow( c ); title(’Wspolczynniki DCT 2D’); subplot(122); imshow( img2 ); title(’Obraz z nich zsyntezowany’); pause end Problem 3.10 (*** Obrót obiektów w przestrzeniach 2D i 3D). Do zrobienia: 1. znalezienie macierzy A obrotu 2D oraz obrotów 3D, np. tutaj, czyli na stronie https:// pl.wikipedia.org/ wiki/ Macierz_obrotu, 2. definicja wszystkich punktów przykładowych obiektów P = [x, y] (macierz dwukolumnowa) oraz P = [x, y, z]) (macierz trójkolumnowa), 3. obrót wszystkich punktów obiektu, np. P = A · P′ (np. w Matlabie: P_out = A*P_in’;), 4. wizualizacja obiektów przed obrotem i po obrocie - funkcje plot(x,y,’.’), plot(P,’.’) oraz plot3(x,y,z,’.’), plot3(P,’.’). Jako przykład wizualizacji danych 3D możesz wykorzystać program 3.6 - obróć wyświetlany w nim obiekt. Na koniec z serwisu http://maps.google.com i z http:/www.gpsvisualizer.com możesz pobrać jakieś dane topograficzne powierzchni ziemi i dokonać ich obrotu. Przykładowe babia_gora.dat znajdziesz w materiałach laboratoryjnych. Problem 3.11 (***** Transformacje afiniczne obiektów w przestrzeniach 2D i 3D). Wszystko jak w zadaniu poprzednim, tylko transformacja afiniczna każdego punktu (znajdź równanie) zamiast jego obrotu. Listing 3.6: Program do przestrzennej wizualizacji oraz obrotów obiektów 3D % matrix_obiekt3D.m clear all; close all; load(’X.mat’); size(X) figure; grid; plot3( X(:,1), X(:,2), X(:,3), ’b.’ ); pause x = X(:,1); y = X(:,2); z = X(:,3); vmin = min( min(x), min(y) ); % min vmax = max( max(x), max(y) ); % max [xi,yi] = meshgrid( vmin : (vmax-vmin)/200 : vmax ); % dopasowanie zakresu zi = griddata( x, y, z, xi, yi, ’linear’ ); % interp: nearest, linear, spline, cubic figure; surf( xi,yi,zi ); pause % rysunek ax = -45/180*pi; ay = -90/180*pi; az = 135/180*pi; Rx = [ 1, 0, 0; 0, cos(ax), -sin(ax); 0, sin(ax), cos(ax) ]; % macierz rotacji wzg. x Ry = [ cos(ay), 0, -sin(ay); 0, 1, 0; sin(ay), 0, cos(ay) ]; % macierz rotacji wzg. y Rz = [ cos(az), -sin(az), 0; sin(az), cos(az), 0; 0, 0, 1 ]; % macierz rotacji wzg. z XR = Rz * Ry * Rx * X’, % 3 rotacje po kolei figure; grid; plot3( XR(1,:), XR(2,:), XR(3,:), ’b.’ ); % wynik obrotu Literatura 65 3.4 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. 1. Wiele zagadnień technicznych jest opisywanych równaniami macierzowymi. Podstawowa znajomość rachunku macierzowego jest niezb˛edna w naszym kursie. W tym rozdziale przypomnieliśmy sobie podstawowe poj˛ecia zwiazane ˛ z tym rachunkiem. 2. W programowaniu zagadnień technicznych organizujemy i przeprowadzamy obliczenia w sposób macierzowy, np. Y = AX - wejście X, wyjście Y, układ A, oraz rozwiazujemy ˛ równania macierzowe z wieloma niewiadomymi, np. AX = B - znane A i B, szukane X. 3. Transformacje liniowe y = Ax wektorów liczb (np. spróbkowana: mowa, muzyka, nadawany sygnał telekomunikacyjny) to bardzo ważny przykład zmiany postaci danych. Wektor danych wejścowych jest mnożony przez macierz transformacji i przetworzony w ten sposób na inny wektor. Z jednej strony operacja taka może modelować przetwarzanie zachodzace ˛ w układzie rzeczywistym, np. operacj˛e splotu transmitowanych danych z macierza˛ kanału, przez który te dane przechodza.˛ Z drugiej strony transformacja liniowa może być wykorzystywana do analizy zawartości interesujacego ˛ nas wektora liczb (np. jakiego typu ciagów ˛ liczb jest on suma). ˛ W tym przypadku otrzymany wektor wynikowy powinien nam mówić wi˛ecej o naturze analizowanego wektora danych. Przykładem ortogonalnej transformacji liniowej jest powszechnie używana dyskretna transformcja Fouriera (analiza cz˛estotliwościowa), oraz dyskretna transformacja kosinusowa (kodery dźwi˛eku i obrazów). 4. Szczególnym przypadkiem zależności macierzowej jest układ równań liniowych Ax = b, który należy rozwiazać ˛ ze wzgl˛edu na b. W tym rozdziale nie zajmowaliśmy si˛e algorytmami numerycznymi rozwiazywania ˛ równań, gdyż b˛edzie to treścia˛ rozdziału nast˛epnego. Zapoznaliśmy si˛e jedynie z kilkoma wybranymi, ważnymi przykładami rozwiazywania ˛ układów równań liniowych w elektroinfomatyce: • obliczanie rozkładu napi˛eć/pradów ˛ w układach elektrycznych, • rozwiazywanie ˛ równań splotowych, opisujacych ˛ liniowe układy dynamiczne, w których aktualna próbka wyjściowa jest liniowa˛ kombinacja˛ (suma˛ ważona) ˛ określonej liczby ostatnich próbek wejściowych. • obliczanie współczynników w modelach autoregresyjnych danych. Literatura 1. G.H. Golub, C.F. Van Loan, Matrix computations. The Johns Hopkins University Press, Batlimore, 2013. 2. M. Jarocka, J. Kozłowska, B. Madras-Kobuz, A. Olszewska, Rachunek macierzowy. Politechnika Białostocka, Białystok, 2020. 3. T. Kaczorek, Wektory i macierze w automatyce i elektrotechnice. WNT – Wydawnictwa Naukowo-Techniczne, Warszawa, 2008. 4. C. Moler: "Introduction to Matlab", in Numerical Computing with Matlab, on-line: https:// www. mathworks.com/ moler/ chapters.html.html Rozdział 4 Dekompozycje macierzy i rozwiazywanie ˛ układów równań liniowych Streszczenie Dekompozycje macierzy LU, Choleskiego oraz QR, rozwiazywanie ˛ układów równań liniowych metodami: Cramera (wyznaczników), eliminacji (GaussaJordana i Gaussa), dekompozycji macierzy (LU i Choleskiego), iteracyjnymi (Jacobiego, Gaussa-Seidla, SOR). 4.1 Wprowadzenie 4.1.1 Określone układy równań Głównym celem niniejszego rozdziału jest przedstawienie wybranych metod rozwia˛ zywania takiego układu równań liniowych, w którym liczba równań jest równa liczbie niewiadomych. W zapisie macierzowym mamy: b1 x1 a11 a12 · · · a1N a21 a22 · · · a2N x2 b2 (4.1) Ax = b, .. .. . . .. · .. = .. , . . . . . . aN1 aN2 · · · aNN bN xN gdzie: • A — znana macierz kwadratowa o wymiarach N × N, • b — znany wektor pionowy o wymiarach N × 1, • x — szukany wektor pionowy o wymiarach N × 1. W interpretacji graficznej jest to zadanie znalezienia punktu przeci˛ecia (x = [x1 , x2 , ..., xN ]T ) N hiperpłaszczyzn w przestrzeni N-wymiarowej, jeśli on istnieje (a nie istnieje wówczas kiedy hiperpłaszczyzny sa˛ równoległe). Dla przypadku N = 2 zadanie to upraszcza si˛e do wyznaczenia punktu przeci˛ecia dwóch linii prostych na płaszczyźnie (x1 , x2 ) (patrz rys. 2.14): b a11 a12 x · 1 = 1 a21 a22 x2 b2 → ( x2 = f1 (x1 ) = x2 = f2 (x1 ) = 1 a12 1 a22 (−a11 x1 + b1 ) (−a21 x1 + b2 ) (4.2) Oczywiście punkt przeci˛ecia może nie istnieć, jeśli linie sa˛ równoległe. Natomiast w interpretacji wektorowej jest to problem znalezienia takich wartości elementów wektora x, czyli xi , i = 1, 2, ..., N, aby po wymnożeniu ich przez odpowiadajace ˛ kolumny macierzy A otrzymać wektor b: chcemy aby znany wektor b był liniowa˛ kombinacja,˛ czyli suma˛ ważona,˛ wszystkich kolumn znanej macierzy A: b1 a1, j b2 N N a2, j b = ∑ x j · [A]i=1...N, j , (4.3) .. = ∑ x j · .. . j=1 . j=1 bN aN. j Mnożac ˛ lewostronnie obie strony równania (4.1) przez A−1 , mamy: 67 68 4 Dekompozycje macierzy i rozwiazywanie ˛ układów równań liniowych A−1 A · x = A−1 · b → I · x = A−1 · b (4.4) oraz korzystajac ˛ z faktu, że A−1 A = I jest macierza˛ identycznościowa˛ (zerowa z jedynkami na głównej przekatnej), ˛ otrzymujemy: x = A−1 · b. (4.5) Czyli, jak widać, pod wzgl˛edem trudności, nasze zadanie głównie sprowadza si˛e do wyznaczenia odwrotności macierzy A. 4.1.2 Nadokreślone układy równań A co w przypadku kiedy liczba równań jest wi˛eksza od niewiadomych, czyli w przypadku tzw. nadmiarowego/nadokreślonego układu równań? Przykładowo otrzymywanego podczas przeprowadzania wi˛ekszej liczby pomiarów niż jest wymagana, w celu zmniejszenia wpływu szumu na wynik obliczeń. Szczegółowo zagadnieniem tym zajmiemy si˛e podczas laboratorium 6, obecnie go tylko krótko streścimy. Przyjmijmy dla uproszczenia, że mamy rozwiazać ˛ nast˛epujace ˛ układ 4 równań tylko z 2 niewiadomymi: b1 a11 a12 b2 a21 a22 x1 A · x = b, (4.6) a31 a32 x2 = b3 , b4 a41 a42 Wówczas mnoży si˛e lewostronnie to równanie przez transpozycj˛e macierzy A, czyli przez AT : AT Ax = AT b (4.7) Wynik mnożenia AT A zawsze daje w wyniku macierz kwadratowa,˛ w naszym przypadku o wymiarach 2 × 2: a11 a12 c11 c12 a11 a21 a31 a41 a21 a22 T = (4.8) A A= · c21 c22 a12 a22 a32 a42 a31 a32 a41 a42 gdzie: c11 = a11 a11 + a21 a21 + a31 a31 + a41 a41 , (4.9) c12 = a11 a12 + a21 a22 + a31 a32 + a41 a42 , (4.10) c21 = a12 a11 + a22 a21 + a32 a31 + a42 a41 , (4.11) c22 = a12 a12 + a22 a22 + a32 a32 + a42 a42 . (4.12) −1 Z tego powodu można wyznaczyć jej odwrotność AT A i pomnożyć przez nia˛ lewostronnie obie strony równania (4.7): T −1 T −1 T A A · A A x = AT A · A b, (4.13) 4.1 Wprowadzenie 69 pozostwiajac ˛ dzi˛eki temu po lewej stronie tylko szukany wektor x (korzystamy z definicji macierzy odwrotnej): −1 T x = AT A A b. (4.14) Macierz otrzymana przed b po prawej stronie równania (4.14): −1 T A . Apinv = AT A (4.15) nazywa si˛e macierza˛ pseudo-odwrotna˛ niekwadratowej macierzy A (w Matlabie oblicza ja˛ funkcja Apinv = pinv(A)). Wektor x obliczony równaniem (4.14), po pomnożeniu przez macierz A daje wektor Ax, który jest najbliższy do wektora b (Ax → b) w sensie minimalnego bł˛edu sumy kwaratów odchyłek wektora Ax od wektora b: N J(x) = ε T ε = (b − Ax)T (b − Ax) = ∑ εi2 → min (4.16) i=1 Wykażmy obecnie, że tak rzeczywiście jest. Załóżmy, że szukamy wartości wektora x, która minimalizuje sum˛e kwadratów wszystkich odchyłek, zdefiniowana˛ równaniem (4.16). Obliczajac ˛ pochodna˛ funkcji J(x) wzgl˛edem wektora x i przyrównujac ˛ wynik do zera, otrzymujemy: ∂J T b b − 2xT AT b + xT AT Ax = −2AT b + 2AT Ax = 0. (4.17) ∂x Po przeniesieniu pierwszego składnika sumy na druga˛ stron˛e równania i po podzieleniu przez 2, otrzymujemy równanie normalne, a stad ˛ jego rozwiazanie ˛ (4.14): T A A x = AT b → −1 T x = AT A A b, c.b.d.o. (4.18) Dalej w tym rozdziale b˛edziemy zajmować si˛e wyłacznie rozwiazywaniem ˛ układów równanań liniowych z macierza˛ kwadratowa,˛ czyli opisanych przez (4.1) i maja˛ cych rozwiazanie ˛ (4.5). 4.1.3 Aspekty obliczeniowe W zależności od konkretnego przypadku technicznego, docelowej architektury sprz˛etowej, wymaganej dokładności oraz wymagań czasowych wybieramy inna˛ metod˛e rozwiazywania ˛ układu równań. Najtrudniejszym przypadkiem jest konieczność szybkiego rozwiazania ˛ zadania w czasie rzeczywistym (real-time) i z małym wykorzystaniem pami˛eci (najlepiej in-place). Implementacja sprz˛etowa może dotyczyć tak superkomputerów i obliczeń w chmurze, jak i prostych procesorów sterujacych ˛ i procesorów DSP oraz obliczeń typu embedded. Metody, które b˛eda˛ omówione, zostały wymienione w streszczeniu rozdziału. Ponieważ najbardziej efektywne metody rozwiazywania ˛ układu równań liniowych wykorzystuja˛ dekompozycje macierzy LU i Choleskiego, zostana˛ one przedstawione na poczatku ˛ tego rozdziału. W celu zachowania kompletności “wywodu” opiszemy także dekompozycj˛e QR macierzy. Natomiast bardziej złożone dokompozycje macierzy wzgl˛edem jej wartości własnych (EVD - Eigen Value Decomposition) oraz wartości osobliwych (SVD - Singular Value Decomposition) zostana˛ omówione wraz z zastosowaniami w osobnych rozdziale. 70 4 Dekompozycje macierzy i rozwiazywanie ˛ układów równań liniowych 4.1.4 Przykład zastosowania Przykład - rozmowa przez telefon w samochodzie. Wn˛etrze samochodu jest najcz˛eściej miejscem hałaśliwym. Odgłosy silnika, szum powietrza za oknem oraz pasażerowie na tylnych siedzeniach przeszkadzaja˛ kierowcy w prowadzeniu rozmowy przez telefon w czasie jazdy. Rozmówca na drugim końcu łacza ˛ telekomunikacyjnego słyszy dźwi˛eki ze wszystkich źródeł, chociaż najcz˛eściej jest zainteresowany tylko głosem kierowcy. Rozwiazaniem ˛ może być układ wielu mikrofonów, do których poszczególne dźwi˛eki docieraja˛ z różnym nat˛eżeniem. W takim przypadku A w równaniu (4.1) to macierz współczynników wagowych (macierz miksera dźwi˛eków zależna od budowy kabiny samochodu). Jest ona wykorzystywana do sumowania elementów wektora x, zbudowanego z aktualnych próbek różnych źródeł dźwi˛eku (x1 , x2 , ..., xN ). Natomiast b to wektor dźwi˛eków sumarycznych, którymi dysponujemy, otrzymanych na wyjściu N mikrofonów. Przykładowo w każdej chwili sygnał z pierwszego mikrofonu to b1 = a11 x1 + a12 x2 + ... + a1N xN , czyli jest równy ważonej sumie aktualnych/chwilowych wartości wszystkich dźwi˛eków. W tym przypadku wagi to elementy pierwszego wiersza macierzy A. Odwracajac ˛ proces sumowania (miksowania) dźwi˛eków przez rozwiazanie ˛ układu równań liniowych (patrz równanie (4.4)), możemy odzyskać próbki dźwi˛eków źródłowych x1 , x2 , ..., xN z ich sumy, w tym głos kierowcy. Tylko musimy znać macierz A (kabina samochodu) i pomnożyć lewostronnie b (zespół mikrofonów) przez jej odwrotność. Zagadnieniem tym zajmiemy si˛e w dalszej c˛eści tego rozdziału. Zwróćmy uwag˛e, że omawiane zagadnienie odnosi si˛e nie tylko do macierzy mikrofonowych, ale także do macierzy antenowych. Z tego powodu możemy nieśmiało powiedzieć, że w tym rozdziale zajmiemy si˛e problemem transmisji MIMO (Multi Input Multi Output), czyli także telefonia˛ 5G. Oj, jacy b˛edziemy ma˛ drzy. A wi˛ec do dzieła! 4.2 Wybrane dekompozycje macierzy W tym podrozdziale zapoznamy si˛e trzema ważnymi dekompozycjami macierzy: LU, Choleskiego i QR, szeroko stosowanymi w wielu różnych algorytmach numerycznych jako typowy black-box, czyli funkcja: wyjście=funkcja(wejście). Dwie pierwsze z nich zastosujemy później w tym rozdziale do rozwiazywania ˛ układów równań liniowch. Natomiast trzecia˛ dekompozycj˛e QR użyjemy w dalszej cz˛eści ksia˛żki do obliczania wartości własnych macierzy (w rozdziale 8). 4.2.1 Dekompozycja LU Dekompozycja LU macierzy kwadratowej A polega na jej przedstawieniu jako iloczyn dwóch macierzy: trójkatnej ˛ dolnej L (low) i trójkatnej ˛ górnej U (up): A = L · U. (4.19) Dla przykładu macierz A o wymiarach 3 × 3 jest dekomponowana na nast˛epujace ˛ składowe: a11 a12 a13 1 0 0 u11 u12 u13 a21 a22 a23 = l21 1 0 · 0 u22 u23 (4.20) l31 l32 1 a31 a32 a33 0 0 u33 4.2 Wybrane dekompozycje macierzy 71 Algorytm Doolittle’a dekompozycji LU opiera si˛e na efekcie przyrostu o jedna˛ nowa˛ zmienna˛ w każdym nast˛epnym elemencie wiersza/kolumny obliczanych macierzy. W tabeli 4.1 pokazano wszystkie obliczenia, przeprowadzane w tym algorytmie, dla przypadku opisanego równaniem (4.20). Tabela 4.1: Obliczenia dla dekompozycji LU opisanej równaniem (4.20) Nr wiersza Obliczenia Opis 1 2 3 u11 = a11 , u12 = a12 , u13 = a13 21 l21 = ua11 , u22 = a2,2 − l21 u12 , u23 = a23 − l21 u13 a31 31 u12 , u33 = a33 − l31 u13 − l32 u23 l31 = u11 , l32 = a32 −l u22 1-szy wiersz L × trzy kolumny U 2-gi wiersz L × trzy kolumny U 3-ci wiersz L × trzy kolumny U Jak widać, mnożymy kolejne wiersze macierzy L przez wszystkie kolumny macierzy U, przyrównujemy wyniki do wartości odpowiadajacych ˛ im elementów macierzy A oraz wyznaczamy kolejne wartości elementów macierzy L, najpierw, i macierzy U, potem. Załóżmy, że N określa rozmiar macierzy. Wówczas obliczenia przedstawione w tabeli sa˛ uogólnione przez nast˛epujacy ˛ zbiór operacji, który powtarza si˛e dla kolejnych wartości i = 1, 2, ..., N (kolejnych wierszy macierzy L): j−1 li, j = u1j, j ai, j − ∑ li,k uk, j , for j = 1, 2, ..., i − 1 do : k=1 (4.21) i−1 for j = i, i + 1, ..., N do : ui, j = ai, j − ∑ li,k uk, j . k=1 Na ich podstawie działa funkcja biblioteczna przedstawiona na listingu 4.1 (jednak kolejność wykonywanych operacji w wierszach/kolumnach jest w niej inna!). Listing 4.1: Funkcja implementujaca ˛ algorytm Doolittle’a dekompozycji LU function [L,U] = myLU(A) [N,N] = size(A); if(0) % prosciej, wolniej ----------------------------------------L = eye(N); U = zeros(N,N); for i = 1:N for j=i:N U(i,j) = A(i,j) - L(i,1:i-1)*U(1:i-1,j); end for j=i+1:N L(j,i) = 1/U(i,i) * ( A(j,i) - L(j,1:i-1)*U(1:i-1,i) ); end end else % trudniej, szybciej ---------------------------------------U=A; L=eye(N); for i=1:N-1 for j=i+1:N L(j,i) = U(j,i) / U(i,i); U(j,i:N) = U(j,i:N) - L(j,i)*U(i,i:N); end end end Problem 4.1 (* Testowanie dekompozycji LU macierzy). Sprawdź czy funkcja myLU(), przedstwiona na wydruku 4.1, daje poprawne wyniki dla macierzy kwadratowych o wi˛ekszych rozmiarach. Czy macierz otrzymana w wyniku mnożenia 72 4 Dekompozycje macierzy i rozwiazywanie ˛ układów równań liniowych Ahat=L*U jest taka sama jak oryginalna? Dodadaj do programu możliwość obliczeń dokładnie według wzoru (4.21). Porównaj z funkcja˛ Matlaba [L,U]=lu(A). Dla nas ważne sa˛ nast˛epujace ˛ zastosowania dekompozycji macierzy A = LU w rachunku macierzowym: 1. efektywne rozwiazywanie ˛ układów równań liniowych Ax=b, czym b˛edziemy zajmowali si˛e w dalszej cz˛eści tego rozdziału, 2. obliczanie wyznacznika macierzy A, równego iloczynowi elementów diagonalnych macierzy U: N det[A] = det[L] · det[U] = ∏ u j, j (4.22) j=1 3. obliczanie macierzy odwrotnej A−1 : ponieważ iloczyn macierzy i macierzy odwrotnej jest macierza˛ jednostkowa˛ ((LU)A−1 = I), to odwrotność macierzy możemy łatwo wyznaczyć wykonujac ˛ podstawienia w przód/wstecz na kolumnach macierzy jednostkowej, czyli rozwiazuj ˛ ac ˛ nast˛epujace ˛ równania dla k = 1, 2, ..., N ze wzgl˛edu na a−1 e macierzy A−1 , : k - k-ta˛ kolumn˛ T L(Ua−1 k ) = [0, ...0, 1k , 0, ..., 0] (4.23) 4.2.2 Dekompozycja Choleskiego Jeśli macierz A jest macierza˛ kwadratowa˛ symetryczna˛ dodatnio określona˛ (taka jest np. macierz korelacyjna i kowariancyjna), to jej dekompozycja LU ma prostsza˛ postać nazywana˛ dekompozycja˛ Choleskiego. Jest to zwiazane ˛ z faktem, że macierz trójkatna ˛ górna U jest w takim przypadku równa transpozycji macierzy trójkatnej ˛ dolnej (U = LT ) i nie musi być obliczana - co redukuje złożoność obliczeniowa˛ o połow˛e. Dekompozycja Choleskiego macierzy symetrycznej A ma nast˛epujac ˛ a˛ postać: a1,1 . . . . . . a1,N l1,1 0 . . . 0 .. . . .. . . . . .. .. . . . . . . . T A= . (4.24) = LL , L = . . . .. . . .. .. .. . 0 aN,1 · · · · · · aN,N lN,1 · · · · · · lN,N Elementy macierzy L sa˛ wyznaczane wg zależności: √ l1,1 = a1,1 i = 2, 3, ..., N : v u i−1 u li,i = tai,i − l2 ∑ i,k k=1 j = 2, 3, ..., i − 1 : li, j = j−1 ai, j − ∑k=1 li,k l j,k l j, j 4.2 Wybrane dekompozycje macierzy 73 Przykład. 1 2 3 100 12 A = 2 8 10 = 2 2 0 0 2 3 10 22 323 00 3 2 = LLT 3 (4.25) Problem 4.2 (* Testowanie dekompozycji Choleskiego). Zmodyfikuj funkcj˛e myLU(), przedstwiona˛ na wydruku 4.1 tak aby wykonywała ona dekompozycj˛e Choleskiego kwadratowej macierzy symetrycznej. Sprawdź poprawność jej działania. Porównaj z funkcja˛ Matlaba [U]=chol(A). 4.2.3 Dekompozycja QR Macierz kwadratowa A, o wymiarach N ×N i wartościach rzeczywistych, może zostać przedstawiona (sfaktoryzowana) jako iloczyn macierzy: • Q - ortogonalnej, czyli z ortogonalnymi kolumnami/wierszami, • R - trójkatnej ˛ górnej, niekoniecznie z jedynkowymi elementami na głównej przekatnej, ˛ czyli jako: q1,1 q1,2 q2,1 q2,2 A = QR = . .. .. . qN,1 qN,2 r1,1 · · · q1,N 0 · · · q2,N . · . .. . .. .. 0 · · · qN,N r1,2 · · · r1,N r2,2 · · · r2,N .. . . .. . . . 0 · · · rN,N (4.26) W ogólniejszym przypadku macierz prostokatna A, o wartościach zespolonych i wymiarach M × N, M > N, może być przedstawiona jako iloczyn ortogonalnej, kwadratowej macierzy Q, tak jak poprzednio, oraz macierzy trójkatnej ˛ górnej R, tak jak poprzednio, ale uzupełnionej M − N zerowymi wierszami na dole: r1,1 r1,2 · · · r1,N 0 r2,2 · · · r2,N q1,1 q1,2 · · · q1,M . . . q2,1 q2,2 · · · q2,M .. .. . . . .. A = QR = . (4.27) .. . . . · 0 0 · · · rN,N .. . .. . 0 0 ··· 0 qM,1 qM,2 · · · qM,M ··· ··· ··· ··· 0 0 ··· 0 Algorytmów przeprowadzania dekompozycji QR macierzy nie omawiamy. Odsyłamy do literatury, metody: 1) ortogonalizacji Grama-Schmidta, 2) transformacji Householdera, 3) obrotów Givensa. Przykłady zastosowań dekompozycji QR: 1. rozwiazywanie ˛ metoda˛ podstawień układu N równań liniowych z N niewiadomymi - dalej w tym rozdziale, 2. rozwiazywanie ˛ nadokreślonych układów równań - patrz rozdział 6, 3. do obliczania wartości własnych macierzy A kwadratowej i symetrycznej (patrz rozdział 8). 74 4 Dekompozycje macierzy i rozwiazywanie ˛ układów równań liniowych Problem 4.3 (* Implementacja dowolnego algorytmu dekompozycji QR). Napisz w j˛ezyku Matlab funkcj˛e, wykonujac ˛ a˛ dekompozycj˛e QR macierzy według dowolnej wybranej metody: 1) ortogonalizacji Grama-Schmidta, 2) transformacji Householdera, 3) obrotów Givensa. Porównaj wynik jej działania z funkcja˛ [Q,R] = qr(A). 4.3 Klasycze metody rozwiazywania ˛ układów równań liniowych Interesuje nas rozwiazanie ˛ układu równań liniowych (4.1): Ax = b, czyli zakładamy, że znamy macierz A i wektor b, natomiast szukamy wartości elementów wektora x. Poniżej sa˛ opisane kolejne metody, od najprostszej (najbardziej intuicyjnej) do najtrudniejszej (najefektywniejszej obliczeniowo). Wszystkie one sprowadzaja˛ si˛e do efektywnego użycia równania (4.5): x = A−1 b, czyli do rozwiazania ˛ problemu wyznaczenia macierzy odwrotnej do A. Jako przykład w tym rozdziale b˛edziemy wykorzystywać nast˛epujace, ˛ proste równanie: Ax = b, a11 a12 x b · 1 = 1 , a21 a22 x2 b2 12 x 5 · 1 = . 34 x2 11 (4.28) 4.3.1 Demonstracja - użycie funkcji bibliotecznych Załóżmy, że dysponujemy funkcja˛ wyznaczania macierzy odwrotnej A−1 dla macierzy kwadratowej A (nie zawsze jest to możliwe!) oraz że macierz A z równania (4.1) posiada macierz odwrotna.˛ Przykład. Ponieważ w Matlabie jest funkcja odwracania miacierzy inv(), metoda ta ma bardzo prosta˛ implementacj˛e programowa˛ (x=inv(A)*b), co ilustruje na przykładzie program 4.2. Uwzgl˛edniono w nim także: • specjalny, zoptymalizowany tryb rozwiazywania ˛ równań liniowych Ax=b w Matlabie, sygnalizowany zapisem x=A\b, w którym jest analizowana postać/wartości macierzy A i wektora b oraz jest wybierana metoda optymalna z dost˛epnych • wykorzystanie macierzy pseudoodwrotnej do A (w Matlabie: pinv(A)) kiedy macierz nie jest kwadratowa - patrz równania (4.14)(4.15). Listing 4.2: Rozwiazanie ˛ układu równań liniowych metoda˛ macierzy odwrotnej % equnonlin_invmat.m % A*x = b, x=? clear all; close all; A = [ 1 2; ... 3 4 ]; b=[ 5; ... 11 ]; x1 = inv(A)*b, x2 = A\b, % x=A^(-1)*b % optymalne rozwiazywanie rown. Ax=b 4.3 Klasycze metody rozwiazywania ˛ układów równań liniowych % x3 = pinv(A)*b, 75 % x = inv( A’*A ) * A’ * b , sprawdzisz? bhat = A*x1, % sprawdzenie err = max(abs(x1-x2)), % blad Problem 4.4 (* Problem obliczania macierzy odwrotnej). Skorzystaj z programu 4.2. Czy znaleziono w nim poprawne rozwiazanie? ˛ Zmieniaj elementy macierzy (A) w taki sposób, aby jej wyznacznik a11 a22 − a21 a12 był coraz bardziej bliski 0. Obserwuj wynik. Dodaj mały szum do wszystkich elementów macierzy A (A=A+0.01*randn(size(A));). Czy otrzymałeś taki sam wektor x jak poprzednio? Zmień rzad ˛ równania na o jeden wi˛ekszy (3 × 3). Cały czas porównuj rozwiaza˛ nia, otrzymywane z metody: 1) macierzy odwrotnej (x1=inv(A)*b), 2) wybranej optymalnej (x2=A\b), 3) macierzy pseudoodwrotnej (x3=pinv(A)*b). 4.3.2 Metoda macierzy dołaczonej ˛ - minorów Macierz odwrotna˛ do macierzy kwadratowej można obliczyć z nast˛epujacego ˛ wzoru: A−1 = 1 AD T , det(A) (4.29) w którym det(A) oznacza wyznacznik macierzy A, a AD T — transpozycj˛e macierzy dopełnień algebraicznych (minorów) wszystkich elementów macierzy A: w wyniku tej operacji otrzymujemy macierz dołaczon ˛ a˛ macierzy A. Elementy macierzy dopełnień sa˛ zdefiowane równaniem: [AD ]i j = (−1)i+ j · deti j (A) . (4.30) gdzie deti j (A) oznacza wyznacznik podmacierzy A, otrzymanej przez usuni˛ecie itego wiersza oraz j-tej kolumny z macierzy A. W przypadku macierzy kwadratowej 2 × 2 otrzymujemy bardzo prosty wzór: 1 a22 −a12 A−1 = · . (4.31) a11 a22 − a21 a12 −a21 a11 Problem 4.5 (*(*)(*) Metoda macierzy dołaczonej). ˛ Skorzystaj z programu 4.2. Na jego końcu zaimplementuj równanie (4.31). Sprawdź poprawność wyniku. Nast˛epnie zwi˛eksz rzad ˛ równania o 1 (2 × 2 na 3 × 3) oraz zaimplementuj metod˛e macierzy dołaczonej, ˛ wykorzystujacej ˛ minory macierzy (dodatkowy punkt). Czy jesteś w stanie napisać funkcj˛e (rekurencyjna), ˛ znajdujac ˛ a˛ rozwiazanie ˛ dla macierzy dowolnego rz˛edu? (dodatkowy punkt). 4.3.3 Metoda Cramera - wyznaczników Metoda Cramera, inaczej znana jako metoda wyznaczników, jest “szkolna” ˛ metoda˛ rozwiazywania ˛ układów równań liniowych. Jest ona koncepcyjnie bardzo prosta, ale 76 4 Dekompozycje macierzy i rozwiazywanie ˛ układów równań liniowych nieefektywna obliczeniowo i trudna w implementacji. Poszczególne elementy xi wektora x z równania (4.1) oblicza si˛e z nast˛epujacego ˛ wzoru xi = det (Ai ) , det (A) (4.32) gdzie macierz Ai powstaje poprzez wstawienie wektora b do i-tej kolumny macierzy A: a11 · · · b1 · · · a1N .. .. . Ai = ... (4.33) . . aN1 · · · bN · · · aNN Przykład. Poniżej przedstawiono prosta˛ ilustracj˛e zastosowania metody Cramera w ropatrywanym przypadku: 12 x 5 · 1 = , 34 x2 11 x1 = 5·4−11·2 1·4−3·2 = 1, x2 = 1·11−3·5 1·4−3·2 =2 (4.34) Problem 4.6 (* Metoda Cramera). Skorzystaj z kodu funkcji 4.3. Wywołaj ja˛ w programie 4.2. Sprawdź poprawność otrzymywanego wyniku. Nast˛epnie wykonaj zadania z problemu 4.4. Listing 4.3: Funkcja metody Cramera function x = fCramer(A,b) % Funkcja metody Cramera. M=N. [M,N] = size(A); x = zeros(M,1); for k=1:N Ak = A; Ak(:,k) = b; x(k) = det( Ak ) / det(A); end 4.3.4 Metoda eliminacji i podstawienia Wprowadzenie. Druga ze “szkolnych” metod rozwiazywania ˛ układów równań liniowych (obok metody wyznaczników Cramera, przypomnianej powyżej), to metoda eliminacji zmiennych. Dokonuje si˛e w niej separacji konkretnej zmiennej w jednym równaniu i podstawia si˛e ja˛ do innego równania. Precyzyjnie określone algorytmy eliminacji sa˛ wykorzystywane w metodzie: • Gaussa-Jordana, prowadzacej ˛ do diagonalizacji macierzy A (czyli rozdzielenia poszczególnych zmiennych), • Gaussa, przekształcajacej ˛ macierz A do macierzy trójkatnej ˛ górnej i układu równań łatwo rozwiazywanego ˛ metoda˛ iteracyjna.˛ Na rysunku 4.1 graficznie zilustrowano istot˛e przekształcenia układu równań w obu metodach. 4.3 Klasycze metody rozwiazywania ˛ układów równań liniowych 77 Rysunek 4.1: Graficzna ilustracja przekształcenia oryginalnego układu równań (po lewej - pełna macierz) w metodzie: 1) Gaussa-Jordana (po środku - do macierzy diagonalnej), 2) Gaussa (po prawej - do macierzy trójkatnej ˛ górnej). Metod eliminacji nie należy jednak traktować jako podstawowych i rekomendowanych – przede wszystkim posłuża˛ nam one jako przykład dydaktyczny i wprowadzenie do efektywniejszych metod, wykorzystujacych ˛ dekompozycje LU i Choleskiego macierzy A. Metody eliminacji w działaniu. Działanie metod eliminacji opiera si˛e na dwóch podstawowych operacjach, które prowadza˛ do równoważnego (według rozwiazania) ˛ układu równań, ale zapisanego w postaci dużo prostszej obliczeniowo: • zastapienie ˛ jednego z równań liniowa˛ kombinacja˛ tego równania z innym równaniem, • mnożenie jednego z równań przez stała˛ (szczególny przypadek poprzedniej operacji). W celu uodpornienia metod eliminacji na dzielenie przez zero i na zaburzenie współczynników układu równań, dodatkowo stosowane sa˛ w nich operacje zamiany wierszy i kolumn układu równań. Prowadzi to do ustawienia takich wartości na głównej przekatnej ˛ przekształcanej macierzy, które zapewniaja˛ najlepsza˛ dokładność obliczeń (np. nie dzielimy przez liczby małe). Metoda Gaussa-Jordana - diagonalizacja macierzy. W każdym k-tym kroku algorytmu eliminacji Gaussa-Jordana wykonujemy dwie operacje: 1. ustawienie kolejnego elementu diagonalnego ak,k , k = 1...N, macierzy A na wartość 1 (zaczynajac ˛ od k = 1) poprzez podzielenie współczynników k-tego równania (wiersza macierzy), czyli { ak, j , bk }, j = 1, 2, ..., N, przez element ak,k , 2. wyzerowanie pozostałych wartości k-tej kolumny przez odj˛ecie od każdego z pozostałych równań (i ̸= k) zmodyfikowanego równania z k-tego wiersza, pomnożonego przez współczynnik ai,k , i = 1, 2, ..., N. Po N krokach algorytmu macierz A zostaje przekształcona na macierz jednostkowa,˛ a wektor b zawiera rozwiazanie ˛ układu równań, czyli poszukiwany wektor x. Przykład. W tabeli 4.2 zaprezentowano obliczenia, przeprowadzone symbolicznie dla przypadku 2 × 2. Jak widać wynik zgadza si˛e z uzyskanym wcześniej rozwiaza˛ niem ze wzoru Cramera. Wybór elementu głównego (pivoting). Problemem w algorytmie Gaussa-Jordana jest możliwość wystapienia ˛ wartości 0 na diagonali. W celu unikni˛ecia dzielenia przez wartość zerowa˛ dokonuje si˛e: • zamiany kolejności wierszy-równań (partial pivoting), • zmian˛e kolejności wierszy-równań i kolumn-zmiennych (full pivoting) co wymaga odtworzenia pierwotnej kolejności zmiennych po rozwiazaniu ˛ zmodyfikowanego równania. 78 4 Dekompozycje macierzy i rozwiazywanie ˛ układów równań liniowych Tabela 4.2: Sprawdzenie rozwiazania ˛ metoda˛ Gaussa-Jordana dla przypadku układu dwóch równań liniowych. Oznaczenia: wi - i-ty wiersz, k j - j-ta kolumna. Krok P 1.1 1.2 2.1 2.2 K Wynik b x a1,1 a1,2 · 1 = 1 "a2,1 aa2,2 # x2 "b2 # b1 1 a1,2 x 1,1 · 1 = a1,1 x2 a2,1 a2,2 b2 " # " # a1,2 b1 1 x1 a1,1 a1,1 = a1,1 b2 −a2,1 b1 · a a −a a x2 0 1,1 2,2a 2,1 1,2 " " a # 1,1 #a1,1 b1 1,2 1 a1,1 x a1,1 · 1 = a1,1 b2 −a 2,1 b1 x2 0 1 a1,1 a2,2 −a2,1 a1,2 a2,2 b1 −a1,2 b2 10 x1 a a −a a 2,2 2,1 1,2 = 1,1 · a1,1 b2 −a2,1 b1 x2 01 x1 = x2 = a1,1 a2,2 −a2,1 a1,2 a2,2 b1 −a1,2 b2 a1,1 a2,2 −a2,1 a1,2 a1,1 b2 −a2,1 b1 a1,1 a2,2 −a2,1 a1,2 Opis Poczatkowy ˛ układ równań Dzielimy w1 przez pierwszy element diagonalny równy a1,1 Zerujemy k1 : wi = wi − w1 · ai,1 Dzielimy w2 przez drugi element diagonalny a a −a a równy 1,1 2,2a1,1 2,1 1,2 a Zerujemy k2 : wi = wi − w2 · a1,2 1,1 Końcowy wynik Algorytm eliminacji Gaussa-Jordana z wyborem najwi˛ekszego elementu w kolumnie/wierszu jako elementu głównego jest dodatkowo bardziej odporny na bł˛edy reprezentacji danych. Listing 4.4 zawiera nasza˛ implementacj˛e algorytmu GJ w j˛ezyku Matlab. Listing 4.4: Rozwiazanie ˛ układu równań liniowych metoda˛ Gaussa-Jordana function x = fGaussJordan(A,b) [N,N]=size(A); A = [ A, b ]; % dolaczamy b jako ostatnia, (N+1)-sza kolumne A for k=1:N %k A(k,:) = A(k,:)/A(k,k); for w = 1:N %w if (w~=k) A(w,:) = A(w,:) - A(w,k)* A(k,:); % A, pause end end end x = A(:,N+1); % odczytujemy wynik Problem 4.7 (* Metoda Gaussa-Jordana). Skorzystaj z kodu funkcji 4.4. Wywołaj ja˛ w programie 4.2. Sprawdź poprawność otrzymywanego wyniku. Nast˛epnie wykonaj zadania z problemu 4.4. Metoda Gaussa - przekształcenie do macierzy trójkatnej ˛ górnej i podstawienia wstecz. Proces eliminacji Gaussa-Jordana jest prowadzony aż do otrzymania macierzy jednostkowej po lewej stronie równania i rozwiazania ˛ po prawej stronie równania. Taki sposób rozwiazania ˛ układu równań może być uproszczony przez ograniczenie drugiej operacji algorytmu (zerowanie kolumny) tylko do elementów znajdujacych ˛ 4.3 Klasycze metody rozwiazywania ˛ układów równań liniowych 79 si˛e pod główna˛ przekatn ˛ a˛ macierzy. W wyniku takiej modyfikacji proces eliminacji przekształca A do macierzy trójkatnej ˛ górnej (zamiast do macierzy diagonalnej). Rozwiazanie ˛ otrzymanego układu równań jest łatwe do zaprogramowania metodami iteracyjnymi - metoda podstawienia wstecz (back substitution). Taka odmiana metody eliminacji nosi nazw˛e eliminacji Gaussa (Gaussian elimination). Aby wyzerować w k-tej kolumnie element leżacy ˛ poniżej diagonali w i-tym wierszu, należy od i-tego wiersza odjać ˛ k-ty wiersz pomnożony przez al,k i podzielony przez ak,k : wi = wi − wk · ai,k . ak,k (4.35) Po wyzerowaniu w taki sposób wszystkich elementów poniżej głównej przekatnej ˛ otrzymujemy układ równań postaci: x1 c1 u1,1 · · · · · · u1,N . . . . . 0 . . . . .. .. .. = (4.36) . . . . . . .. . . . . .. .. .. 0 · · · 0 uN,N xN cN który rozwiazujemy ˛ iteracyjnie w nast˛epujacy ˛ sposób (wstecz od ostatniego równania, najbardzie “wyzerowanego”): inicjalizacja: xN = iteracja dla k = N − 1, ..., 1 : xk = cN uN,N ck − ∑Nj=k+1 uk, j x j uk,k Przykład. Sprawdźmy zgodność rozwiazania ˛ przypadku 2 × 2 z wynikami poprzednich metod. Obliczenia wraz z ich interpretacja˛ znajduja˛ si˛e w tabeli 4.3. Jak widać otrzymany wynik zgadza si˛e z wynikami poprzednich metod. Metod˛e Gauussa implementuje funkcja przedstawiona w listingu 4.5. Tabela 4.3: Sprawdzenie rozwiazania ˛ metoda˛ Gaussa dla przypadku układu dwóch równań liniowych Krok 1 2 Wynik a11 a12 x b · 1 = 1 a a x 21 22 2 " #b2 " # b1 a11 a12 x1 a1,1 a2,2 −a2,1 a1,2 · = a1,1 b2 −a2,1 b1 0 x2 a1,1 a 1,1 3 x2 = 4 x1 = a1,1 b2 −a2,1 b1 a1,1 a2,2 −a2,1 a1,2 b1 −x2 a1,2 a b −a b2 = a1,12,2a2,21 −a1,2 a1,1 2,1 a1,2 Opis Poczatkowy ˛ układ równań Zerowanie elementów pod diagonala: ˛ a w2 = w2 − w1 · a2,1 1,1 Obliczenie x2 Obliczenie x1 , iterowanie wstecz Listing 4.5: Funkcja metody Gaussa function x = fGauss(A,b) % Metoda Gaussa [N,N]=size(A); A = [ A, b ]; % dolaczamy b jako ostatnia, (N+1)-ta kolumna A for k=1:N 80 4 Dekompozycje macierzy i rozwiazywanie ˛ układów równań liniowych %k % A(k,:) = A(k,:)/A(k,k); % pause % OPT #1 for w = k+1:N %w % A(w,:) = A(w,:) - A(w,k)* A(k,:); % OPT #1 A(w,:) = A(w,:) - A(w,k)* A(k,:)/A(k,k); % OPT #2 % A, pause end end U = A(:,1:N); % macierz trojkatna gorna b = A(:,N+1); % nowe b % Rozwiazujemy wstecznie od ostatniego elementu x x(N,1) = b(N)/U(N,N); for i=N-1:-1:1 x(i,1) = (1/U(i,i)) * ( b(i) - U(i,i+1:N)*x(i+1:N,1) ); end Problem 4.8 (* Metoda Gaussa). Skorzystaj z kodu funkcji 4.5. Wywołaj ja˛ w programie 4.2. Sprawdź poprawność otrzymywanego wyniku. Nast˛epnie wykonaj zadania z problemu 4.4. Metoda Gaussa - macierzowa interpretacja eliminacji. W każdym kroku eliminacji Gaussa sa˛ zerowane elementy kolejnej kolumny macierzy, leżace ˛ pod elementami diagonalnymi. Można to zapisać operacja˛ lewostronnego mnożenia macierzy przekształcanej A(i−1) przez macierz modyfikujac ˛ a˛ M(i) : 1 0 .. . ··· .. . ··· ··· a1,1 0 . . . · 0 . 0 .. 0 1 0 .. . .. . .. . · · · a1,N .. 0 . .. .. . 0 1 0 . A(i) = M(i) A(i−1) = .. 0 0 −ai+1,i 1 . . . · · · 0 ai,i . ai,i . .. .. .. .. .. .. .. . . . . . 0 . . . . −aN,i · · · 0 a · · · a 0 0 0 0 N,i N,N ai,i (4.37) Ponieważ cały proces eliminacji Gaussa prowadzi do otrzymania macierzy trójkatnej ˛ górnej U, dlatego po wykonaniu N − 1 mnożeń macierzowych (modyfikacja kolumn od 1 do N − 1) otrzymujemy: M(M−1) · · · M(2) M(1) A = U · · · · · · a1,i .. . .. .. . . (4.38) Przekształcajac ˛ to równanie dalej, dostajemy: −1 A = M(M−1) · · · M(2) M(1) U = LU, −1 L = M(M−1) · · · M(2) M(1) (4.39) Macierz L oraz jej odwrotność sa˛ macierzami trójkatnymi ˛ dolnymi z jedynkami na głównej przekatnej. ˛ gdzie 4.4 Efektywne metody rozwiazywania ˛ układów równań liniowych 81 4.4 Efektywne metody rozwiazywania ˛ układów równań liniowych Poważna˛ wada˛ przedstawionych metod eliminacji Gaussa-Jordana oraz Gaussa jest operowanie jednocześnie na macierzy A oraz na wektorze b. Oznacza to, że nawet w przypadku wielokrotnego rozwiazywania ˛ układów równań, charakteryzujacych ˛ si˛e tylko zmiennościa˛ wektora b (np. w metodach różnic/elementów skończonych ze zmiennymi warunkami brzegowymi, służacymi do rozwiazywania ˛ równań rózniczkowych), konieczne jest wykonanie wszystkich operacji od poczatku. ˛ Przedstawiana w tym podrozdziale metoda dekompozycji LU polega na zapisaniu wykonywanych operacji, modyfikujacych ˛ macierz A i wektor b, w postaci dwóch osobnych macierzy transformacji. Dzi˛eki temu po zmianie tylko danych b wystarczy transformować tylko je z wykorzystaniem odpowiedniej macierzy. Z użyciem macierzy transformacji LU jest również łatwo wyznaczyć wyznacznik oraz macierz odwrotna˛ macierzy A. Z tego powodu metoda LU, opisana poniżej, jest podstawowa˛ metoda rozwiazywania ˛ układów równań liniowych. Dla macierzy (równań) symetrycznych przyjmuje ona postać metody Choleskiego. 4.4.1 Metoda dekompozycji LU Dysponujac ˛ rozkładem macierzy A na macierze trójkatne: ˛ dolna˛ L i dolna˛ U (takie że: A = L · U), patrz podrozdział 4.2.1, możemy zastosować znany już nam iteracyjny schemat obliczeń przez podstawienie wstecz oraz dodatkowo przez podstawienie w przód. Ponieważ: A · x = (L · U) · x = L · (U · x) = b (4.40) dlatego najpierw rozwiazujemy ˛ pierwsze równanie L · y = b (przez podstawienie w przód, czyli od góry macierzy L): i−1 L·y = b → y1 = b1 , i = 2, 3, ..., N : yi = bi − ∑ li, j y j , (4.41) j=1 a nast˛epnie drugie równanie U · x = y (przez podstawienie wstecz, czyli od dołu macierzy U): U·x = y → yN 1 xN = , i = N − 1, N − 2, ..., 1 : xi = uN,N ui, j N yi − ∑ ! ui, j x j . j=i+1 (4.42) Problem 4.9 ((L)* Rozwiazywanie ˛ układu równań liniowych metoda˛ dekompozycji LU). Napisz program w Matlabie implementujacy ˛ t˛e metod˛e. Użyj funkcji Matlaba [L,U]=lu(A). 4.4.2 Metoda dekompozycji QR Przyjmijmy, że chcemy rozwiazać ˛ równanie macierzowe (liniowy układ równań): 82 4 Dekompozycje macierzy i rozwiazywanie ˛ układów równań liniowych Ax = b. (4.43) Zastapmy ˛ macierz A przez wynik jej dekompozycji QR: (QR)x = b, (4.44) a potem pomnóżmy lewostronnie obie strony równania (4.44) przez transpozycj˛e macierzy Q: QT (QR)x = QT b. (4.45) Q−1 . QT QT Q Ponieważ macierz Q jest orthogonalna, dlatego = Z tego powodu =I jest macierza˛ identycznościowa˛ i równanie (4.45) upraszcza si˛e do nast˛epujacej ˛ postaci: Rx = QT b. (4.46) Ostatnie równanie można bardzo łatwo rozwiazać ˛ metoda˛ podstawień ze wzgl˛edu na x, ponieważ: 1) R jest macierza˛ trójkatn ˛ a˛ (górna), ˛ 2) po pomnożeniu znanego wektora b przez znana˛ (po dekompozycji QR) macierz QT otrzymujemy wektor pionowy. Problem 4.10 (* Rozwiazywanie ˛ układu równań liniowych metoda˛ dekompozycji QR). Napisz program w Matlabie implementujacy ˛ t˛e metod˛e. Użyj funkcji Matlaba [Q,R]=qr(A). 4.5 Zastosowania dekompozycji Choleskiego Przykład #1: rozwiazanie ˛ równania Yule’a-Walkera dla dowolnego sygnału. W przetwarzaniu sygnałów cyfrowych powszechnie jest stosowane równanie Yule’aWalkera, opisujace ˛ m.in. regresyjny model zależnosci danych: jedna zmienna jest liniowa˛ kombinacja˛ innych zmiennych. Model ten jest przykładowo używany podczas kompresji synału mowy oraz podczas przejścia sygnału losowego (np. transmitowanych bitów) przez układ liniowy (np. kanał transmisji), opisany odpowiedzia˛ impulsowa.˛ Rozpatrzmy zadanie wyznaczania wag odpowiedzi impulsowej hm , m = 0, 1, ..., M − 1 liniowego kanału transmisji, na podstawie długotrwałych rejestracji jego danych wejściowych xn oraz wyjściowych yn (dla n = 0, 1, 2, ...). Jak już wiemy z rozdziału 3 dane te sa˛ powiazane ˛ ze soba˛ funkcja˛ splotu. Dlatego wykorzystujac ˛ definicj˛e splotu, dla dowolnej chwili n możemy zapisać: M−1 yn = ∑ hm xn−m . (4.47) m=0 Mnożac ˛ lewostronnie powyższe równanie przez xn oraz wyznaczajac ˛ wartość oczekiwana˛ E[.] jego obu stron (średnia po zbiorze realizacji wszystkich sekwencji danych), otrzymujemy: M−1 E[xn · yn ] = ∑ hm E[xn · xn−m ] m=0 (n)xy gdzie r0 → (n)xy r0 M−1 = (n)xx ∑ hm rm . (4.48) m=0 oznacza zerowy współczynnik funkcji korelacji wzajemnej pomi˛edzy da(n)xy nymi xn i yn w chwili n (dla zerowego przesuni˛ecia pomi˛edzy nimi), natomiast rm 4.5 Zastosowania dekompozycji Choleskiego 83 jest m-tym współczynnikiem funkcji korelacji własnej pomi˛edzy danymi xn i xn−m także w chwili n (dla przesuni˛ecia pomiedzy nimi o m próbek). Zapiszmy to równanie dla M chwil n = 0, 1, ...M − 1 i uwzgl˛ednijmy to we współczynnikach funkcji korelacji. Otrzymamy wówczas nast˛epujace ˛ równanie macierzowe: xx xx r0 r1xx · · · rM−1 r0xy h0 xx .. h rxy xx . . . r 1 . 1 −1 r0 (4.49) .. = .. . . . . . . . . . rxx . .. 1 xy rM−1 hN rxx · · · rxx rxx −M+1 −1 0 Macierz po lewej stronie jest symetryczna i dodatnio określona, ponieważ funkcja auxx = r xx . Dlatego rozpatrywany układ może tokorelacji sygnału xn jest sumetryczna: r−m m być efektywnie rozwiazany ˛ przy długiej odpowiedzi impulsowej hm metoda˛ dekompozycji Choleskiego i podstawienia. Problem 4.11 (* Identyfikacja wag splotu z użyciem dekompozycji Choleskiego). Wygeneruj długi wektor wartości szumu gaussowskiego: N=1000; x = randn(1,N). Przyjmij nast˛epujace ˛ wagi odpowiedzi impulsowej: {h0 = 0, h1 = 1 h2 = 2}, w Matlabie M=3; h=[0,1,2]. Spleć sygnał x z wagami h: y=conv(x,h,’same’). Oblicz współczynniki funkcji autokorelacji sygnału x: rxx=xcorr(x,x) oraz cross-korelacji sygnałów x i y: rxy=xcorr(x,y). Pobierz wartości funkcji korelacji dla iteresujacych ˛ ci˛e przesuni˛eć: rxx = rxx(N:N+M-1); rxy = rxy(N:N+M-1), zbuduj z nich równanie macierzowe, które trzeba rozwiazać ˛ i rozwia˛ż je ze wzgl˛edu na h, używajac ˛ funkcji U=cholR. Czy obliczone wagi sa˛ identyczne z tymi, które były użyte podczas funkcji splotu? Przykład #2: rozwiazanie ˛ równania Yule’a-Walkera dla sygnału referencyjnego (pilota PRBS). W tym przypadku sygnał xn , wysyłany przez nadajnik telekomunikacyjny, jest typu PRBS (Pseudo Random Binary Sequence) i jest znany odbiornikowi. Odbiornik koreluje odebrany sygnał yn ze znana˛ sekwencja˛ PRBS, uzyskujac ˛ wartości xy korelacji wzajemnej rm . Jeśli kanał bezprzewodowy ma krótka˛ odpowiedź impulsowa˛ (mała wartość M, liczba wag), to wówczas wystarczy rozwiazać ˛ układ równań (4.49) o małych wymiarach (chociaż zbudowany na bazie długiej sekwencji danych pilota z użyciem funkcji korelacji - metoda statystyczna). Na przykład, dla sekwencji PRBS o długości N = 32767 znane sa˛ wartości autokorelacji. Na diagonali macierzy autokorelacji znajduje si˛e wartość b, zaś wartość c poza nia,˛ gdzie b jest liczba˛ bitów niezerowych sekwencji PRBS , a c = b(b−1) N−1 . Zakładajac, ˛ że kanał komunikacyjny ma odpowiedź impulsowa˛ nie dłuższa˛ niż 4 próbki (czas trwania czterech symboli transmisji), układamy równanie: r0 bccc h0 c b c c h1 r1 (4.50) c c b c · h2 = r2 h3 r3 cccb Rozwiazujemy ˛ je ze wzgl˛edu na h i uzyskujemy oszacowanie nieznanej odpowiedzi impulsowej kanału. Natomiast kiedy już ja˛ znamy, to możemy przeprowadzać korekcj˛e odebranych danych, otrzymanych dla nieznanych, transmitowanych danych. Równanie (4.50) można porównać z zapisem splotowym (3.12), wia˛żacym ˛ wejście z wyjściem kanału, jaki przedstawiono na laboratorium 3, poświ˛econym zapisowi macierzowemu: 84 4 Dekompozycje macierzy i rozwiazywanie ˛ układów równań liniowych • teraz macierz, wys˛epujaca ˛ po lewej stronie równania jest zbudowana z próbek fukcji autokorelacji sygnału pilota, wtedy z próbek pilota, • teraz wektor po prawej stronie równania jest zbudowany z próbek funkcji korelacji wzajemnej pilota z danymi odebranymi, a wtedy bezpośrednio z danych odebranych. Jednak pomimo o wiele mniejszego rozmiaru macierzy, to wykorzystujemy teraz tyle samo informacji co poprzednio. Problem 4.12 (* Identyfikacja wag splotu z użyciem sekwencji PRBS i dekompozycji Choleskiego). Wykonaj zadanie 4.11 tylko dla znalezionej przez siebie w iternecie długiej sekwencji PRBS. 4.6 Metody dla macierzy rzadkich - iteracyjne Duże macierze rzadkie (cz˛esty przypadek przy analizie danych metoda˛ różnic i elementów skończonych, np. podczas rozwiazywania ˛ równań różniczkowych), a w szczególności macierze trójprzekatniowe ˛ (wyst˛epujace ˛ podczas interpolacji funkcjami sklejanymi, czyli spline’ami) moga˛ być przetwarzane metodami eliminacji dużo efektywniej, jeśli wykrywa si˛e i pomija elementy zerowe. W przypadku eliminacji prowadzonej z opuszczaniem wartości zerowych macierze rzadkie moga˛ być pami˛etane w strukturach upakowanych (a nie w postaci pełnej macierzy) co daje duże oszcz˛edności pami˛eci. Wada˛ metod bezpośrednich, opartych o eliminacj˛e i podstawienie, jest mała efektywność dla macierzy rzadkich. Dekompozycja ogólnej macierzy rzadkiej (o niewielu elementach poza diagonala) ˛ może prowadzić do pełnej macierzy trójkatnej ˛ po dekompozycji. Dlatego alternatywa˛ dla metod bezpośrednich sa˛ metody iteracyjne, w których modyfikacji nie podlega sama macierz równania, a jedynie kolejne oszacowania rozwiazania ˛ bazujace ˛ na niezerowych elementach macierzy. Ide˛e metod iteracyjnych tłumaczy poniższy przykład. Ogólne równanie z macierza˛ o wymiarach 3 × 3: b1 a11 a12 a13 x1 a21 a22 a23 · x2 = b2 (4.51) b3 a31 a32 a33 x3 możemy zapisać w równoważnej postaci trzech równań: b1 − (a1,2 x2 + a1,3 x3 ) , a1,1 b3 − (a3,1 x1 + a3,2 x2 ) . a3,3 (4.52) Przyjmujac, ˛ że powyższa zależność ma charakter iteracyjny, tzn. po lewej stronie sa˛ nowe, kolejne oszacowania x(k+1) , które sa˛ oparte na poprzednich wartościach x(k) , to możemy napisać zależność iteracyjna: ˛ x1 = x2 = b2 − (a2,1 x1 + a2,3 x3 ) , a2,2 x3 = 4.6 Metody dla macierzy rzadkich - iteracyjne 85 (k) (k) (k+1) = b1 − (a1,2 x2 + a1,3 x3 ) , a1,1 (k+1) = b2 − (a2,1 x1 + a2,3 x3 ) , a2,2 (k+1) = b3 − (a3,1 x1 + a3,2 x2 ) , a3,3 x1 (k) x2 (k) x3 (4.53) (k) (4.54) (k) (4.55) (4.56) i wyliczać nowe oszacowania rozwiazania, ˛ poczawszy ˛ od wybranej wartości startowej. Metod˛e Jacobiego otrzymujemy zapisujac ˛ ogólnie ostatnia˛ zależność w postaci macierzowej: (4.57) xk+1 = D−1 b − (L + U)xk , gdzie: • D – jest macierza˛ zerowa˛ z diagonala˛ macierzy A, • L – jest dolna,˛ trójkatn ˛ a˛ cz˛eścia˛ macierzy A (nie zwiazan ˛ a˛ z jej dekompozycja˛ LU), • U – jest górna,˛ trójkatn ˛ a˛ cz˛eścia˛ macierzy A. Metoda Gaussa-Seidla jest prosta˛ modyfikacja˛ metody Jacobiego, wykorzystujac ˛ a˛ fakt, że w momencie wyliczania elementu x j sa˛ już znane świeże (bardziej aktualne) oszacowania rozwiazania ˛ dla elementów o niższych indeksach. Taka modyfikacja daje szybsza˛ zbieżność metody i ma postać: xk+1 = D−1 b − (Lx(k+1) + Ux(k) ) . (4.58) Metoda Successive Overrelaxation (SOR) została opracowana w celu osiagni˛ ˛ ecia szybszej zbieżności do rozwiazania ˛ schematu iteracyjnego. W każdym kroku iteracyjnym rozwiazanie ˛ jest ważona˛ średnia˛ poprzedniego rozwiazania ˛ i nowego oszacowania: xk+1 = ωD−1 b − (Lx(k+1) + Ux(k) ) + (1 − ω)x(k) (4.59) Optymalny dobór wagi ω, nazywanej współczynnikiem relaksacji (relaxation parameter), zależy od własności macierzy A. Najszybsza˛ zbieżność daje wartość wagi z przedziału [1, 2 ... 1, 3]. Analiza zbieżności poszczególnych metod iteracyjnych wykracza poza przyj˛ety zakres wykładu. Listing 4.6: Funkcja metody iteracyjnej Jacobiego function x = fITER(A,b) % Metoda Jacobiego % Zbuduj macierze: D oraz A z wyzerowna przekatna (L+U) [N,N]=size(A); D = zeros(N,N); for k=1:N D(k,k)=A(k,k); A(k,k)=0; end U = triu(A); L = tril(A); LU = L+U; % D, LU, pause 86 4 Dekompozycje macierzy i rozwiazywanie ˛ układów równań liniowych % Iterowanie Dinv = inv(D); x1=rand(N,1); x2=rand(N,1); while( max(abs(x2-x1)) > 100*eps ) x1 = x2; x2 = Dinv * (b - LU*x1); end x = x2; Problem 4.13 ((L)* Metoda Jacobiego). Skorzystaj z kodu funkcji 4.6. Wywołaj ja˛ w programie 4.2. Sprawdź poprawność otrzymywanego wyniku. Nast˛epnie wykonaj zadania z problemu 4.4. 4.7 Rozwiazywanie ˛ układów równań liniowych w Matlabie Najprostszym, narzucajacym ˛ si˛e sposobem rozwiazania ˛ układu równań Ax = b w Matlabie jest skorzystanie z równania x = A−1 b oraz użycie instrukcji: x=inv(A)*b, tak jak to zrobiliśmy w problemie 4.2. Nie jest to jednak najlepsza metoda, ponieważ omówione metody eliminacji i podstawiania (tzw. direct solution) sa˛ zaimplementowane w Matlabie przy użyciu lewostronnego dzielenia macierzowego: x=A\b, dopasowywanego do aktualnej postaci macierzy A. Rozróżniane sa˛ w nim, mi˛edzy innymi, macierze: 1. 2. 3. 4. 5. kwadratowe (stosowana jest dekompozycja LU i podstawienie), trójkatne ˛ dolna i górna (tylko podstawienie), trójprzekatniowe ˛ (szybka eliminacja bez pivotingu), rzadkie (szybka eliminacja), symetryczne dodatnio określone (dekompozycja Choleskiego). Metoda eliminacji i podstawienia (direct method) jest od 2 do 3 razy szybsza od metody macierzy odwrotnej, daje ona również dokładniejsze wyniki (na poziomie bł˛edu reprezentacji komputerowej). Co prawda matlabowska funkcja odwracania macierzy inv() także wykorzystuje dekompozycj˛e LU, ale nie uwzgl˛ednia si˛e w niej i nie modyfikuje prawej strony równania Ax = b, czyli wektora b, co także ma istotny wpływ na wynik. Wektor ten uwzgl˛edniaja˛ natomiast metody total least squares, zaimplementowane w instrukcji x=A\b. Wi˛ecej w tym temacie dowiemy si˛e w rozdziale 6 o aproksymacji. Spokojnie, nie tak nerwowo! Widz˛e, że już si˛e nie możesz tego doczekać. 4.8 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. 1. “Szkolne” metody rozwiazywania ˛ układów równań (metoda wyznaczników, metoda podstawień) nie sa˛ stosowane w obliczeniach komputerowych ze wzgl˛edu na złożoność obliczeniowa˛ (tzn. duża˛ liczb˛e wykonywanych operacji). Literatura 87 2. Metoda˛ stosowana˛ współcześnie dla ogólnej klasy macierzy jest dekompozycja LU. 3. Szczególna struktura macierzy może być wykorzystana do zwi˛ekszenia szybkości obliczeń lub zmniejszenia zużycia pami˛eci podczas obliczeń: • równania z macierzami symetrycznymi i dodatnio określonymi (macierz kowariancji, korelacji) moga˛ być rozwiazane ˛ szybciej przez dekompozycj˛e Cholesky’ego (wówczas L = UT ); • równania z macierzami rzadkimi (mało elementów niezerowych) o dużych rozmiarach można rozwiazać ˛ metodami iteracyjnymi przy mniejszym zużyciu pami˛eci. 4. Rozwiazanie ˛ równania macierzowego w Matlabie można wyznaczyć za pomoca˛ y=inv(A)*x, ale szybciej i dokładniej jest z użyciem specjalnej instrukcji y=A\x. Czy pami˛etasz dlaczego? Dobrze: wybór optymalnej metody rozwiazy˛ wania zadania w zależności od A i b. Literatura 1. G.H. Golub, C.F. Van Loan, Matrix computations. The Johns Hopkins University Press, Batlimore, 2013. 2. M. Jarocka, J. Kozłowska, B. Madras-Kobuz, A. Olszewska, Rachunek macierzowy. Politechnika Białostocka, Białystok, 2020. 3. C. Moler: "Linear Equations", in Numerical Computing with Matlab, on-line: https:// www. mathworks.com/ moler/ chapters.html.html Rozdział 5 Interpolacja i ekstrapolacja wielomianowa Streszczenie Definicja i przykłady zastosowań interpolacji wielomianowej, odniesienie do aproksymacji i ekstrapolacji, wielomiany interpolujace ˛ w postaci Lagrange’a i Newtona, efekt Rungego, gładka interpolacja lokalna funcjami sklejanymi - splajnami, interpolacja 3D. 5.1 Wprowadzenie 5.1.1 Definicja poj˛ecia interpolacji, aproksymacji i ekstrapolacji danych Rzućmy okiem na rysunek 5.1. Załóżmy, że dysponujemy zbiorem wartości funkcji y = f (x) w N punktach (xi , yi ), i = 1, 2, ..., N, które sa˛ zaznaczone kółkami na rysunku (w tym przypadku N = 4). Definiowane sa˛ nast˛epujace ˛ trzy zadania: 1. interpolacji - wyznaczenia wartości funkcji pomi˛edzy znanymi punktami lub przepisu matematycznego funkcji, która przechodzi przez znane punkty i definiuje to, co si˛e “dzieje” pomiadzy ˛ nimi dla dowolnej wartości x (lewy wykres na rys. 5.1), 2. ekstrapolacji - postawienia prognozy położenia kilku punktów za ostatnim punktem znanym lub podanie przepisu matematycznego, dotyczacego ˛ przyszłego “zachowania” funkcji (środkowy wykres na rys. 5.1), 3. aproksymacji - zaproponowanie przepisu funkcji, która niekoniecznie przechodzi przez znane punkty, ale bardzo dobrze przyliża kształt funkcji, np. linii prostej w sytuacji kiedy dane sa˛ zaszumione i skacza˛ “góra/dół” (prawy wykres na rys. 5.1). Kiedy w wyniku rozwiazania ˛ zadania interpolacji i aproksymacji otrzymamy konkretny przepis matematyczny funkcji, opisujacy ˛ “trend” danych pomi˛edzy punktem pierwszym a ostatnim, to przepis ten można także zastosować do opisu zachowania danych za punktem ostatnim, czyli do ekstrapolacji. W tym rozdziale b˛edziemy si˛e zajmować wyłacznie ˛ zagadnieniem interpolacji, a w rozdziale nast˛epnym — problemem aproksymacji. Rysunek 5.1: Ilustracja graficzna zadań: interpolacji (przybliżenia pomi˛edzy punktami, punkty zachowane), ekstrapolacji (prognozy “wprzód”) oraz aproksymacji (oddania charakteru zmienności, punkty nie sa˛ zachowane). 89 90 5 Interpolacja i ekstrapolacja wielomianowa W tym rozdziale b˛edziemy interesować si˛e interpolacja˛ wielomianowa,˛ czyli znalezieniem współczynników an , n = 0, 1, 2, ..., N − 1, wielomianu: N−1 y = f (x) = a0 + a1 x + a2 x2 + ... + aN−1 xN−1 = ∑ an x n (5.1) n=0 stopnia N − 1, przechodzacego ˛ przez N punktów {xi , yi }, i = 1, 2, ..., N. Jak si˛e za chwil˛e okaże, rozwiazanie ˛ postawionego zadania sprowadzi si˛e do rozwiazania ˛ układu N równań liniowych z N niewiadomymi. W środowisku Matlab istnieja˛ nast˛epujace ˛ funkcje, które służa˛ do rozwiazania ˛ zadania interpolacji: • a = polyfit( xp, yp, P ) - znalezienie wartości a współczynników wielomianu (5.1) na podstawie znanych P punktów (xp,yp), • yi = polyval(a,xi) - obliczenie wartości funkcji yi w punktach iterpolacji xi z użyciem wyznaczonych wcześniej współczynników a wielomianu, na podstawie wzoru (5.1), • yi = interp1( xp, yp, xi, ’metoda’ ) - obliczenie wartości funkcji yi w punktach iterpolacji xi z użyciem znanych punktów (xp,yp) oraz wybranej metody interpolacji lokalnej: linear, nearest, next, previous, spline, pchip, cubic. Poniższy kod prezentuje przykładowy sposób ich użycia. Listing 5.1: Przykład interpolacji funkcji sinus z użyciem funkcji Matlaba % Funkcja interpolowana wielomianem i jej parametry N = 20; % liczba znanych punktow funkcji, u nas sinus() xmax = 2*pi; % maksymalna wartosc argumentu funkcji xp = 0 : xmax/(N-1) : xmax; % wartosci argumentow dla znanych wartosci funkcji xd = 0 : 0.001 : xmax; % wartosci argumentow w punktach interpolacji yp = sin( xp ); % znane wartosci yd = sin( xd ); % wartosci w punktach interpolacji - do sprawdzenia figure; plot( xp, yp, ’ro’, xd, yd, ’b-’); xlabel(’x’); title(’y(x)’); grid; pause % Wspolczynniki wielomianu y(x) = a0 + a1*x^1 + a2*x^2 + ... + aP*x^P P = N-1; % rzad wielomianu: 0 (a0), 1 (a0 + a1*x), 2 (a0 + a1*x + a2*x^2), ... a = polyfit( xp, yp, P ), % obliczenie wsp. wielomianu interpolujacego % Interpolacja funkcji w zadanych punktach xi xi = xd; % argumenty punktow interpolacji yi = polyval(a,xi); % wartosci w punktach interpolacji a = a(end:-1:1), % w Matlabie wsp. sa zapisywane od najwyzszej potegi yi_moje = zeros(1,length(xi)); for k = 1 : N % sami obliczamy wartosci w punktach interpolacji yi_moje = yi_moje + a(k) * xi.^(k-1); end max_abs_yi = max( abs( yi - yi_moje) ), pause figure; plot( xp,yp,’ro’, xd,yd,’b-’, xi,yi,’k-’ ); xlabel(’x’); title(’y(x)’); grid; pause figure; plot( xd, yd-yi, ’k-’ ); xlabel(’x’); title(’BLAD INTERPOLACJI NR 1’); grid; pause % Funkcja interpolacji w Matlabie - interp1() yis = interp1( xp, yp, xi, ’spline’ ); figure; plot( xp,yp,’ro’, xd,yd,’b-’, xi,yi,’k-’, xi,yis,’k--’ ); xlabel(’x’); title(’y(x)’); grid; pause figure; 5.2 Najprostsze zadanie interpoacji 91 plot( xd, yd - yis, ’k-’ ); xlabel(’x’); title(’BLAD INTERPOLACJI NR 2’); grid; pause Problem 5.1 ((L)* Interpolacja - pierwsze koty za płoty). Przeanalizuj kod programu 5.1, uruchom go, obejrzyj wszystkie rysunki. Ustaw xmax=pi/4, potem xmax=5*2*pi - jakie wnioski wyciagniesz ˛ obserwujac ˛ otrzymane wyniki. Ustaw xmin=0.1, xmax=2 oraz zmień funkcj˛e sin() na log10(), nast˛epnie na exp(). 5.1.2 Przykłady zastosowań interpolacji Odtwarzanie brakujacej ˛ informacji. Jak już powiedziano, zadaniem interpolacji jest “odtwarzanie” brakujacej ˛ informacji pomi˛edzy znanymi punktami (w˛ezłami) danych: mamy zrekonstruować brakujace ˛ punkty dbajac ˛ o gładkie przejście pomi˛edzy punktami znanymi. Słowo odtwarzanie jest napisane w cudzysłowie, ponieważ nigdy nie jesteśmy pewni charakteru brakujacych ˛ danych. Przykładowo interpolacja jest stosowana podczas: 1. odtwarzania w postaci izoterm rozkładu temperatury na obszarze Polski na podstawie pomiarów temperatury w rozproszonych stacjach meteorologicznych (problem dwuwymiarowy), 2. odtwarzania chwil przejścia przez zero spróbkowanego sygnału okresowego - np. przy pomiarze cz˛estotliwości pracy serca albo okresu napi˛ecia zasilajacego ˛ w sieci elektroenergetycznej, 3. nadpróbkowywania sygnałów dźwi˛ekowych w mikserach cyfrowych, czyli dodawania nowych próbek do już istniejacych ˛ przy zachowaniu szerokości pasma cz˛estotliwościowgo zajmowanego przez sygnał, np. podczas zmiany cz˛estotliwości próbkowania sygnału mowy z 8 kHz na 48 kHz, czyli 6 razy wi˛ekszej. Redukcja opisu danych. Interpolacja wielomianowa, podobnie jak aproksymacja omówiona w nast˛epnym rozdziale, może być zastosowana do prostszego przedstawienia zmienności danych za pomoca˛ funkcji matematycznej. Zamiast zbioru wielu liczb wystarczy w takim przypasku zapami˛etać tylko wartości kilku współczynników wielomianu, dopasowanego do danych. Przykłady: 1. Opis ciagłej ˛ charakterystyki przetwarzania jakiegoś układu kilkoma współczynnikami wielomianu interpolujacego. ˛ Np. charakterystyka przetwarzania termorezystora Pt100 jest przedstawiana w normie państwowej w alternatywnych postaciach: tabeli wartości lub współczynników wielomianu czwartego stopnia w funkcji temperatury. R 2 2. Przybliżenie czasochłonnej obliczeniowo funkcji. Np. funkcja erf(x) = √2π 0x e−t dt (nie obliczalna analitycznie całka eliptyczna) jest w Matlabie przybliżana przez funkcj˛e wymierna˛ (rational approximation) - aproksymacja Padé. 5.2 Najprostsze zadanie interpoacji Załóżmy, że poszukujemy nieznanych wartości a i b równania linii prostej: 92 5 Interpolacja i ekstrapolacja wielomianowa y = ax + b, przechodzacej ˛ przez dwa punkty (x1 , y1 ) i (x2 , y2 ) (patrz rys. 5.2): x2 1 a y = 2 . x1 1 b y1 (5.2) (5.3) Jeśli rozwia˛żemy macierzowe równanie (5.3) znana˛ już nam metoda˛ wyznaczników (Cramera), to otrzymamy: a= y2 − y1 , x2 − x1 b= x2 y1 − x1 y2 . x2 − x1 (5.4) Dysponujac ˛ tymi wartościami możemy obliczyć wartość funkcji dla dowolnej wartości jej argumentu x, czyli także pomi˛edzy znanymi dwoma punktami. Możemy wi˛ec ja˛ dowolnie interpolować, korzystajac ˛ z nastepujacej ˛ zależności funkcyjnej: y = ax + b = y2 − y1 x2 y1 − x1 y2 x+ . x2 − x1 x2 − x1 (5.5) Rysunek 5.2 Ilustracja graficzna interpolacji liniowej dla dwóch punktów. Równanie (5.5) można zapisać jeszcze w dwóch alternatywnych postaciach: 1. zapis przyrostowy Newtona: y = y1 + y2 − y1 (x − x1 ), x2 − x1 (5.6) 2. zapis kombinacyjny Lagrange’a: y= x − x2 x − x1 y1 + y2 . x1 − x2 x2 − x1 (5.7) W dalszej cz˛eści tego rozdziału pokażemy zalety i zastosowania obu zapisów. Problem 5.2 (* Różne zapisy tego samego wielomianu). Sprawdź, że zapisy (5.5)(5.6) i (5.7) sa˛ sobie równoważne. Czy jesteś w stanie napisać wzory Newtona i Lagrange’a dla wielomianu drugiego stopnia y = ax2 + bx + c? 5.3 Interpoacja wielomianowa - definicja i rozwiazanie ˛ 93 5.3 Interpoacja wielomianowa - definicja i rozwiazanie ˛ W przypadku interpolacji wielomianowej stopnia N − 1 poszukujemy współczynników ai wielomianu y(x), zdefiniowanego równniem (5.1), który dla argumentów {x1 , x2 , ..., xN } przyjmuje wartości {y1 , y2 , ..., yN }: y(xi ) = yi , i = 1, 2, ..., N. (5.8) Zapisujac ˛ równanie (5.1) dla każdego punktu (5.8), otrzymujemy równanie macierzowe: N−1 x1 · · · x1 1 aN−1 y1 xN−1 · · · x2 1 .. y2 2 (5.9) . .. .. . = .. .. a1 . . ··· . a0 yN xN−1 · · · xN 1 | N {z } X które należy rozwiazać. ˛ Można to zrobić ogólnymi metodami (np. dekompozycja LU macierzy X i podstawienia). Otrzymany układ równań, z tzw. macierza˛ Vandermonde’a, jest źle uwarunkowany dla dużej wartości N. Jednak nieznaczna modyfikacja parametryzacji wielomianu (5.1) i przedstawieniu go w postaci Newtona albo Lagrange’a, prowadzi do prostego iteracyjnego algorytmu wyznaczania współczynników wielomianu interpolujacego. ˛ Przykład Spróbujmy interpolować (przybliżyć) okrag, ˛ w sytuacji kiedy dysponujemy mała˛ liczba˛ punktów okr˛egu, czyli w˛ezłów interpolacji. Dowolny punkt (x, y), leżacy ˛ na okr˛egu, spełnia nast˛epujace ˛ równania: ( x (α) = cos (α) , . (5.10) y (α) = sin (α) Przymujac ˛ N równoodległych punktów i = 0, 1, 2, ..., N − 1, otrzymujemy: 2π x (i) = cos i , N 2π y (i) = sin i . N (5.11) W tabeli 5.1 podane sa˛ współrz˛edne znanych punktów okr˛egu, otrzymanych z (5.11), dla N = 5. Pokazano je na rysunku 5.3. Tabela 5.1: Współrzedne znanych punktów okr˛egu, który b˛edzie interpolowany i x(i) y(i) 0 1 0 1 0 1 2 -1 0 3 0 -1 4 1 0 94 5 Interpolacja i ekstrapolacja wielomianowa Rysunek 5.3 Pi˛eć punktów okr˛egu zdefiniowanych przez (5.11) (czarne kropki, 0-owa i 4-ta pokrywaja˛ si˛e), na podstawie których jest przeprowadzana jego interpolacja. Załóżmy, że interpolujemy niezależnie współrz˛edne x i y okr˛egu, czyli funkcje kosinus i sinus. Ponieważ dysponujemy tylko ich 5-cioma punktami (i = 0, 1, ..., 4) na okres, stosujemy nast˛epujace ˛ dwa identyczne wielomiany: (x) (x) (x) (x) (x) x(i) = a0 + a1 i + a2 i2 + a3 i3 + a4 i4 , (5.12) (y) (y) (y) (y) (y) y(i) = a0 + a1 i + a2 i2 + a3 i3 + a4 i4 , (5.13) (x) (y) ale o różnych współczynnikach ak , ak k = 0, 1, ..., 4. Współczyniki te należy obliczyć z użyciem równania (5.9). W obu przypadkach macierz X jest taka sama i równa: 4 0 1 X= 2 3 4 3 0 1 2 3 4 2 0 1 2 3 4 1 0 1 2 3 4 0 0 1 2 3 4 0 0 1 1 = 16 8 81 27 256 64 0 01 1 1 1 4 2 1 9 3 1 16 4 1 (5.14) Program 5.2 przeprowadza interpolacj˛e, opisana˛ powyżej. Jej wynik jest pokazany na rysunku 5.4. y=f(x) 1.5 1 0.5 y Rysunek 5.4 Wynik interpolacji wielomianowej (niebieska, ciagła ˛ linia) oryginalnego okr˛egu (czerwona, przerywana linia) na podstawie czterech punktów (czarna cia˛ gła linia). 0 -0.5 -1 -1.5 -1.5 -1 -0.5 0 0.5 1 1.5 x Listing 5.2: Przykład interpolacji okr˛egu na podstawie jego N punktów % interp_circle.m % x(i) = ax0 +ax1*i^1 + ax2*i^2 + ... + axN*i^N % y(i) = ay0 +ay1*i^1 + ay2*i^2 + ... + ayN*i^N clear all; close all; N = 4; i = (0 : N)’; xi = cos( 2*pi/N * i ); % stopien wielomianow % zmienna "i" wielomianu w wezlach ("rzadka") % wartosci funkcji x=kosinus w wezlach 5.4 Interpolacja wielomianami Lagrange’a i Newtona 95 yi = sin( 2*pi/N * i ); [ i, xi, yi ], pause % wartosci funkcji y=sinus % sprawdzenie wartosci w wezlach X = vander(i), pause % wygenerowanie i pokazanie macierzy Vandermonde’a ax = inv(X) * xi; ay = inv(X) * yi; % obliczenie wielu wsp. wielomianu dla zmiennej x % obliczenie wielu wsp. wielomianu dla zmiennej y id = 0 : 0.01 : N; % zmienna "i" dokladna xd = cos( 2*pi/N * id ); % dokladne wartosci x yd = sin( 2*pi/N * id ); % dokladne wartosci y figure; plot( xi,yi,’ko’, xd,yd,’r--’, polyval(ax,id), polyval(ay,id),’b.-’); xlabel(’x’); ylabel(’y’); title(’y=f(x)’); axis square; grid; pause figure; plot( i,xi,’ko’, id,xd,’r--’, id, polyval(ax,id),’b.-’); xlabel(’i’); ylabel(’x’); title(’x=f(i)’); grid; pause Problem 5.3 (* Interpolacja wielomianowa okr˛egu). Zmodyfikuj program 5.2 i sprawdź wynik interpolacji dla wi˛ekszych wartości N. Od jakiej wartości bład ˛ interpolacji jest według ciebie akceptowalnie mały? 5.4 Interpolacja wielomianami Lagrange’a i Newtona Łacz ˛ ac ˛ klasyczny zapis wielomianu (5.1) N − 1 stopnia ze znajomościa˛ N punktów (xi , yi ), i = 1...N (5.8), przez które on przechodzi, tworzy si˛e dwa alternatywne zapisy wielomianu specjalnie na potrzeby interpolacji. Zostały one zaproponowane przez Lagrange’a i Newtona. 5.4.1 Zastosowanie wielomianów Lagrange’a W zapisie Lagrange’a wielomian N − 1 stopnia, przechodzacy ˛ przez N punktów (xi , yi ), jest suma˛ N wielomianów Lagrange’a: N y(x) = ∑ yi · Li (x). (5.15) i=1 Wielomiany te musza˛ spełniać warunek, że każdy i-ty wielomian przyjmuje wartość 0 we wszystkich zadanych w˛ezłach oprócz i-tego: 0, j ̸= i (5.16) Li (x j ) = 1, j = i Spełnione to jest dla wielomianów zaproponowaych przez Lagrange’a, także stopnia N − 1, o nast˛epujacej ˛ postaci: Li (x) = (x−x1 )...(x−xi−1 )(x−xi+1 )...(x−xN ) (xi −x1 )...(xi −xi−1 )(xi −xi+1 )...(xi −xN ) ∏ = j=1,...,N, j̸=i ∏ j=1,...,N, j̸=i (x−x j ) (xi −x j ) (5.17) Zaleta˛ takiej reprezentacji jest prosty sposób wyznaczania wartości wielomianu dla dowolnej wartości x oraz łatwa interpretacja funkcji y = f (x) jako sumy wielomia- 96 5 Interpolacja i ekstrapolacja wielomianowa nów bazowych (co jest wiodac ˛ a˛ idea w aproksymacji, która b˛edzie omawiana podczas nast˛epnego laboratorium). Na rysunku 5.5 sa˛ przedstawione wielomiany bazowe Lagrange’a dla przypadku N = 4 w˛ezłów w punktach: x1 = −3, x2 = −1, x3 = 1, x4 = 3 oraz przyjmujace ˛ nast˛epujace ˛ wartości w zadanych w˛ezłach (wsz˛edzie 1): y(−3) = 1, y(−1) = 1, y(1) = 1, y(3) = 1 Zauważmy, że: 1. każdy wielomian przyjmuje wartość 1 tylko w jednym, innym w˛eźle, a w pozostałych w˛ezłach jest równy 0, 2. dla każdej wartości x zachodzi równość: N ∑ Li (x) = 1, (5.18) i=1 3. podczas sumowania (5.15) każdy z wielomianów Li (x) ma udział z waga˛ yi . Rysunek 5.5 został wygenerowany w programie 5.3, z użyciem funkcji przedstawionej w listingu 5.4. y=f(x) 2.5 2 1.5 1 y 0.5 0 -0.5 -1 -1.5 -2 -2.5 -4 -3 -2 -1 0 1 2 3 4 x Rysunek 5.5: Kształt czterech funkcji Lagrange’a dla rozpatrywanego przypadku interpolacji danych: wartości funkcji y = 1 dla wartości argumentów x = −3, −1, 1, 3. Czarna linia przerywana jest ich suma,˛ czyli wynikiem interpolacji. Listing 5.3: Przykład interpolacji danych metoda˛ Lagrange’a % interp_lagrange.m clear all; close all;; x = [-3, -1, 1, 3]; y = [1, 1, 1, 1]; % zadane punkty = wezly xi = [-4: 0.05 : 4]; % gdzie obliczyc nowe wartosci funkcji [yi,a] = funTZ_lagrange(x,y,xi); % nasza funkcja interpolujaca yii = polyval(a,xi); % oblicz wartosci wielomianu "a" w punktach "xi" a, % obliczone wsp. wielomianu: aN,...,a1,a0 figure; plot(x,y,’ro’,xi,yi,’b-’,xi,yii,’’); title(’y=f(x)’); % rysunek 5.4 Interpolacja wielomianami Lagrange’a i Newtona 97 Listing 5.4: Przykładowa funkcja Matlaba do interpolacji danych metoda˛ Lagrange’a function [yi,a] = funTZ_lagrange(xk,yk,xi) Nk=length(xk); Ni=length(xi); % liczba wartosci wejsciowych % liczba wartosci wyjsciowych (interpolowanych) % Oblicz wspolczynniki wielomianu a a=zeros(1,Nk); for k = 1:Nk if(k==1) dxk(1) = prod( xk(1)-xk(2:Nk) ); proots = xk(2:Nk); elseif(k==Nk) dxk(Nk) = prod( xk(Nk)-xk(1:Nk-1) ); proots = xk(1:Nk-1); else dxk(k) = prod( xk(k)-[xk(1:k-1) xk(k+1:Nk)] ); proots = [xk(1:k-1) xk( k+1:Nk)]; end Lk = poly(proots)/dxk(k), % kolejny wielomian Lagrange’a a = a + yk(k) * Lk; % suma wielomianow Lagrange’a end % Oblicz interpolowane wartosci funkcji w punktach xi jako sume wielomianow Lagrange’a for i=1:Ni yi(i)=0; for k=1:Nk if(k==1) dxi = xi(i)-xk(2:Nk); elseif(k==Nk) dxi = xi(i)-xk(1:Nk-1); else dxi = xi(i)-[xk(1:k-1) xk(k+1:Nk)]; end yi(i) = yi(i) + yk(k) * prod(dxi)/dxk(k) ; % suma wartosci wielomianow Lagrange’ a end end % Pokaz krzywe uzytych wielomianow Lagrange’a w tym przypadku if(1) figure for k=1:Nk for i=1:Ni if(k==1) dxi = xi(i)-xk(2:Nk); elseif(k==Nk) dxi = xi(i)-xk(1:Nk-1); else dxi = xi(i)-[xk(1:k-1) xk(k+1:Nk)]; end yL(i) = yk(k) * prod(dxi)/dxk(k) ; % kolejny wielomian Lagrange’a end plot(xk,yk,’ko’,xk,zeros(1,Nk),’ko’,xi,yL); hold on; end xlabel(’x’); ylabel(’y’); title(’y=f(x)’); grid; pause end Przykład - odtwarzanie ciagłego ˛ przebiegu temperatury otoczenia na podstawie nierównomiernej sekwencji pomiarów. Stacja meteorologiczna we wczesnowiosenny dzień dostarczyła pomiarów temperatury w Krakowie w postaci tabeli 5.2. Tabela 5.2: Wynik pomiaru temperatury w Krakowie Godzina Temperatura [o ]C g1 = 5 : 00 g2 = 6 : 00 g3 = 8 : 00 g4 = 11 : 00 T1 = −2 T2 = 3 T3 = 7 T4 = 10 Znajdźmy wielomian interpolacyjny do prezentacji zmian temperatury w sposób “gładki”. Zakładajac, ˛ że godzina g b˛edzie zapisywana jako ułamek dziesi˛etny (np. 5.25 = 5 41 = 5 : 15), rozwiazanie ˛ Lagrange’a ma nast˛epujac ˛ a˛ postać: 98 5 Interpolacja i ekstrapolacja wielomianowa T (g) = −2L1 (g) + 3L2 (g) + 7L3 (g) + 10L4 (g), (5.19) gdzie: (g − 6) (g − 8) (g − 11) = 29.3333 − 11.2222g + 1.3889g2 − 0.0556g3 , (5 − 6) (5 − 8) (5 − 11) (g − 5) (g − 8) (g − 11) L2 (g) = = −44 + 18.3g − 2.4g2 + 0.1g3 , (6 − 5) (6 − 8) (6 − 11) (g − 5) (g − 6) (g − 11) L3 (g) = = 18.3333 − 8.3889g + 1.2222g2 − 0.0556g3 , (8 − 5) (8 − 6) (8 − 11) (g − 5) (g − 6) (g − 8) L4 (g) = = −2.6667 + 1.3111g − 0.2111g2 + 0.0111g3 . (11 − 5) (11 − 6) (11 − 8) L1 (g) = Problem 5.4 ((L)* Prosty przykład interpolacji danych wielomianami Lagrange’a). Zmodyfikuj program 5.3: 1) zmień wartości funkcji yi w zadanych punktach xi, 2) zwi˛eksz liczb˛e zadanych punktów (w˛ezłów interpolacji), 3) zmień położenie punktów xi, np. zag˛eść je na brzegach przedziału [-3,3]. Czy liczba punktów poprawia jakość interpolacji? Czy zmiana położenia punktów wpływa na wynik interpolacji? Problem 5.5 ((L)* Interpolacja temperatury w Krakowie metoda˛ Lagrange’a). Zmodyfikuj program 5.3 tak, aby rozwiazał ˛ on metoda˛ Lagrange’a problem z przykładu interpolacji temperatury w Krakowie. Jaka była wartość temperatury o godzinie 7:15? O której godzinie temperatura przekroczyła 1 [o C] (problem odwrotny) ? O godzinie 14:00 dostarczono świeży pomiar temperatury (np. 14 stopni Celsjusza) - jakie zmiany spowoduje on w poprzednio obliczonych wielomianach Lagrange’a? Problem 5.6 (* Analiza funkcji interpolujacej ˛ wielomianami Lagrange’a). Przeanalizuj program 5.4: prześledź i zrozum wszystkie kolejne etapy obliczeń. Dodaj do funkcji opcj˛e pokazywania współczynników każdego z użytych wielomianów Lagrange’a Li (x) = b0 + b1 x + ... + bN−1 xN−1 . Zapisz algorytm inaczej, prościej, jeśli masz pomysł jak to zrobić. 5.4.2 Zastosowanie wielomianów Newtona Czasami konstrukcja wielomianu interpolujacego ˛ jest wykonywana wielokrotnie dla zwi˛ekszajacej ˛ si˛e liczby w˛ezłów interpolacji. W takim przypadku korzystnie jest przedstawić wielomian w postaci sumy składników, w której dodanie nowego w˛ezła powoduje dodanie nowego składnika bez konieczności przeliczania poprzednich składników. Uogólniajac ˛ postać przyrostowa˛ wielomianu na przypadek interpolacji N-punktowej uzyskujemy: 5.4 Interpolacja wielomianami Lagrange’a i Newtona 99 Rysunek 5.6 Ilustracja graficzna wyznaczania kolejnych elementów macierzy ilorazów różnicowych podczas interpolacji Newtona. y (x) = c0 + c1 · (x − x1 ) + c2 · (x − x1 ) (x − x2 ) + . . . + cN−1 · (x − x1 ) . . . (x − xN−1 ) (5.20) co możemy też zapisać w nast˛epujacej ˛ postaci: N−1 y(x) = ∑ ci · Ni (x), (5.21) i=0 gdzie Ni (x) oznacza i-ty wielomian Newtona. Współczynniki ci sa˛ obliczane iteracyjnie w sposób nast˛epujacy ˛ jako kolejne ilorazy różnic (w - numer wiersza, k - numer kolumny): w = 1, 2, ..., N : d(w, 1) = y(w); k = 2, 3, ..., N : % pierwsza kolumna % kolejne kolumny w = k, k + 1, ..., N : % kolejne wiersze poniżej d(w, k − 1) − d(w − 1, k − 1) ; x(w) − x(w − k + 1) ci−1 = di,i ; % pobranie elementów z diagonali d(w, k) = i = 1, 2, ..., N : co można zapisać w postaci tabeli, pokazanej na rysunku 5.6 oraz programu 5.5. Listing 5.5: Przykładowa funkcja Matlaba do interpolacji danych metoda˛ Newtona function [yi,a,p] = funTZ_newton(xk,yk,xi) Nk=length(xk); Ni=length(xi); % liczba wartosci wejsciowych % liczba wartosci wyjsciowych (interpolowanych) % Ilorazy roznicowe (divided differences) d(:,1) = yk(1:Nk); % wstawienie wartosci do pierwszej kolumny for k = 2 : Nk % w kolejnych kolumnach for w = k : Nk % w kolejnych wierszach na przekatnej i ponizej: tmp1 = d(w,k-1)-d(w-1,k-1); % kolumna przed: element minus element powyzej tmp2 = xk(w)-xk(w-k+1); % argument w-ty minus odleglosc od diag + 1 d(w,k) = tmp1 / tmp2; % iloraz roznicowy end end % Wspolczynniki "w" wielomianu w zapisie Newtona p = diag(d); % Wartosci interpolowane yi=[]; 100 5 Interpolacja i ekstrapolacja wielomianowa for i=1:Ni yi(i) = cumprod( [1, xi(i)-xk(1:Nk-1)] ) * p; end % Wspolczynniki "a" wielomianu w zapisie klasycznym a=zeros(1,Nk); a(Nk)=p(1); for k = 1 : Nk-1 a = a + p(k+1) * [ zeros(1,Nk-k-1) poly(xk(1:k)) ]; end Przykład - temperatura w Krakowie c.d. Powróćmy do naszego przykładu interpolacji temperatury w Krakowie. Tym razem zróbmy to z użyciem wielomianów Newtona: c0 = d1,1 = T1 = −2 d2,1 − d1,1 3+2 = =5 c1 = d2,2 = 6−5 6−5 7−3 −5 d3,2 − d2,2 d3,1 − d2,1 − 5 c2 = d3,3 = = = 2 = −1 8−5 3 3 4 c3 = d4,4 = 30 4 T (g) = −2 + 5 (g − 5) −1 (g − 5) (g − 6) + 30 (g − 5) (g − 6) (g − 8) 2 4 T (g) = −2 + 5 (g − 5) −1 g − 11g + 30 + 30 g3 − 19g2 + 118g − 240 Problem 5.7 (* Prosty przykład interpolacji danych wielomianami Newtona). Zmodyfikuj program 5.3: 1) dodaj do niego możliwość interpolacji danych z użyciem metody Newtona - wywołaj udost˛epniona˛ funkcj˛e i sprawdź czy działa ona poprawnie, 2) zmień wartości funkcji yi w zadanych punktach xi, 3) zwi˛eksz liczb˛e zadanych punktów (w˛ezłów interpolacji), 4) zmień położenie punktów xi, np. zag˛eść je na brzegach przedziału [-3,3]. Czy liczba punktów poprawia jakość interpolacji? Czy zmiana położenia punktów wpływa na wynik interpolacji? Problem 5.8 (* Interpolacja temperatury w Krakowie metoda˛ Newtona). Zmodyfikuj program 5.3 tak, aby rozwiazał ˛ on metoda˛ Newtona problem z przykładu interpolacji temperatury w Krakowie. Jaka była wartość temperatury o godzinie 7:15? O której godzinie temperatura przekroczyła 1 [oC] (problem odwrotny) ? O godzinie 14:00 dostarczono świeży pomiar temperatury (np. 14 stopni Celsjusza) - jakie zmiany spowoduje on w poprzednio obliczonych wielomianach Newtona? Problem 5.9 (* Analiza funkcji interpolujacej ˛ wielomianami Newtona). Przeanalizuj program 5.5: prześledź i zrozum wszystkie kolejne etapy obliczeń. Dodaj do funkcji opcj˛e pokazywania współczynników każdego z użytych wielomianów Newtona (5.21) postaci Ni (x) = b0 + b1 x + ... + bi xi , i = 0, 1, ...(N − 1). Zapisz algorytm inaczej, prościej, jeśli masz pomysł jak to zrobić. 5.4 Interpolacja wielomianami Lagrange’a i Newtona 101 Rysunek 5.7 Ilustracja graficzna wyznaczania kolejnych elementów macierzy różnic w przód podczas interpolacji Newtona z w˛ezłami równoodległymi. 5.4.3 Przypadek w˛ezłów równoodległych Jeśli w˛ezły interpolacji sa˛ równoodległe z odst˛epem ∆ x, to postać iterpolacji według wzoru Newtona upraszcza si˛e. Przy równoodległych w˛ezłach, takich że: xi = x0 + i · ∆ x, stosuje si˛e w niej podstawienie y (x) = y (i) = y0 + xi −x0 ∆x i = 0, 1, 2, ..., N − 1, (5.22) = i, dzi˛eki któremu otrzymujemy: i−0 i(i − 1) 2 i (i − 1) . . . (i − (N − 2)) N−1 ∆ y0 + ∆ y0 +. . .+ ∆ y0 = 1 1·2 (N − 1)! N−1 i = ∑ ∆ j y0 , (5.23) j j=0 gdzie zastosowano oznaczenia ∆ yk = yk+1 − yk oraz ∆ p yk = ∆ p−1 yk+1 − ∆ p−1 yk (różnice w przód, forward differences), dla których mamy: ∆ y0 = y1 − y0 , ∆ 2 y0 = ∆ y1 − ∆ y0 = (y2 − y1 ) − (y1 − y0 ), ∆ 3 y0 = ∆ 2 y1 − ∆ 2 y0 = (∆ y2 − ∆ y1 ) − (∆ y1 − ∆ y0 ), ... Na rysunku 5.7 zilustrowano graficznie iteracyjny schemat obliczeniowy stosowany w metodzie Newtona w przypadku w˛ezłów równoodległych. Jest on prostszy niż dla w˛ezłów dowolnych (patrz rys. 5.6), gdyż nie ma w nim operacji dzielenia: w = 1, 2, ..., N : dw,1 = y(w); k = 1, 2, ..., N − 1 : w = k, k + 1, ..., N − 1 : % pierwsza kolumna % kolejne kolumny % kolejne wiersze poniżej d(w + 1, k + 1) = d(w + 1, k) − d(w, k); i = 1, 2, ..., N : ci−1 = di,i ; % pobranie elementów z diagonali Odmiany tej formuły z różnicami w tył i różnicami centralnymi służa˛ do dokładniejszej interpolacji na końcu i w środku przedziału (czego już nie przytaczamy – patrz np. Buchanan „Numerical Methods and Analysis”). 102 5 Interpolacja i ekstrapolacja wielomianowa Przykład - temperatura silnika samochodu podczas rozruchu. Sygnał temperatury T silnika samochodu, jest próbkowany od momentu uruchomienia silnika (t=0 [minut]) do nagrzania (t=10 [minut]) co 1 minut˛e w T (0 : 10). W tym przypadku wzór (5.24) przyjmuje postać: N−1 T (i) = ∑ j=0 i ∆ jT . j (5.24) a i jest liczba˛ rzeczywista˛ z przedziału [0, 10] minut. Program 5.6 rozwiazuje ˛ nasze zadanie. Funkcja cumprod() daje narastajacy ˛ iloczyn elementów. Listing 5.6: Przykładowa funkcja Matlaba implementujaca interpolacj˛e danych metoda˛ Newtona w przypadku wezłów równoodległych - temperatura silnika podczas rozruchu % interp_equdist.m clear all; close all; T = [ 25 55 75 81 84 86 87 87 88 88 88 ]; % temperatura odczytywana co 1 minute N = length(T); % liczba punktow t = 0 : 1 : N-1; % chwile pomiarow, kolejne minuty d(:,1)=T(1:N); % pierwsza kolumna macierzy roznic w przod for k=1:N-1 % nastepne kolumny (w petli jest +1) for w=k:N-1 % kolejne wiersze na i ponizej diagonali d(w+1,k+1)=( d(w+1,k)- d(w,k) ); % roznica w przod w nastepnej kolumnie end % end % for i = 1 : 100 % liczy wartosci ze wzoru na T(i) ti(i) = 0.1 * (i-1); % interpolowane minuty coef = 1; for k = 0:N-2, coef = [ coef, (ti(i)-k)/(k+1) ]; end Ti(i) = cumprod( coef ) * diag(d); % sum( (i;j) * delta^j(T) ) end figure; plot(t,T,’ro’,ti,Ti,’b-’); xlabel(’t [min]’); title(’T(t) [^{o} C]’); grid; Problem 5.10 (* Analiza funkcji interpolujacej ˛ wielomianami Newtona dla w˛ezłów równoodległych). Przeanalizuj program 5.6: prześledź i zrozum wszystkie kolejne etapy obliczeń. Porównaj wszystkie operacje ze wzorami. Interesuje nas jaka była wartość temperatury silnika Ti po ti = 20[s]= 13 [minut]. Dlaczego interpolowana funkcja oscyluje na końcu przedziału? Spróbuj temu zaradzić. 5.4.4 Efekt Rungego Aproksymacja z użyciem wielu w˛ezłów wymusza stosowanie wielomianu interpolacyjnego wysokiego stopnia. Szczególnie przy równoodległych w˛ezłach prowadzi to do oscylacji wielomianu na końcach przedziału interpolacji, co jest znane jako efekt Rungego. Zadanie interpolacji wielomianem wysokiego stopnia jest dodatkowo wrażliwe na zaburzenie danych (jest źle uwarunkowane numerycznie). Z tych powodów warto stosować interpolacj˛e lokalna˛ niższego stopnia – funkcje sklejane, lub interpolacj˛e z narzuconymi w˛ezłami Czebyszewa, co omówimy przy okazji tematu aproksymacji. 1 Program 5.7 ilustruje efekt Rungego dla “trudnej” funkcji y(x) = 1+x 2 . Wynik jego użycia jest przedstawiony na rysunku 5.8, na którym sa˛ widoczne wyraźne oscylacje, powi˛ekszajace ˛ si˛e podczas zbliżania do końców przedziału interpolacji. 5.5 Funkcje sklejane i gładka interpolacja lokalna Rysunek 5.8 Ilustracja efektu Rungego: silnych oscylacji na obu końcach przedziału, wyraźnie widocznych podczas interpolacji 1 funkcji y(x) = 1+x 2. 103 y=f(x) 2 1.5 1 0.5 0 -0.5 -5 -4 -3 -2 -1 0 1 2 3 4 5 x Listing 5.7: Ilustracja efektu Rungego % interp_runge.m clear all; close all; % Funkcja dokladnie - malymi kroczkami x = ( -5 : 0.01 : 5)’; y = 1 ./ (1+x.^2); % Wezly - zgrubnie - duze kroki xk = ( -5 : 1 : 5)’; yk = 1./(1+xk.^2); N = length(xk); % Ilorazy roznicowe w metodzie Newtona d(:,1) = yk(1:N); for k=2:N % kolumny w = k:N; % wiersze d(w,k) = ( d(w,k-1)- d(w-1,k-1) ) ./ ( xk(w)-xk(w-k+1) ); end % Wlasciwa interpolacja yi=[]; for i=1:length(x) xi =x(i); yi(i) = cumprod([1, (xi-xk(1:N-1))’]) * diag(d); end % Wynik figure; plot(x,y,xk,yk,’o’,x,yi,’r’); xlabel(’x’); title(’y=f(x)’); grid; Problem 5.11 ((L)* Próba redukcji efektu Rungego). Przeanalizuj program 5.7: prześledź i zrozum wszystkie kolejne etapy obliczeń. Zwróć uwag˛e na bardzo duże oscylacje funkcji interpolujacej ˛ na końcach przedziału. Postaraj si˛e je zmniejszyć zmieniajac ˛ liczb˛e i położenie w˛ezłów interpolacji. 5.5 Funkcje sklejane i gładka interpolacja lokalna Funkcje sklejane (tzw. splajny) sa˛ realizacja˛ idei gładkiej interpolacji lokalnej wielomianem niskiego stopnia z gładkim połaczeniem ˛ (sklejeniem) sasiednich ˛ wielomianów. W jadrze ˛ Matlaba znajduje si˛e uniwersalna funkcja interpolacji interp1(), 104 5 Interpolacja i ekstrapolacja wielomianowa Rysunek 5.9 Przykład inter1 polacji funkcji y(x) = 1+x 2 liniami prostymi, czyli splajnami pierwszego stopnia. y(x) 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 -5 -4 -3 -2 -1 0 1 2 3 4 5 x majaca ˛ opcj˛e użycia funkcji sklejanych. Rozbudowane funkcje sklejane oferowane sa˛ przez bibliotek˛e Spline Toolbox. Przypadek prosty – splajn pierwszego stopnia. Funkcje sklejane pierwszego stopnia to interpolacja liniowa pomi˛edzy poszczególnymi w˛ezłami (reprezentacja Newtona): −y ) (y y (xi ≦ x ≦ xi+1 ) = Si (x) = yi + (xi+1 −xii ) (x − xi ) . i+1 (5.25) Oczywiście taka definicja zadania spełnia nast˛epujacy ˛ warunek: Si (xi+1 ) = Si+1 (xi+1 ) , (5.26) czyli punkt końca ostatniego splajnu jest poczatkiem ˛ splajnu nast˛epnego. Chociaż idea takiej interpolacji jest bardzo prosta, to jednak powszechnie si˛e ja˛ wykorzystuje w dwóch wymiarach, np. w grafice do tworzenia map odwzorowujacych ˛ wartości zmiennej ciagłej ˛ (np. wysokości czy wartości nat˛eżenia pola elektromagnetycznego w przestrzeni) za pomoca˛ koloru lub poziomu szarości. W taki sposób sa˛ kolorowane powierzchnie rysowane w Matlabie przez funkcj˛e surf(), wywołana˛ z opcja˛ shading interp. W przypadku takiej interpolacji okrag ˛ b˛edzie przedstawiony jako wielokat. ˛ 1 Program 5.8 implementuje interpolacj˛e “trudnej” funkcji y(x) = 1+x 2 metoda˛ splajnów pierwszego stopnia, czyli linii prostych. Uzyskany wynik jest pokazany na rysunku 5.9. Jak widać brak na nim oscylacji charakterystycznych dla metody Newtona (efekt Rungego). Listing 5.8: Przykład użycia splajnów pierwszeo i trzeciego stopnia % interp_spline.m clear all; close all; % Funkcja dokladnie - malymi kroczkami x = ( -5 : 0.01 : 5)’; y = 1 ./ (1+x.^2); % Wezly - zgrubnie - duze kroki xk = ( -5 : 1 : 5)’; yk = 1./(1+xk.^2); % Linear spline yi = interp1(xk,yk,x,’linear’); figure; plot(x,y,’r’,xk,yk,’ko’,x,yi,’b.’); xlabel(’x’); title(’y(x)’); grid; pause % Cubic spline yi = interp1(xk,yk,x,’cubic’); figure; plot(x,y,’r’,xk,yk,’ko’,x,yi,’b.’); xlabel(’x’); title(’y(x)’); grid; pause % Cubic spline ze Spline Toolbox cs = spline(x,[0; y; 0]); 5.5 Funkcje sklejane i gładka interpolacja lokalna 105 yi = ppval(cs,x); figure; plot(x,y,’r-’, xk,yk,’ko’, x,yi,’b.-’); xlabel(’x’); title(’y=f(x)’); grid; pause Problem 5.12 (* Własna implementacja interpolacji liniowej). Napisz własna˛ funkcj˛e do interplacji liniowej dowolnej liczby w˛ezłów danych, równo i nierównoodległych. Wywołaj ja˛ z programu 5.8 i porównaj otrzymane wyniki z wynikami otrzymanymi dla funkcji bibliotecznych Matlaba. Przypadek trudniejszy – splajn trzeciego stopnia (cubic spline). Ponieważ wielomian stopnia N − 1 jest definiowany jednoznacznie przez N równań, to kolejne równania na funkcje sklejane możemy uzyskać z narzucenia ciagłości ˛ pierwszej i drugiej pochodnej splajnów w punktach ich sklejenia. W ten sposób uzyskujemy wygładzenie przebiegu interpolujacego. ˛ Dla splajnu trzeciego stopnia w każdym z N − 1 przedziałów mi˛edzy sasiednimi ˛ w˛ezłami mamy: Si (x) = ai x3 + bi x2 + ci x + di , i = 1, 2, . . . , N − 1, (5.27) dlatego potrzebujemy 4(N − 1) różnych warunków. Podstawowy warunek interpolacji daje 2 równania dla każdego splajnu, łacznie ˛ 2(N − 1) równań: Si (xi ) = yi , i = 1, . . . , N − 1, (5.28) Si (xi+1 ) = yi+1 , i = 1, . . . , N − 1, (5.29) Dodatkowe 2(N − 2) warunki otrzymamy z przyrównania pierwszych i drugich pochodnych w połaczeniach ˛ splajnów: dSi (x) = 3ai x2 + 2bi x + ci , dx d 2 Si (x) S′′ i (x) = = 6ai x + 2bi , dx2 S′ i (x) = ′ Si′ (xi ) = Si−1 (xi ) , i = 2, 3, . . . , N, (5.30) ′′ Si′′ (xi ) = Si−1 (xi ) , i = 2, 3, . . . , N, (5.31) Brakujace ˛ 2 warunki możemy narzucić w różny sposób na w˛ezły brzegowe, uzyskujac ˛ różny efekt. Popularny wyborem jest przyj˛ecie warunku: ′′ (xN ) = 0. S1′′ (x1 ) = SN−1 (5.32) Inne metody to: 1) zapewnienie okresowości, 2) określonego nachylenia, badź ˛ 3) zakrzywienia. Układ powyższych 4(N − 1) równań tworzy macierz trójprzekatniow ˛ a,˛ która˛ można efektywnie rozwiazać ˛ metodami eliminacji, czego tu już nie przedstawiamy (zob. Bjorck, Dahlquist, str.131). 1 Na rysunku 5.10 pokazano wynik interpolacji funkcji “trudnej” y(x) = 1+x 2 funkcjami kubicznymi. Użyto programu 5.8. Zwróć uwag˛e na zdecydowanie bardziej gładszy wynik interpolacji niż dla interpolacji liniowej. W programie 5.8 do interpolacji kubicznej użyto standardowej funkcji Matlaba interp1(), wywołanej z opcja˛ cubic, oraz funkcji pochodzacych ze Spline Toolbox. W tym drugim przypadku funkcja spline() wylicza współczynniki wielomianów interpolujacych ˛ w strukturze cs (postać pp-value). Struktura ta jest nast˛epnie przekazywana do funkcji ppval, wyliczajacej ˛ wartości interpolowane. W programie zadano warunki brzegowe na splajny w postaci zerowego nachylenia (pochodnej). 106 Rysunek 5.10 Przykład in1 terpolacji funkcji y(x) = 1+x 2 funkcjami kubicznymi, czyli splajnami trzeciego stopnia. 5 Interpolacja i ekstrapolacja wielomianowa y(x) 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 -5 -4 -3 -2 -1 0 1 2 3 4 5 x Rysunek 5.11 Wynik interpolacji okr˛egu kubicznymi funkcjami sklejanymi. y=f(x) 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 -1 -0.5 0 0.5 1 Problem 5.13 ((L)* Testowanie interpolacji cubic spline). Sprawdź działanie interpolacji kubicznej w programie 5.8. Zmień liczb˛e i położenie w˛ezłów. Zmień interpolowana˛ funkcj˛e. Problem 5.14 (* Interpolacja okr˛egu splajnami trzeciego stopnia). Pobaw si˛e przez chwil˛e interpolacja˛ kubiczna˛ okr˛egu, zaimplementowana˛ w programie 5.9. Zwróć uwag˛e na o wiele lepsze wyniki niż uzyskiwane poprzednio - pokazano je na rysunku 5.11. Otrzymaliśmy go ponieważ narzuciliśmy dodatkowo warunki okresowości. Listing 5.9: Przykład interpolacji okr˛egu funkcjami sklejanymi z biblioteki Spline Toolbox % interp_splinecircle.m clear all; close all; % Interpolacja okregu funkcjami cubic spline t =[ 0; 1; 2; 3; 4]; x =[ 1; 0; -1; 0; 1]; y =[ 0; 1; 0; -1; 0]; td = 0 : 0.01 : 4; ppx = csape( t, x, ’periodic’); 5.5 Funkcje sklejane i gładka interpolacja lokalna 107 ppy = csape( t, y, ’periodic’); figure; plot( ppval(ppx,td), ppval(ppy,td), ’b.-’, cos(td*pi/2), sin(td*pi/2), ’r.-’); title(’y=f(x)’); grid; axis square; pause Problem 5.15 (*** Wyznaczenie współczynników lokalnych, kubicznych wielomianów interpolacji). Spróbuj zbudować układ równań dla interpolacji kubicznej i rozwiazać ˛ go. Sprawdź poprawność otrzymanego wyniku. B-splajny. W metodzie b-splajnów stosuje si˛e funkcje bazowe zamiast wielmianów przedziałowych. Funkcja interpolowana jest suma˛ poprzesuwanych i przeskalowanych funkcji bazowych. Przykład splajnów bazowych pierwszego stopnia jest przedstawiony na rysunku 5.12. Splajny w reprezentacji Lagrange’a to liniowa kombinacja (suma) splajnów bazowych. Rysunek 5.12 Przykład splajnów bazowych pierwszego stopnia. Ogólny przepis na splajny bazowe kolejnych stopni k jest nast˛epujacy: ˛ 1 for x j ≦ x < x j+1 0 otherwise x j+k+1 − x x−xj B j+1,k−1 (x) B j,k (x) = B j,k−1 (x) + x j+k − x j x j+k+1 − x j+1 B j,0 = (5.33) (5.34) (5.35) Szczególnym przypadkiem sa˛ kubiczne B-splajny dla w˛ezłów równoodległych, zdefiniowane nast˛epujaco ˛ (0 ≦ u < 1 to odległość od poczatkowego ˛ w˛ezła w podprzedziale): B j,3 (x) = (1 − u)3 /6 (3u3 − 6u2 + 4)/6 (−3u3 + 3u2 + 3u + 1)/6 u3 /6 1 ≦ (x − x j ) < 2 0 ≦ (x − x j ) < 1 − 1 ≦ (x − x j ) < 1 − 2 ≦ (x − x j ) < −1 (5.36) Dane sa˛ przedstawiane jako suma B-splajnów: N+1 y(x) = ∑ p( j)B j,3 (x), (5.37) j=0 gdzie p( j) to wagi (punkty kontrolne) do wyznaczenia, które sa,˛ niestety, różne od wartości y(x) w w˛ezłach. Interpretacja widmowa interpolacji B-splajnami i zbieżność do funkcji sinc() jest pokazana, m.in., w publikacjach M. Unsera. 108 5 Interpolacja i ekstrapolacja wielomianowa Problem 5.16 (** Kształt kubicznego B-splajny). Skorzystaj z wzoru (5.36). Oblicz i narysuj B-splajn kubiczny, zdefiniowany przez to równanie. 5.6 Wybrane przykłady interpolacji 5.6.1 Interpolacja 3D Interpolacja w trzech wymiarach to złożenie interpolacji dwuwymiarowych. Jej najprostsza˛ wersja˛ jest kopiowanie wartości od najbliższego sasiaduj ˛ acego ˛ w˛ezła – metoda nearest neighbor. Bardziej wyrafinowana jest metoda interpolacji biliniowej (dwu-liniowej): to iloczyn prostych interpolujacych ˛ wzdłuż kierunku x i y: z = f (x, y) = (ax x + bx )(ay y + by ). (5.38) Dla uproszczenia przyjmijmy w˛ezły równoodległe w rogach kwadratu (0,0), (1,0), (0,1) (1,1). Wtedy wartości interpolowane nad kwadratem argumentów można zapisać wzorem: z = f (x, y) = f (0, 0)(1 − x)(1 − y) + f (1, 0)x(1 − y) + f (0, 1)(1 − x)y + f (1, 1)xy. (5.39) Wynikowa powierzchnia nie jest w tym przypadku płaszczyzna.˛ Sprawdzimy to dla funkcji f (x, y), przyjmujacej nast˛epujace wartości: f (0, 0) = 0, f (1, 0) = 0, f (0, 1) = 0, f (1, 1) = 1. W tym celu użyjemy kodu Matlaba listingu 5.10. Wynik jest pokazany na rysunku 5.13. Listing 5.10: Program do sprawdzenia kształtu interpolacji biliniowej danych 3D % interp_3Dshape.m clear all; close all; [X,Y] = meshgrid(0 : 0.02 : 1); Z = X .* Y; surfl( Z ); xlabel(’x’); ylabel(’y’); zlabel(’z’); title(’z=f(x,y)’); colormap( gray ); Rysunek 5.13 Przykład powierzchni interpolujacej, ˛ uzyskiwanej z wzoru (5.39) - jak widać nie jest to płaszczyzna. 5.6 Wybrane przykłady interpolacji 109 Interpolacja 3D trzeciego stopnia i splajnowa ma podobna˛ konstrukcj˛e, czego jednak już nie pokażemy (popatrz np. hasło wyszukiwania bicubic interpolation). Problem 5.17 (** Przykład - interpolacja powierzchni na podstawie danych topograficznych). Z serwisu http://maps.google.com lub z http://www.gpsvisualizer.com możemy uzyskać dane topograficzne powierzchni Ziemi. W ten sposób pozyskano współrz˛edne geograficzne i wysokości punktów na siatce równomiernej w okolicach Babiej Góry koło Zawoi (plik babia_gora.dat). Skorzystajmy z programu 5.11. Przetwórzmy dane topograficzne, którymi dysponujemy, do postaci modelu powierzchni używajac ˛ narz˛edzi interpolacji 3D (nearest-neighbor, bilinear, bicubic, spline). Przykładowy wynik jest przedstawiony na rysunku 5.14. Która z metod daje najlepsze efekty? Według jakiego kryterium? Rysunek 5.14: Przykład interpolacji danych topograficznych - Babia Góra koło Zawoi. Listing 5.11: Przykład interpolacji danych 3D % interp_obiekt3D.m clear all; close all; %load(’X.mat’); load(’babia_gora.dat’); X=babia_gora; figure; grid; plot3( X(:,1), X(:,2), X(:,3), ’b.’ ); pause x = X(:,1); y = X(:,2); z = X(:,3); % pobranie x,y,z xvar = min(x) : (max(x)-min(x))/200 : max(x); % zmiennosc x yvar = min(y) : (max(y)-min(y))/200 : max(y); % zmiennosc y [Xi,Yi] = meshgrid( xvar, yvar ); out = griddata( x, y, z, Xi,Yi, ’cubic’ ); figure; surf( out ); pause % siatka interpolacji xi, yi % interp: nearest, linear, spline, cubic % rysunek 110 5 Interpolacja i ekstrapolacja wielomianowa Problem 5.18 (** Test metod interpolacji na standardowym obrazie testowym lena512.bmp). Tym razem nasze dane 3D to obraz Lena512.bmp. Współrz˛edne (x, y) opisuja˛ szerokość i wysokość obrazu, zaś z = f (x, y) to wartość koloru (moga˛ to być 3 wartości RGB lub jedna wartość w skali szarości). Nasz test b˛edzie polegał na obrocie obrazu o zadany kat ˛ przy niezmienionej g˛estości pikseli i na obserwacji efektów ubocznych poszczególnych metod interpolacji (nearest-neighbor, bilinear, bicubic, spline). Która z metod daje najlepsze efekty ? Według jakiego kryterium? Listing 5.12: Przykład interpolacji obrazu cyfrowego po jego rotacji o zadany kat ˛ % interp_image.m clear all; close all; img = imread(’Lena256.bmp’); figure; imshow(img); pause [M,N]=size(img); [X,Y]=meshgrid(1:M,1:N); [Xi,Yi]=meshgrid( M/2-20 : 0.025 : M/2+20, N/2-20 : 0.025 : N/2+20 ); img1 = uint8( interp2( X,Y,double(img),Xi,Yi,’nearest’) ); img2 = uint8( interp2( X,Y,double(img),Xi,Yi,’linear’) ); img3 = uint8( interp2( X,Y,double(img),Xi,Yi,’spline’) ); img4 = uint8( interp2( X,Y,double(img),Xi,Yi,’cubic’) ); figure; subplot(221); imshow( img1 ); title(’Nearest’); subplot(222); imshow( img2 ); title(’Linear’); subplot(223); imshow( img3 ); title(’Spline’); subplot(224); imshow( img4 ); title(’Cubic’); pause a = pi/6; % kat rotacji R = [ cos(a) -sin(a); sin(a) cos(a) ]; % macierz rotacji for m=1:M for n=1:N work = R*[X(m,n); Y(m,n)]; % rotacja wsp. (x,y) XR(m,n) = work(1,1); % podstawienie nowego x YR(m,n) = work(2,1); % podstawienie nowego y end end imgR = interp2( X,Y,double(img),XR,YR,’linear’); % interpolacja obroconego figure; subplot(111); imshow( uint8(imgR) ); pause % wynik [Xi,Yi]=meshgrid( 1 : 0.2 : M, 1 : 0.2 : N ); % zageszczenie punktow imgRi = interp2( X,Y,imgR,Xi,Yi,’linear’); % interpolacja - poprawa jakosci figure; imshow( uint8(imgRi) ); title(’Linear’); % wynik 5.6.2 Interpolacja sygnałów cyfrowych Cyfrowe przetwarzanie sygnałów (CPS) używa metod analogicznych do interpolacji podczas operacji tzw. prze-próbkowywania (re-sampling) wektorów danych, zwanych sygnałami. Podczas nad-próbkowywania danych problem polega na wyznaczaniu nowych wartości, leżacych ˛ pomi˛edzy znanymi wartościami. Jeśli argumentem jest czas, to operacja ta prowadzi do programowego zwi˛ekszenia cz˛estotliwości próbkowania obserwowanych zależności funkcyjnych, np. zmienności temperatury otoczenia w ciagu ˛ dnia (np. nie co godzina tylko co minuta). Ponieważ CPS operuje odpowiedziami impulsowymi, splotem i widmem sygnału, to sformułowanie interpolacji różni 5.7 Ekstrapolacja i inne nie omówione zaganienia 111 Rysunek 5.15: Graficzna ilustracja rekonstrukcji sygnałów analowych z ich próbek cyfrowych: (góra) funkcja interpolujaca typu sinc(x) = sin(x) x , (dół) proces rekonstrukcji wartości sygnału analogowego: przesuwanie funkcji sinc() o wielokrotność okresu próbkowania, mnożenie przez wartość konkretenej próbki cyfrowej, oznaczonej przez ’•’, oraz akumulowanie wyniku. si˛e od dotychczas przedstawionego. Można jednak wskazać analogie do interpolacji w sformułowaniu Lagrange’a i do B-splajnów. Kształtem bazowym w interpolacji DSP jest funkcja sinc(x) = sin(x) x , która widmowo reprezentuje przetwarzanie niezniekształcajace ˛ sygnału. Tak jak w interpolacji Lagrange’a wartość sygnału pomi˛edzy w˛ezłami to suma kształtów bazowych ważonych wartościami sygnałów w w˛ezłach: ∞ sin Tπ (t − nT ) x(t) = ∑ x(nT ) π . (5.40) n=−∞ T (t − nT ) Wartości w w˛ezłach zostaja˛ zachowane ponieważ, podobnie jak w wielomianach bazowych Lagrange’a, funkcja sinc() we wszystkich w˛ezłach poza bieżacym ˛ ma wartość 0, zaś w w˛eźle bieżacym ˛ ma wartość 1. W praktyce nieskończony zakres funkcji bazowej sinc() ogranicza si˛e do zakresu w˛ezłów o znaczacym ˛ oddziaływaniu. Problem 5.19 (** Interpolacja sinusoidy z użyciem funkcji sinc()). Wygeruj N = 100 punktów sinusoidy, majacej ˛ tylko 4 punkty na okres. Skorzystaj z wzoru (5.40) i interpoluj sinusoid˛e do 32 punktów na okres. 5.7 Ekstrapolacja i inne nie omówione zaganienia Wyznaczanie brakujacych ˛ wartości poza zakresem w˛ezłów jest z natury rzeczy obarczone wi˛ekszymi bł˛edami niż uzupełnianie wartości wewnatrz ˛ zakresu, z powodu braku obustronnego odniesienia dla tych wartości. Efekty, które wyst˛epuja˛ dla wielomianu wysokiego stopnia podczas wyjścia poza w˛ezły, sa˛ podobne do efektu Run- 112 5 Interpolacja i ekstrapolacja wielomianowa gego: duża zmienność, złe uwarunkowanie. Jednak ekstrapolacja w niewielkiej odległości od w˛ezła może dawać przydatne wartości. W uj˛eciu czasowym ekstrapolacja jest zadaniem przewidywania przyszłości na podstawie dotychczasowych zdarzeń. Przy powszechnych w naszej dziedzinie zakłóceniach danych, lepszym podejściem jest predykcja na podstawie aproksymacji, czyli określanie i przedłużanie trendu w danych, niż przewidywanie przyszłych wartości (predykcja) z użyciem interpolacji. Wiele interesujacych ˛ zagadnień nie zostało omówionych w tym rozdziale. M.in.: • oszacowanie bł˛edów interpolacji (do omówienia przy całkowaniu i aproksymacji), • interpolacja z w˛ezłami Czebyszewa (zbieżna z aproksymacja˛ – dlatego do omówienia w rozdziale 6), • interpolacja Hermite’a (uwzgl˛ednienia informacj˛e o pochodnej w w˛ezłach), • interpolacja wielowymiarowa (bardzo złożony opis, zob. Bjorck, Dahlquist, str. 131), • splajny wyższego stopnia (rzadko stosowane), B-splajny (bell shaped), • interpolacja trygonometryczna oraz funkcjami wymiernymi. 5.8 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. • Interpolacja to poszukiwanie krzywej parametrycznej przechodzacej ˛ przez zadane w˛ezły. • Klasyczna metoda interpolacji bazuje na wielomianach. • N w˛ezłów definiuje jednoznacznie wielomian stopnia N − 1. • Klasyczny wielomian interpolujacy ˛ można przedstawić w dwóch alternatywnych zapisach: – przyrostowym Newtona, – jako sum˛e funkcji bazowych Lagrange’a. • Dla w˛ezłów równoodległych uzyskujemy prostsze wyrażenia na współczynniki wielomianu. • Interpolacja z wieloma w˛ezłami charakteryzuje si˛e efektem Rungego, czyli niepożadanymi ˛ oscylacjami na krańcach przedziału. • Pomysł na gładsza˛ interpolacj˛e (bez oscylacji), to stosowanie wielomianów niskiego rz˛edu łaczonych ˛ w w˛ezłach w sposób gładki (funkcje sklejane, splajny). • Interpolacja w trzech wymiarach (i wi˛ecej) to złożenie interpolacji w dwóch wymiarach. • W cyfrowym przetwarzaniu sygnałów (DSP - Digital Signal Processing) stosuje podobne konstrukcje interpolujace ˛ do zwi˛ekszania liczby próbek sygnałów i obrazów (czyli do ich nadpróbkowywania), jednak stosowanym kształtem bazowym jest funkcja typu sin(x) x . Literatura 1. B. Author, Title. Publisher, City, Year. 2. C. Moler: “Interpolation”, in Numerical Computing with Matlab, on-line: https:// www. mathworks.com/ moler/ chapters.html.html Rozdział 6 Aproksymacja - rozwiazywanie ˛ nadokreślonych układów równań liniowych Streszczenie Przybliżone dopasowanie krzywej do przebiegu funkcji. Kryteria bł˛edu dopasowania: least-squares, least-moduli, min-max. Regresja liniowa jedno i wielowymiarowa. Aproksymacja najmniejszej sumy kwadratów z użyciem wielomianów ortogonalnych. Aproksymacja jednostajna (min-max) i wielomiany Czebyszewa. Aproksymacja Padégo funkcjami wymiernymi. Przykład: projektowanie filtrów cyfrowych metodami aproksymacji. 6.1 Wprowadzenie 6.1.1 Nadokreślone układy równań Ax=b W rozdziale 4.1.2 skrótowo przedstawiono zagadnienie rozwiazywania ˛ nadokreślonych układów równań liniowych postaci Ax = b, w których liczba równań może być o wiele wi˛eksza od liczby niewiadomych. Czyli macierz A jest macierza˛ prostokatn ˛ a˛ z duża˛ liczba˛ wierszy (równań) oraz mała˛ liczba˛ kolumn (niewiadomych), równa˛ wymiarowi wektora x. Rozwiazanie ˛ w takim przypadku jest zdefiniowane równaniem T −1 T T −1 T x= A A A b, gdzie A A A jest tzw. macierza˛ pseudo-odwrotna˛ do macierzy A. Rozwiazanie ˛ to jest wektorem, który jest najbardziej podobny do wektora b w sensie minimalizacji sumy kwadratów różnic pomi˛edzy odpowiadajacymi ˛ sobie elementami obu wektorów (kryterium least-squares LS) - patrz równanie (4.16). Czyli, inaczej mówiac, ˛ dobrze aproksymuje/przybliża ten wektor. Ponieważ konkretne przykłady zadań aproksymacji, dyskutowane w tym rozdziale, sprowadza˛ si˛e w zapise matematycznym do nadokreślonego układu równań liniowych, umiej˛etność jego rozwiazywania ˛ ma dla nas kluczowe znaczenie. Najprosztszym przykładem ilustrujacym ˛ to zagadnienie jest dopasowanie linii prostej y = ax +b do zbioru wielu punktów (xi , yi ), i = 1, 2, ..., N - patrz rys. 5.1 po prawej stronie. W tym przypadku równanie, które należy rozwiazać, ˛ ma nast˛epujac ˛ a˛ postać (patrz równanie (4.6)): A·x = b → 1 y1 y2 1 a .. b = .. . |{z} . xN 1 yN x | {z } | {z } x1 x2 .. . A → −1 T x = AT A A b. (6.1) b Problem 6.1 (* Rozwiazywanie ˛ intuicyjne/definicyjne nadokreślonego układu równań). Spróbuj rozwiazać ˛ jakiś prosty, nadmiarowy układ równań, krzystajac ˛ ze wzoru (6.1) - po prawej stronie. 113 114 6 Aproksymacja - rozwiazywanie ˛ nadokreślonych układów równań liniowych 6.1.2 Rozwiazywanie ˛ nadokreślonych układów równań Podstawowym problemem obliczeniowym implementacji prawej strony równania (6.1) jest konieczność odwracania kwadratowej, symetrycznej macierzy AT A. Poniżej przedstawiono rozwiazanie ˛ mniej kłopotliwe. Dla równania nadokreślonego Ax = b, gdzie macierz A ma M wierszy (kolejne pomiary) i N kolumn (niewiadome, parametry), rozwiazanie ˛ ma minimalizować kryterium sumy kwadratów odchyłek (∥v∥ - norma wektora v, czyli pierwiastek z sumy kwadratów tego elementów): ε = (b − Ax)T (b − Ax) = ∥b − Ax∥2 . (6.2) Macierz rozszerzona˛ [A b] możemy przedstawić w postaci QR jako iloczyn macierzy ortogonalnej Q (M × M) i trójkanej ˛ górnej R (M × N): [A b] = QR. (6.3) Ponieważ transformacja ortonormalna nie zmienia odległości, to minimalizowane kryterium możemy zapisać w równoważnej postaci: ε = QT (b − Ax) 2 . (6.4) Rozdzielmy teraz macierz R w (6.3) na cz˛eści (podmacierze) zwiazane ˛ z A i b: R1 r2 (6.5) R = 01×N r3 , 0(M−N)×N 0 gdzie: • • • • • • R1 – macierz trójkatna ˛ górna o wymiarach N × N, r2 – wektor kolumnowy N × 1, r3 - skalar, 01×N – zerowy wektor poziomy, 0(M−N)×N – macierz zerowa, 0 - pojedyncza wartość zerowa. Dzi˛eki temu kryterium na minimalizowany bład (6.4) możemy zapisać w nast˛epujacej ˛ postaci: 2 ε = QT (b − Ax) = 2 r2 R Q − 1 = |r2 − R1 x|2 + |r3 |2 r3 0 (6.6) Pierwszy składnik, wyst˛epujacy ˛ na końcu równania (6.6), zeruje si˛e kiedy: R1 x = r2 , (6.7) natomiast drugi składnik (skalar) to suma kwadratów reszt dopasowania. Równanie liniowe (6.7) jest dobrze określone. Rozwiazujemy ˛ go ze wzgl˛edu na x przez podstawienie wstecz. Cały algorytm jest dobrze uwarunkowany, ponieważ nie używamy w rozwiazaniu ˛ kwadratu macierzy. Nie jest także istotna macierz Q. Problem 6.2 (* Rozwiazywanie ˛ efektywne nadokreślonego układu równań). Spróbuj rozwiazać ˛ jakiś prosty, nadmiarowy układ równań, krzystajac ˛ z dekompozycji QR i wyprowadzonej powyżej zależności (6.7) . 6.1 Wprowadzenie 115 6.1.3 Scenariusze aproksymacji Aproksymacja to bardzo ważna operacja w badaniach eksperymentalnych, majaca ˛ na celu lepsze zrozumienie natury zachodzacych ˛ i obserwowanych zjawisk. Najcz˛eściej dane wejściowe x sa˛ znane dokładnie (chociaż niekoniecznie, np. z powodu wyst˛epowania bł˛edu wzorcowania czasu), a dane wyjściowe y sa˛ zaburzone z powodu swojej natury losowej/statystycznej lub wyst˛epujacego ˛ zakłócenia pomiarowego. Może być ono spowodowane np. przez szumy cieplne układów elektronicznych, zwłaszcza wzmacniaczy. Możemy rozróżnić dwa rodzaje zadań aproksymacji: 1. dopasowanie funkcji do danych, 2. przybliżenie przebiegu funkcji skomplikowanej obliczeniowo za pomoca˛ funcji prostszej. 6.1.4 Dopasowania funkcji do danych eksperymentalnych Dopasowania funkcji do danych ma na celu znalezienie sparametryzowanej zależności y = f (x), opisujacej ˛ “najlepiej” zwiazek ˛ pomi˛edzy danymi wejściowymi x i wyjściowymi y (patrz rys. 6.1). Rozwiazanie ˛ polega na wyborze równania szukanej funkcji (np. zależność liniowa albo nieliniowa, w szczególności kwadratowa) i jej parametrów (np. współczynniki prostej, paraboli, hiperbli, ...). Należy także określić co rozumiemy przez “najlepsze” dopasowanie i zdefiniować miar˛e jego jakości, czyli tzw. kryterium bł˛edu dopasowania zwanego także funkcja˛ kosztu (cost function). Rysunek 6.1 Ilustracja graficzna zadania aproksymacji/przybliżenia zbioru par punktów eksperymentalnych (xi , yi ) (kółka) za pomoca˛ zaleźności funkcyjnej y = f (x), czyli sparametryzowanej krzywej (niebieska linia). Czerwony punkt zostaje odrzucony jako bł˛edny. Oznaczmy przez εi lokalny bład ˛ dopasowania funkcji aproksymujacej ˛ y = f (x) w i-tym punkcie (xi , yi ): εi = yi − f (xi ), i = 1, 2, ..., N. (6.8) Wykorzystywane sa˛ nast˛epujace ˛ miary jakości dopasowania funkcji do danych: • least-squares - najmniejsza suma kwadratów wszystkich pojedynczych błedów punktowych: N εLS = ∑ εi 2 , (6.9) i=1 • least-moduli - najmniejsza suma wartości bezwzgl˛ednych wszyskich pojedynczych bł˛edów punktowych: N εLM = ∑ |εi |, i=1 (6.10) 116 6 Aproksymacja - rozwiazywanie ˛ nadokreślonych układów równań liniowych • minimax (min z max) - minimalizowanie maksymalnej wartości bł˛edu punktowego: εMinMax = min(max({εi , i = 1...N})). (6.11) Oczywiście przyj˛ete kryterium ma wpływ na otrzymane rozwiazanie ˛ i jego wrażliwość na “odstajace”, ˛ niepasujace ˛ dane (tzw. outliers), oznaczone kolorem czerwonym na rysunku 6.1. 6.1.5 Przybliżenie przebiegu funkcji prostsza˛ funkcja˛ W tym przypadku chcemy przybliżyć skomplikowana˛ zależność matematyczna˛ za pomoca˛ zależności prostszej. W sformułowaniu bliskim interpolacji funkcja aproksymujaca ˛ powinna być równa funkcji aproksymowanej w zadanych w˛ezłach, a poza w˛ezłami aproksymacja ma być dobrym przybliżeniem funkcji aproksymowanej według wybranego kryterium. Celem takiego post˛epowania jest zastapienie ˛ czasochłonnej obliczeniowo funkcji jej dobrym i szybko obliczanym przybliżeniem (np. wielomianem lub ilorazem wielomianów). Jest to powszechna praktyka w kalkulatorach (np. funkcja sinus) oraz w bibliotekach i środowiskach numerycznych (np. funkcja erf w Matlabie: napisz help erf). Kiedy jest wymagane równomierne rozłożonie bł˛edu przybliżenia i ograniczenie bł˛edu maksymalnego, to jest stosowane kryterium min-max: minimum of maximum. 6.1.6 Przykłady zastosowań aproksymacji Poniżej zostały wymienione przykładowe zastosowania aproksymacji. • Redukcja opisu danych, np. tabela wartości jest zast˛epowana kilkoma współczynnikami funkcji aproksymujacej. ˛ Jest to cz˛esto stosowane w standardach. • Odszumianie danych – konieczne jest przyj˛ecie założenia o postaci funkcji aproksymujacej ˛ oraz dopasowanie wartości jej parametrów do danych eksperymentalnych (np. dopasowanie amplitudy, fazy i cz˛estotliwości sygnału sinusoidalnego do napi˛ecia sieciowego spróbkowanego przez przetwornik analogowo-cyfrowy (AC)). • Regresja liniowa i nieliniowa – wyznaczanie zależności wia˛żacych ˛ dane (np. wejściowe i wyjściowe z jakiegoś obiektu pomiarowego). Przykładowo, określanie zależności mi˛edzy średnia˛ temperatura˛ otoczenia, a średnim zużyciem gazu, potrzebnym do ogrzania domu. • Identyfikacja obiektów dynamicznych metoda˛ dopasowania funkcji aproksymujacej ˛ do odpowiedzi czasowych lub cz˛estotliwościowych tych obiektów (nonlinear parameter estimation). Przykładowo, określanie parametrów mechanicznych i elektrycznych silnika pradu ˛ stałego na podstawie zarejestrowanych sygnałów napi˛ecia, pradu ˛ i pr˛edkości obrotowej podczas rozruchu. • Szybkie obliczenia trudnych funkcji, np. całki nieanalityczne, funkcje trygonometryczne. 6.2 Regresja liniowa - estymator LS sumy najmniejszych kwadratów 117 6.2 Regresja liniowa - estymator LS sumy najmniejszych kwadratów Regresja liniowa to liniowa zależność jednej zmiennej, np. y, od innej zmiennej, np. x, (przypadek jednowymiarowy): y = f (x) = ax + b (6.12) albo jednego zbioru zmiennych, np. {yi }, od innego zbioru zmiennych, np. {xi } (przypadek wielowymiarowy): N yi = f (x1 , x2 , ..., xN ) = ∑ ai, j x j , i = 1...M. (6.13) j=1 Jak widać w powyższych równaniach liniowa zależność jest rozumiana jako przedstawienie jednej zmiennej, u nas yi , jako sumy ważonej innych zmiennych, u nas x j , j = 1, 1, ..., M. W regresji liniowej poszukujemy wartości wag ai, j , określajacych ˛ jak bardzo wartość zmiennej wejściowej x j wpływa na wartość zmiennej wyjściowej yi . 6.2.1 Regresja jednowymiarowa Liniowa regresja jednowymiarowa to dopasowanie prostej do zbioru punktów (xi , yi ), i = 1, 2, ..., N według kryterium najmniejszej sumy kwadratów odchyłek we wszystkich punktach - patrz rysunek 6.2. Rysunek 6.2 Ilustracja graficzna zadania regresji liniowej: przybliżenia zbioru par punktów eksperymentalnych (xi , yi ) (kółka) za pomoca˛ linii prostej y = ax + b. Dla zadanych par wartości (xi , yi ), i = 1, 2, ..., N, poszukujemy przybliżonej zależności pomi˛edzy nimi postaci (6.12): yi = ybi + εi , ybi = f (xi ) = axi + b, (6.14) gdzie • a i b sa˛ parametrami przyj˛etego, liniowego modelu matematycznego y = f (x) = ax + b, • ybi = f (xi ) oznacza estymat˛e wartości yi , wyznaczona˛ na podstawie modelu, która jest (niestety!) obarczona bł˛edem εi , • εi = yi − ybi to bład ˛ modelu, czyli odchyłka wartości ybi , pochodzacej ˛ z modelu, od wartości yi , otrzymanej z eksperymentu. Przyjmijmy, że wartości parametrów powinny być tak dobrane, aby minimalizować sum˛e kwadratów odchyłek: 118 6 Aproksymacja - rozwiazywanie ˛ nadokreślonych układów równań liniowych N N N i=1 i=1 i=1 J = ∑ εi2 = ∑ (yi − ybi )2 = ∑ (yi − axi − b)2 = J(a, b). (6.15) Wartości parametrów a i b, dla których jest to osiagni˛ ˛ ete, otrzymamy obliczajac ˛ pochodne czastkowe ˛ funkcji kryterialnej typu najmniejsza suma kwadratów (LS - least squares) (6.15) wzgl˛edem jej parametrów i przyrównujac ˛ je do zera ∂∂ aJ = 0, ∂∂ bJ = 0: ȳ = ax̄ + b , (6.16) xy = bx̄ + ax2 gdzie: x̄ = 1 N ∑ xi , N i=1 xy = 1 N ∑ xi yi N i=1 ȳ = 1 N ∑ yi , N i=1 x2 = 1 N 2 ∑ xi . N i=1 Warunek na minimum, czyli dodatnia określoność macierzy drugich pochodnych, jest spełniony (do samodzielnego sprawdzenia). Rozwiazuj ˛ ac ˛ powyższy układ równań ze wzgl˛edu na poszukiwane (estymowane) parametry otrzymujemy: a= xy − x̄ ȳ x2 − x̄2 , b = ȳ − ax̄. (6.17) W tym miejscu możemy zainteresować si˛e kształtem kryterium J(a, b) w funkcji parametrów a i b oraz unikalnościa˛ jej minimum. Program Matlaba, implementujacy ˛ aproksymacj˛e liniowa˛ zbioru danych {x, y}, jest przedstawiony na listing 6.1. Przykład - trend zmian Regresja liniowa jest cz˛esto używana do ilustrowania trendów zmian w obserwowanych zjawiskach. Kluczem do czytelnego przedstawienia trendu jest wybór takiej cechy zjawiska, która uwypukla zmiany. Wymienić tutaj można wyznaczanie trendów zmian giełdowych oraz trendu rosnacej ˛ złożoności układów elektronicznych (według prawa Moore’a liczba tranzystorów w układach elektronicznych podwaja si˛e co 18 miesi˛ecy). Przykład - głośność muzyki Wraz z przejściem na cyfrowy zapis dźwi˛eku (lata 80te XX wieku) studia nagraniowe zacz˛eły stosować metody cyfrowego przetwarzania sygnałów (DSP - Digital Signal Processing) do produkcji muzyki i powszechne stało si˛e poprawianie oryginalnego brzmienia utworów. Słyszalna jakościowa zmiana na przestrzeni ostatnich lat to zmniejszanie zakresu dynamiki dźwi˛eku (zróżnicowanie na dźwi˛eki ciche i głośne) poprzez nieliniowe „upakowanie” dźwi˛eków w górnych granicach zakresu (nazywane kompresja˛ dynamiki, prosz˛e nie mylić z kompresja˛ audio typu MP3 lub AAC). Na rysunku 6.3 przedstawiono jak to zjawisko, nazywane loudness war, przebiegało w czasie w przypadku zespołu Metallica. Cecha˛ prezentowana˛ jest PAR (Peak to Average Ratio, czyli wartość maksymalna do średniej wyprostowanej) dla utworów z kolejnych płyt. Jeśli ona maleje to znaczy, że średni poziom dźwi˛eku staje si˛e coraz bliższy do dźwi˛eków najgłośniejszych. Jeszcze wyraźniej widać to zjawisko dla tych samych utworów pochodzacych ˛ z kolejnych edycji po tzw. remasteringu. 6.2 Regresja liniowa - estymator LS sumy najmniejszych kwadratów 119 Rysunek 6.3: Zmiana współczynnika PAR (peak-to-averare-ratio) dla utworów z kolejnych płyt zespołu Metallica. Listing 6.1: Program do liniowej aproksymacji zależności y % approx_line.m % Regresja liniowa: y = a*x + b clear all; close all; % W wyniku pomiaru otrzymano nastepujace liczby ( x = numer pomiaru, y = wartosc ) x=[1 2 3 4 5 6 7 8 9 10 ]; y = [ 0.912 0.945 0.978 0.997 1.013 1.035 1.057 1.062 1.082 1.097 ]; figure; plot( x, y, ’b*’ ); title(’y=f(x)’); grid; pause % Aproksymacja linia prosta: y = a * x + b if(0) % OGOLNIE - rozwiazanie rownania macierzowego xt = x’; yt = y’; N = length( xt ); % X * ab X = [ xt, ones(N,1) ]; % y(n) = a*x(n) + b = | x(1) 1 | * | a | ab = X \ yt; % y(1) = a*x(1) + b = | x(2) 1 | | b | a = ab(1), b = ab(2), % y(2) = a*x(2) + b = | x(3) 1 | else % W TYM PRZYPADKU - na podstawie wyprowadzonych wzorow xm = mean( x ); % srednia wartosc wektora x ym = mean( y ); % srednia wartosc wektora y xr = x - xm; % wektor x - srednia x (od kazdego elementu) yr = y - ym; % wektor y - srednia y (od kazdego elementu) a = (xr * yr’) / (xr * xr’) % obliczenie wsp a prostej, to samo % inaczej: a = sum( xr .* yr ) / sum( xr .* xr ) b = ym - a * xm % obliczenie wsp b prostej end figure; plot( x, y, ’b*’, x, a*x+b, ’k-’ ); title(’y=f(x)’); grid; pause % Takze wielomiany wyzszych rzedow % p = polyfit( x, y, 1 ), % a=p(1), b=p(2) % figure; plot( x, y, ’b*’, x, polyval(p,x), ’r-’ ); title(’y=f(x)’); grid; pause Problem 6.3 ((L)* Aproksymacja liniowa). Zapoznaj si˛e z programem (6.1). Sprawdź czy poprawnie on implementuje wzory: ogólniejszy (6.1) oraz bardziej szczegółowy (6.17). Zmień wartość liczby punktów N na mniejsza˛ (2 ≦ N ≦ 10). Zmień wartość jednego punktu na bardzo odstajac ˛ a˛ od pozostałych. Oblicz współczynniki prostej z użyciem funkcji Matlaba p=polyfit(x,y,1). Czy otrzymany 120 6 Aproksymacja - rozwiazywanie ˛ nadokreślonych układów równań liniowych wynik jest taki sam jak poprzednio? Zmień w funkcji polyfit() rzad ˛ wielomianu na wyższy (1 → 2, 3, 4). Jakie wartości przyjmuja˛ współczynniki przy wyższych pot˛egach x? 6.2.2 Regresja wielowymiarowa W tym przypadku poszukujemy przybliżonej zależności liniowej mi˛edzy M zmiennymi wejściowymi x(m) , m = 1, 2, ..., M, i pojedyncza˛ zmienna˛ wyjściowa˛ y: ŷ = a0 + a1 x(1) + a2 x(2) + ... + aM x(M) . (6.18) Przeprowadzamy N pomiarów wszystkich zmiennych (n = 1, 2, ..., N) oraz tworzymy układ N równań postaci (6.18) z M niewiadomymi am , m = 0, 1, 2, ..., M. W wyniku tego w zapisie macierzomym otrzymujemy: 1 y1 y2 1 .. = . ... yN 1 (1) (M) x1 · · · x1 ε1 a0 (1) (M) a x2 · · · x2 1 ε2 .. + .. , .. .. · . . . . (1) (M) εN aM x ··· x N y = Xa + ε = ybn + ε, (6.19) N gdzie: • yn - zmierzona n-ta wartość zmiennej wyjściowej y, (m) • xn - zmierzona n-ta wartość m-tej zmiennej wejściowej x(m) , • εn - wartość odchyłki pomi˛edzy zmierzona˛ n-ta˛ wartoscia˛ wyjściowa˛ yn a jej prognoza˛ ybn , wynikajac ˛ a˛ z modelu (6.18), spowodowana zakłóceniami. Równania macierzowego Xa = y nie można rozwiazać ˛ w zwykłym sensie, ponieważ jest ono sprzeczne i nadokreślone. Możemy natomiast podać rozwiazanie ˛ spełniajace ˛ wszystkie równania z małym łacznym ˛ bł˛edem. W tym miejscu, w celu kompletności wywodu, powtórzymy krótkie wyprowadzenie, które już zostało zrobione w rozdziale 4.1.2 - patrz równania (4.16)-(4.18). Załóżmy, że chcemy minimalizować sum˛e kwadratów wszystkich odchyłek: N J= ∑ εn2 = ε T ε = (y − Xa)T ·(y − Xa) = yT y−2aT XT y+aT XT Xa = J(a). (6.20) n=1 Różniczkujac ˛ J(a) wzgl˛edem wektora a i przyrównujac ˛ wynik do zera, otrzymujemy nast˛epujacy ˛ warunek na minimum funkcji kwadratowej: ∂J = −2XT y + 2XT Xa = 0. (6.21) ∂a Po prostych przekształceniach dochodzimy do równania normalnego i jego rozwiaza˛ nia: T X X a = XT y → −1 T a = XT X X y. (6.22) Jak widać otrzymaliśmy znany z literatury wzór (4.18) na rozwiazanie ˛ nadokreślonego układu równań liniowych, minimalizujace ˛ bład ˛ LS zdefiniowany równaniem (6.20). 6.2 Regresja liniowa - estymator LS sumy najmniejszych kwadratów 121 Zadajmy sobie na koniec pytanie jaka˛ krzywa˛ jest opisana funkcja J(a) i czy jej znalezione minimum jest unikalne/globalne? Przykład - identyfikacja odpowiedzi impulsowej kanału audio. Powróćmy raz jeszcze do problemu identyfikacji/wyznaczenia współczynników odpowiedzi impulsowej kanału transmisji z użyciem wejściowego sygnału pseudo-losowego PRBS przypomnijmy sobie równania (3.11)(3.12): x(n) to liczby wejściowe do kanału, np. sygnał PRBS, w(n) (teraz oznaczone przez h(n)) to współczynniki wagowe kanału, zaś y(n) = ∑M k=0 h(k)x(n − k) to liczby wyjście z kanału, w zapisie macierzomym y = Xh. Tym razem przeprowadzimy identyfikacj˛e odpowiedzi impulsowej toru przykładowej karty dźwi˛ekowej SoundBlaster w naszym komputerze z analogowym po −1 T łaczeniem ˛ zwrotnym kablem typu jack-jack: h = XT X X y. Listing 6.2 zawiera przykładowy program, a rysunek 6.4 - otrzymane wyniki. Rysunek 6.4 Indentyfikacja (estymacja) wag toru transmisji dźwi˛ekowej (odpowiedzi impulsowej karty SoundBlastera) w przypadku wyst˛epowania szumu (stosunek sygnału do szumu SNR równy 20 decybeli). Zadane i obliczone h(n) 0.2 0.1 0 -0.1 -0.2 -0.3 -0.4 -0.5 0 10 20 30 40 Listing 6.2: Program do obliczania odpowiedzi impulsowej toru transmisji dźwi˛ekowej karty SoundBlaster komputera % approx_channel.m % Estymacja odpowiedzi impulsowej kanalu transmisji, u nas karty dzwiekowej clear all; close all; h = [3; -2; 1 ]; % symulowana odpowiedz impulsowa kanalu %load h.dat % rzeczywista odpowiedz impulsowa kanalu L = length(h); % liczba wag figure; stem(h,’filled’); title(’h(n)’); grid; pause prbs = 2*round( rand(7*L,1) )-1; % pobudzenie kanalu %prbs=[-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1]’; % krotkie %prbs=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]’; % test dla X x = [ prbs ]; N = length(x); r = x(L:-1:1); c = x(L:N); X = toeplitz(c,r), pause % pierwszy wiersz % pierwsza kolumna % macierz pobudzenia o strukturze Toeplitza y = X*h; % wynik przejscia pobudzenia przez uklad h(n) SNR=120; y = awgn(y,SNR); % dodanie szumu, tak aby otrzymac zadany SNR %he = pinv(X)*y; % czyli inv(X’*X) * X’*y = Rxx * rxy he = X \ y; % to samo zoptymalizowane obliczeniowo plot(1:L,h,’ro’,1:L,he,’bx’); title(’Zadane i obliczone h(n)’); grid; pause 122 6 Aproksymacja - rozwiazywanie ˛ nadokreślonych układów równań liniowych Problem 6.4 ((L)* Identyfikacja kanału transmisji - obliczanie odpowiedzi impulsowej kanału). Zapoznaj si˛e z programem (6.2) i sprawdź poprawność jego działania: czy wartości współczynników kanału h sa˛ poprawnie znajdowane? Wybierz symulowana,˛ krótka,˛ 3-punktowa˛ odpowiedź impulsowa˛ kanału dźwi˛ekowego albo wczytaj dłuższa,˛ już obliczona˛ rzeczywista.˛ Zmieniaj poziom szumu (z użyciem funkcji awgn() oraz dla każdego z nich dobierz długość sygnału pobudzenia, zapewniajac ˛ a˛ mały bład estymacji. Przykład - korekcja zniekształceń kamery cyfrowej Zniekształcenia geometryczne sa˛ wprowadzane przez wszystkie obiektywy szerokokatne ˛ niezależnie od ich ceny, w szczególności cz˛esto stosowane, tanie kamery internetowe lub endoskopowe (przemysłowe, medyczne). Zniekształcenia te sa˛ konsekwencja˛ rzutowania świata 3D na przestrzeń (płaszczyzn˛e) 2D. Typowym zjawiskiem jest dla tych kamer tzw. “efekt rybiego oka”, czyli duże zniekształcenia radialne obrazu. W celu ich korekcji należy wyznaczyć wartości parametrów modelu deformacji obrazu: po pierwsze, położenia punktu centralnego (środka zniekształceń), który może być różny od geometrycznego środka obrazu, oraz po drugie, funkcji zmienności promienia wzgl˛edem punktu centralnego w obrazie zniekształconym w porównaniu do obrazu bez zniekształceń: N−1 rz = ∑ an r n . (6.23) n=0 gdzie rz (r) i r oznaczaja˛ odpowiednio promienie w obrazie ze zniekształceniami i bez nich. Przykładowo dla N = 3 i a = 0, 1, 0 mamy rz (r) = r, czyli obraz nie jest przez kamer˛e deformowany. Wniosek: w obrazie zniekształconym piksele sa˛ położone w innych odległościach od punktu centralnego niż odpowiadajace ˛ im piksele w obrazie bez zniekształceń. Idea metody korekcji zniekształceń geometrycznych polega na zarejestrowaniu kamera˛ obrazu kontrolnego, złożonego z linii prostych lub zbioru punktów ułożonych w szachownic˛e. Nast˛epnie wyznacza si˛e punkt centralny zniekształceń, zakłada rzad ˛ wielomianu (6.23), , “zbiera” odpowiadajace ˛ sobie punkty w obu obrazach i tworzy pary promieni (r, rz (k)), a na końcu wyznacza si˛e optymalne wartości współczynników wielomianu (6.23) w sensie minimalizacji bł˛edu średniokwadratowego odchylenia punktów w zniekształconym obrazie od linii prostych. Nast˛epnie ‘odwraca si˛e” zależność (6.23), czyli wyraża r w funkcji rz , oraz przeprowadza korekt˛e dowolnego obrazu uzyskanego z testowanej kamery. Wynik takiej operacji jest pokazany na rysunku 6.5. 6.2 Regresja liniowa - estymator LS sumy najmniejszych kwadratów Wejscie - efekt rybie oko 123 Wyjscie - po korekcie Rysunek 6.5: Obraz z efektem “rybiego oka” oraz obraz skorygowany, dzi˛eki znalezieniu współczynników wielomianu deformujacego ˛ rz = f (r) (6.23) i jego odwrotności r = f −1 (rz ). Problem 6.5 (** Korekcja zniekształceń beczkowych szerokokatnej ˛ kamery cyfrowej). Przeanalizujmy program z listingu 6.3, korygujacy ˛ zniekształcenia beczkowe zdj˛eć z aparatu zrobionych w trybie makro. Na rysunku 6.5 jest pokazany obraz sztucznie zdeformowany w programie oraz skorygowany. Zmodyfikuj program tak, aby automatyczne znajdował on środek deformacji (w programie cx, cy) oraz odpowiadajace ˛ sobie pary punktów, przeci˛ecia linii, na obrazie oryginalnym i zdeformowanym. Pami˛etaj: punkty przeci˛ecia linii stanowia˛ siatk˛e odniesienia wzgl˛edem obrazu niezniekształconego. Listing 6.3: Program do korekcji zniekształceń beczkowych na zdj˛eciach z szerokokatnego ˛ aparatu fotograficznego % approx_krata.m close all; clear all; % Generacja/wczyranie obrazka N = 512; Nstep = 32; [img, cmap] = imread(’Lena512.bmp’); img = double(img); % Lena %img = zeros(N,N); % czarny kwadrat if(0) % opcjonalna biala siatka for i=Nstep:Nstep:N-Nstep, img(i-1:i+1,1:N) = 255*ones(3,N); end for j=Nstep:Nstep:N-Nstep, img(1:N,j-1:j+1) = 255*ones(N,3); end end imshow( img, cmap ); pause % Dodawanie znieksztalcen beczkowych a = [ 1.06, -0.0002, 0.000005 ]; % wspolczynniki wielomianu znieksztalcen x=1:N; y=1:N; cx = N/2+0.5; cy = N/2+0.5; [X,Y] = meshgrid( x, y ); % wszystkie x,y r = sqrt( (X-cx).^2 + (Y-cy).^2 ); % wszystkie odleglosci od srodka R = a(1)*r.^1 + a(2)*r.^2 + a(3)*r.^3; % zmiana odleglosci od srodka Rn = R ./ r; % normowanie imgR = interp2( img, (X-cx).*Rn+cx, (Y-cy).*Rn+cy ); % interploacja figure; subplot(1,2,1),imshow(img,cmap); title(’Oryginal’); subplot(1,2,2),imshow(imgR, cmap); title(’Rybie oko’); pause 124 6 Aproksymacja - rozwiazywanie ˛ nadokreślonych układów równań liniowych % Estymacja znieksztalcen beczkowych i = Nstep : Nstep : N-Nstep; j=i; % polozenie linii w pionie i poziomie [I,J] = meshgrid( i, j ); % wszystkie (x,y) punktow przeciec r = sqrt( (I-cx).^2 + (J-cy).^2 ); % wszystkie promienie od srodka R = a(1)*r + a(2)*r.^2 + a(3)*r.^3; % odpowiadajace punkty obrazu znieksztalconego r = sort( r(:) ); % sortowanie R = sort( R(:) ); % sortowanie aest1 = pinv([ r.^1, r.^2, r.^3 ])*R; aest1 = [ aest1(end:-1:1); 0]; % rozw.1 aest2 = polyfit( r, R, 3)’; % rozw.2 [ aest1, aest2 ], pause % porownanie aest = aest1; % wybor rozwiazania % Wielomian R=f(r) i odwrotny r=g(R) r = 0:N/2; % wybrane promienie R = polyval( aest, r); % R=f(r) wielomianu znieksztalcen figure; subplot(121); plot(r,R), title(’R=f(r)’); ainv = polyfit( R, r, 3), % wspolczynniki wielomiany odwrotnego subplot(122); plot(R,r), title(’r=g(R)’); pause % Korekta znieksztalcen beczkowych [X,Y] = meshgrid( x, y ); % wszystkie punkty (x,y) znieksztalconego R = sqrt( (X-cx).^2 + (Y-cy).^2 ); % wszystkie zle promienie Rr = polyval( ainv, R ); % wszystkie dobre promienie Rn = Rr./R; % normowanie imgRR=interp2( imgR, (X-cx).*Rn+cx, (Y-cy).*Rn+cy ); % interpolacja figure; subplot(1,2,1),imshow(imgR,cmap); title(’Wejscie - efekt rybie oko’); subplot(1,2,2),imshow(imgRR,cmap); title(’Wyjscie - po korekcie’); colormap gray pause 6.3 Aproksymacja z użyciem wielomianów ortogonalnych Idea. Zastosowanie estymatora LS wykracza poza regresj˛e liniowa.˛ Poszczególne kolumny macierzy X w równaniu (6.19) moga˛ być interpretowane jako pionowe wektory bazowe x(m) = b(m) , m = 0...M, które po pomnożeniu przez współczynniki skalujace ˛ am i zsumowaniu daja˛ najlepsze przybliżenie (aproksymacj˛e) jakiegoś analizowanego (dekomponowanego) wektora y = w w sensie minimalej sumy kwadratów odchyłek: M y= ∑ am · x(m) + ε m=0 M ↔ w= ∑ am · b(m) + ε (6.24) m=0 gdzie ε jest wektorem odchyłek przybliżenia. Dla przykładu zapiszmy problem aproksymacji każdej wartości wyjściowej yn wielomianem M-tego stopnia zmiennej wejściowej xn (n = 1, 2, ..., N): M yn = a0 + a1 xn1 + a2 xn2 + ... + aM xnM + εn = a0 + ∑ am xnm + εn . (6.25) m=1 Wówczas równanie (6.25) zapisane dla wszystkich wartości n przyjmuje nast˛epujac ˛ a˛ postać macierzowa: ˛ 6.3 Aproksymacja z użyciem wielomianów ortogonalnych 1 y1 y2 1 .. = .. . . yN x1 · · · x1M a0 ε1 a1 ε2 x2 · · · x2M .. .. · .. + .. . . . . 1 xN · · · xNM aM 125 y = Xa + ε = ybn + ε (6.26) εN równoważna˛ zapisowi: M 2 1 x1 x1 x1 ε1 y1 1 xM ε2 x2 y2 1 x1 2 2 2 .. = a0 .. + a1 .. + a2 .. + ... + aM .. + .. . . . . . . yN xNM xN2 xN1 1 (6.27) εN Współczynniki am , obliczone z równania Xa = y metoda˛ macierzy pseudo-odwrotnej a = (XT X)−1 XT y, sa˛ w tej interpretacji współczynnikami sumy przyj˛etych wektorów bazowych, która przybliża analizowany wektor w sensie minimalizacji sumy kwadratów bł˛edów punktowych: N J= 2 ∑ (yn − ybn ) n=1 N = ∑ n=1 !2 M yn − ∑ am xnm . (6.28) m=0 Program 6.4 demonstruje rozpatrywany przypadek wyznaczania współczynników wielomianu y = a0 + a1 x + a2 x2 + ... + aM xM M-tego stopnia, aproksymujacego nieznana˛ zależność y = f (x) na podstawie N punktów eksperymentalnych (xn , yn ), n = 1, 2, ..., N (M > N). Listing 6.4: Program do wyznaczenia współczynników wielomianu M-tego stopnia aproksymujacego ˛ dane eksperymentalne % approx_poly.m % Przyklad aproksymacji wielomianowej z baza jednomianow % {x,y} - dane, M - stopien wielomianu, N - liczba danych clear all; close all; M = 3; N = 10; % x y x y % stopien wielomianu % liczba punktow pomiarowych (N>=M oraz N<=10) W wyniku pomiaru otrzymano nastepujace liczby ( x = numer pomiaru, y = wartosc ) =[1 2 3 4 5 6 7 8 9 10 ]; = [ 0.912 0.945 0.978 0.997 1.013 1.035 1.057 1.062 1.082 1.097 ]; = x(1:N).’; = y(1:N).’; X = vander(x), % macierz Vandermonde’a: kolejne potegi x w kolumnach X = X(:,N-M:N), pause % odcinamy pierwsze kolumny z najwiekszymi potegami a = inv(X’*X)*X’*y; % wspolczynniki od najwyzszej potegi % Inaczej: a=U\y; albo a=polyfit(x,y,n); figure; plot(y-X*a,’ro-’); xlabel(’xn’); title(’ERR(xn)’); grid; pause % odchylki xi = min(x) : 0.1 : max(x); % argumenty yi = polyval(a,xi); % wartosci wielomianu w punktach figure; plot(x,y,’ro’,xi,yi,’b-’); xlabel(’x’); title(’y=f(x)’); grid; pause Macierz aproksymacji X, otrzymana w nadokreślonym układzie równań (6.26) podczas przybliżenia wartości y wielomianem (6.25) zmiennej x, jest niekorzystna z dwóch powodów: • ma ona struktur˛e Vandermonde’a i jest źle uwarunkowana już dla niskiego stopnia wielomianu aproksymacyjnego, 126 6 Aproksymacja - rozwiazywanie ˛ nadokreślonych układów równań liniowych • nakład obliczeniowy na wyznaczenie współczynników układu równań, opisanego taka˛ macierza,˛ jest duży, dodatkowo obliczenia trzeba powtarzać po zwi˛ekszaniu stopnia wielomianu. Wybór wektorów bazowych (czyli kolumn macierzy X), użytych do przybliżenia wektora y za pomoca˛ ich sumy ważonej, powinien zapewnić mały bład takiego przybliżenia przy małym nakładzie obliczeniowym. Jest to osiagane ˛ kiedy wektory macierzy X, czyli wektory bazowe b rozwini˛ecia, sa˛ ortonoralne: 1, i = j (i) T ( j) [b ] · b = (6.29) 0, i ̸= j Wówczas XT X = I i z równania (6.22) otrzymujemy: a = XT X −1 XT y = IXT y = XT y. (6.30) Jak widać w takim przypadku i-ty element wektora a jest prosto otrzymywany jako wynik pomnożenia pionowego wektora y przez transpozycj˛e i-tej kolumny b(i) macierzy X, w zapisie skalarnym: ai = [b(i) ]T y = N ∑ [b(i) ] j · [y] j . (6.31) j=1 gdzie [v] j oznacza j-ty element wektora v. Popularne, ortonormalne (ortogonalne i znormalizowane) wektory bazowe, używane jako kolumny macierzy X, to: • wielomiany trygonometryczne (baza Fouriera) - dobre przybliżenie dla funkcji okresowych, • wielomiany Czebyszewa - majace ˛ najmniejsze oscylacje w przedziale [-1,1], • wielomiany Legendre’a - b˛eda˛ także wykorzystywane do całkowania numerycznego w kwadraturach Gaussa). Kryterium decydujacym ˛ o wyborze konkretnej rodziny wektorów bazowych powinna być szybkość zbieżności szeregu wektorów bazowych do przyliżanego kształtu oraz końcowy bład ˛ przybliżenia. Przykład - aproksymacja średniokwadratowa wielomianem trygonometrycznym Obecnie zaprojektujemy okresowy sygnał pobudzajacy, ˛ który b˛edzie wykorzystywany do identyfikacji jakiegoś obiektu dynamicznego. Znajac ˛ odpowiedź obiektu na zadane pobudzenie, b˛edziemy wiedzieli czego można si˛e po nim spodziewać. Załóżmy, że chcemy użyć programowalnego generatora wektorowego ARB (arbitralnego sygnału) do wytworzenia N-punktowego przebiegu piłokształtnego (fali trójkatnej, ˛ czyli odcinkowo powoli narastajacej ˛ linii prostej od wartości -1 do wartości +1 i potem błyskawicznie opadajacej). ˛ Jeden okres tej funkcji chcemy przybliżyć suma˛ M ortogonalnych funkcji sinusoidalnych, minimalizujac ˛ nast˛epujacy ˛ bład: ˛ N M !2 J = ∑ y(ti ) − ∑ ak sin(kω0ti ) i=1 k=0 , ti = i · ∆t, ω0 = 2π 1 . N · ∆t (6.32) Program 6.5 demonstruje rozwiazanie ˛ tego problemu. Otrzymany sygnał oryginalny (linia kropkpwana) oraz jego aproksymacja pi˛ecioma sinusami (linia ciagła) ˛ sa˛ pokazane a rysunku 6.6. Listing 6.5: Przykład aproksymacji funkcji piłokształtnej za pomoca˛ wielomianu trygonometrycznego - w tym przypadku z użyciem sumy funkcji ortogonalnych typu sinus 6.3 Aproksymacja z użyciem wielomianów ortogonalnych 127 % approx_orto.m clear all; close all; N=100; M=5; % Liczba definiowanych punktow czasowych % Liczba sinusoid uzytych do aproksymacji x = [0 : 2*pi/N : 2*pi*(N-1)/N]’; y = sawtooth(x); figure; plot( y ); pause % Wektor pionowy [rad]: 0 : krok : maks % Zadany przebieg piloksztaltny, od -1 do 1 % Sygnal aproksymowany X = sqrt(2/N) * sin(x*[1:M]) ; figure; plot( X(:,5)’ ); pause % Macierz z ortogonalnymi sinusami w kolumnach % Przykladowo 5-ta kolumna a = X’*y; % Wynik transformacji, szukany wektor wspolczynnikow figure; plot(x,y,’r.’,x,X*a); grid; % Funkcja oryginalna i jej aproksymata Rysunek 6.6 Przykład aproksymacji funkcji liniowo narastajacej ˛ od -1 do +1 za pomoca˛ sumy M = 5 sinusów ortogonalnych. y=f(x) 1.5 1 y 0.5 0 -0.5 -1 -1.5 0 1 2 3 4 5 6 7 x Zauważmy, i sprawdźmy, że próba powyższej aproksymacji dla przebiegu zadanego funkcja˛ Matlaba sawtooth(x-pi/4) zakończy si˛e niepowodzeniem, ponieważ przebieg ten nie jest dobrze przybliżany baza˛ sinusów, gdyż jest przesuni˛ety i nie ma “symetrii” kształtu typowej dla sinusa. W tym przypadku musimy użyć połaczonej ˛ bazy sinusów i kosinusów. W wersji zespolonej jest to baza dyskretnej transformacji Fouriera (DFT). Poniżej podano dwa alternatywne sposoby utworzenia macierzy pełnej rzeczywistej bazy trygonometrycznej, zawierajacej ˛ zarówno funkcje sinus jak i kosinus. X1 = sqrt(2/N) * [sin(x*[1:M]) cos(x*[1:M])]; X2 =dftmtx(N)’*sqrt(2/N); X2=[imag(X2(:,2:M+1)) real(X2(:,2:M+1))]; Problem 6.6 (* Pełna rzeczywista baza trygonometryczna). Dokonaj stosownych zmian w programie 6.5 i sprawdź czy aproksymacja sygnału z użyciem pełnej rzeczywistej bazy trygonometrycznej (wzory podano powyżej) zawsze zakończy si˛e sukcesem, niezależnie od kata ˛ przesuni˛ecia aproksymowanej funkcji sawtooth(). 128 6 Aproksymacja - rozwiazywanie ˛ nadokreślonych układów równań liniowych 6.4 Aproksymacja jednostajna min-max wielomianami Czebyszewa Na wykładzie dotyczacym ˛ interpolacji obserwowaliśmy niepożadane ˛ zachowanie wielomianu interpolujacego ˛ wysokiego rz˛edu w postaci silnych oscylacji na końcach przedziału interpolacji. Pozornie jest to sprzeczność z twierdzeniem Weierstrassa, mówiacym, ˛ że istnieje pewien wielomian przybliżajacy ˛ wybrana˛ funkcj˛e z dowolnie małym bł˛edem. Jednak to twierdzenie mówi o pewnym wielomianie, a nie o wielomianie dla w˛ezłów w punktach równoodległych. Dla wielomianu interpolacyjnego pN (x), przechodzacego ˛ przez w˛ezły (xi , f (xi )) , i = 0, 1, 2, ..., N, bład ˛ mi˛edzy funkcja˛ i jej przybliżeniem wielomianowym wynosi (czego nie wyprowadzamy, zob. np. Buchanan): f (N+1) (ξ ) f (N+1) (ξ ) = LN (x) (N + 1)! (N + 1)! (6.33) gdzie ξ oznacza pewien punkt leżacy ˛ w przedziale oszacowania. Pewne wybory w˛ezłów, np. równoodległych, moga˛ powodować duże wartości mnożnika LN (x). Przez odpowiedni dobór położenia w˛ezłów możemy zminimalizować jego maksymalna˛ wartość. Optymalne położenia w˛ezłów na przedziale [-1, 1] to zera wielomianu Czebyszewa stopnia N + 1, równe (Mathews, str. 237): 2i + 1 xi = cos π , i = 0, 1, . . . , N. (6.34) 2 (N + 1) RN (x) = f (x) − pN (x) = (x − x0 ) (x − x1 ) . . . (x − xN ) Wielomiany Czebyszewa kolejnych stopni można zdefiniować rekurencyjnie: C0 (x) = 1, C1 (x) = x, Cn+1 (x) = 2xCn (x) −Cn−1 (x) . (6.35) Przykładowo wielomiany Czebyszewa C2 (x),C3 (x),C4 (x) sa˛ nast˛epujace: ˛ C2 (x) = 2x2 − 1, C3 (x) = 4x3 − 3x, C4 (x) = 8x4 − 8x2 + 1, Problem 6.7 (* Wielomiany Czebyszewa analitycznie). Korzystajac ˛ z wzoru (6.35) oraz znajac ˛ wielomiany Czebyszewa C3 (x),C4 (x), oblicz wielomiany C5 (x),C6 (x),C7 (x). Narysuj na jednym rysunku wartości wszystkich wielomianów od C0 (x) do C7 (x) dla x ∈ [−1, 1]. Powinieneś otrzymać rysunek podobny do 6.7. Problem 6.8 (* Wielomiany Czebyszewa numerycznie). Korzystajac ˛ z wzoru (6.35) oblicz numerycznie współczynniki kolejnych wielomianów Czebyszewa aż do stop- 6.4 Aproksymacja jednostajna min-max wielomianami Czebyszewa 129 nia 10. Narysuj kształt funkcji wszystkich wielomianów na jednym rysunku dla x ∈ [−1, 1]. Powinieneś otrzymać rysunek podobny do 6.7. 1 0.5 0 -0.5 -1 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 x Rysunek 6.7: Kształt funkcji wielomianów Czebyszewa od C0 (x) do C7 (x). −1 Przykład - trudna funkcja 1 + x2 raz jeszcze. Porównajmy jakość aproksymacji funkcji, która sprawiała nam problemy podczas interpolacji przy użyciu w˛ezłów równoodległych, a która była bardzo dobrze interpolowana funkcjami sklejanymi za cen˛e mniej zwartego opisu. Podstawiajac ˛ w˛ezły Czebyszewa do wielomianu interpolujacego ˛ postaci Newtona, uzyskujemy wynik znacznie lepszy niż przy w˛ezłach równoodległych, o czym przekonuje rysunek 6.8, wygenerowany przez program 6.6. y=f(x) 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 -3 -2 -1 0 1 2 3 x 1 Rysunek 6.8: Aproksymacja trudnej funkcji 1+x ˛ z 2 (gładka, czerwona linia ciagła) użyciem 11-stu wezłów rozłożonych: 1) nierównomiernie - kółka (lekko oscylujaca, ˛ niebieska linia ciagła), ˛ 2) równomiernie - kwadraty (linia kreska-kropka). 130 6 Aproksymacja - rozwiazywanie ˛ nadokreślonych układów równań liniowych Listing 6.6: Przykład aproksymacji trudnej funkcji wielomianem interplacyjnym Newtona z w˛ezłami Czebyszewa % approx_newton_via_cheby.m % Interpolacja Newtona w wezlach Czebyszewa clear all; close all; N = 10; a = -3; b = 3; xi = a : 0.01 : b; yref = myfun( xi ); % stopien wielomianu interpolujacego % argument funkcji myfun() od-do % dokladne, rownomierne sprobkowanie argumentu funkcji % wartosci funkcji sprobkowanej gesto % Probkowanie rzadkie w wezlach Czebyszewa, potem interpolacja k = 0:N; % numery kolejnych N+1 punktow theta = ((2*N+1)-2*k)*pi/(2*N+2); % katy Czebyszewa xk = cos( theta ); % kolejne argumenty w przedz. [-1,1] xk = (b-a)/2*xk + (a+b)/2; % przeskalowane do [a,b] yk = myfun( xk ); % funkcja spobkowana w wezlach Czebyszewa [yi,p,an] = funTZ_newton(xk,yk,xi); % interpolacja w wezlach Czebyszewa %yi = polyval(p,xi); % alternatywa jesli juz znamy wielomian p % Probkowanie rzadkie w wezlach rownomiernych, potem interpolacja xkk = a : (b-a)/N : b; % probkowanie rownomierne ykk = myfun( xkk ); % funkcja spobkowana w wezlach rownomiernych [yii,p,ann] = funTZ_newton(xkk,ykk,xi); % interpolacja w wezlach rownomiernych figure; plot(xi,yref,’r-’,xi,yi,’b-’,xk,yk,’bo’,xi,yii,’b-.’,xkk,ykk,’bs’); xlabel(’x’); title(’y=f(x)’); grid; pause 6.5 Aproksymacja Pade funkcjami wymiernymi Dotychczas podczas omawiania interpolacji i aproksymacji cały czas operowaliśmy w˛ezłami (lepiej lub gorzej rozłożonymi), które były podstawa˛ do opisu pełniejszego (interpolacja wartości pomi˛edzy w˛ezłami) albo przybliżonego, ale bardziej zwartego (aproksymacja zależności). W aproksymacji Padego, która˛ zajmiemy si˛e obecnie, stosuje si˛e zupełnie inna˛ filozofi˛e. Interesujaca ˛ nas zależność funkcyjna f (x) jest przybliżana w niej ilorazem dwóch wielomianów: RN,M (x) = A (x) a0 + a1 x + . . . + aN xN = = f (x), B (x) 1 + b1 x + . . . + bM xM (6.36) od którego wymaga si˛e, aby jego wartość oraz wartości jego kolejnych pochodnych w punkcie zerowym były równe, odpowiednio, wartości funkcji i jej kolejnych pochodnych także w punkcie zerowym (lub dowolnym innym po podstawieniu zmiennych). Z tego powodu rozwijamy funkcj˛e aproksymowana˛ f (x) w szereg MacLaurina wokół punktu 0: ∞ f (x) = 1 ∑ k! f (k) (0)xk (6.37) k=0 gdzie f (k) (0) to k-ta pochodna funkcji w zerze, oraz spisujemy stawiane warunki: RN,M (0) = f (0), dk RN,M (x) dxk = x=0 dk f (x) dxk , k = 1, 2, . . . , N + M, (6.38) x=0 co jest tożsame z przyrównaniem do siebie współczynników przy kolejnych pot˛egach w wyrażeniu (6.36): 6.6 Aproksymacja funkcja˛ nieliniowa˛ wzgl˛edem parametrów 131 A(x) = f (x)B(x). (6.39) Otrzymujemy w ten sposób układ N + M + 1 równań i wyznaczamy współczynniki wielomianów licznika i mianownika wymiernej funkcji aproksymujacej ˛ (zob. np. Numerical Recipes albo Mathews). Aproksymacja Padé daje z reguły dużo lepsze efekty niż rozwini˛ecie wielomianowe MacLaurina. Jednak nie opracowano dotad ˛ metody analizy bł˛edu tego przybliżenia (zob. Numerical Recipes) i jej używanie ma w sobie coś z magii. Przykład - Transformacja biliniowa pomi˛edzy dziedzina˛ operatorów s i z . Zależność pomi˛edzy dziedzina˛ operatora s = j2π f transformacji Laplace’a i operatora j2π f z = e f p transformacji Z ( f - cz˛estotliwość, f p - cz˛estotliwość próbkowania), powszechnie używana˛ w cyfrowym przetwarzaniu sygnałów (np. do transformacji filtrów analogowych do postaci cyfrowej), nazywa si˛e transformacja˛ biliniowa˛ z powodu jej wymiernej, dwuliniowej postaci: z= 1 + 21f p s 1− 1 2 fp s , s = 2 fp z−1 z+1 (6.40) 1 . fp (6.41) przybliżajacej ˛ zależność dokładna: ˛ z = f (s) = esTp , Tp = Przybliżona˛ zależność (6.40) otrzymuje si˛e z zależności definicyjnej (6.41) za pomoca˛ aproksymacji Padégo: f (s)|s=0 = 1 f ′ (s) s=0 = Tp → a0 + a1 s = (1 + b1 s) 1 + Tp s + 21 Tp 2 s2 f ′′ (s) → s=0 = Tp 2 a0 = 1, a1 = 1 2 fp , b1 = − 21f p Problem 6.9 (* Sprawdzenie równań transformacji biliniowej). Porównaj na rysunku definicyjna˛ (6.41) oraz wyprowadzona/przybli ˛ żona˛ (6.40) zależność transformacji biliniowej. Problem 6.10 (** Przybliżenie trudnej funkcji). Samodzielne wyprowadzenie przy−1 bliżenia Padégo funkcji 1 + x2 . Czy jest sens w tym przypadku je stosować? Problem 6.11 (*** Przybliżenie funkcji erf() Matlaba). Samodzielne wyprowaR 2 dzenie przybliżenia funkcji erf(x) = √2π 0x e−t dt. 6.6 Aproksymacja funkcja˛ nieliniowa˛ wzgl˛edem parametrów Powszechnie wyst˛epujace ˛ w naukach eksperymentalnych zadanie dopasowania krzywej do zbioru danych pomiarowych (curve fitting) jest klasycznym zadaniem aproksymacji. Krzywa dopasowywana stanowi zależność modelowa˛ wia˛żac ˛ a˛ dane. Jej postać wynika z analizy zjawiska generujacego ˛ dane (np. zależności opisujacej ˛ rozpad pierwiastków promieniotwórczych) lub z obserwowanego kształtu przebiegu danych. 132 6 Aproksymacja - rozwiazywanie ˛ nadokreślonych układów równań liniowych Dopasowywanie krzywej do danych jest szeroko stosowane podczas identyfikacji obiektów dynamicznych metoda˛ dopasowania modelowej odpowiedzi na znane pobudzenie do odpowiedzi zmierzonej na obiekcie. Takie odpowiedzi dynamiczne sa˛ najcz˛eściej nieliniowe ze wzgl˛edu na parametry (np. odpowiedź impulsowa h(t) obiektu oscylacyjnego drugiego rz˛edu z parametrami K, ξ , ω0 ). Minimalizowane kryterium sumy kwadratów bł˛edów punktowych jest postaci: N J1 = ∑ [yi − f (a,ti )]2 , (6.42) i=1 gdzie: • yi - zmierzona odpowiedź dynamiczna obiektu, • f (a,ti ) - model tej odpowiedzi. Ponieważ w ogólnym przypadku nie ma analitycznego wzoru do obliczenia rozwia˛ zania, konieczne staje si˛e zastosowanie numerycznego algorytmu iteracyjnego, poszukujacego ˛ dla jakich wartości a funkcja kryterium (inaczej funkcja kosztu) osiaga ˛ minimum. Zagadnieniem tym zajmiemy si˛e na laboratorium poświ˛econym optymalizacji. Zauważmy, że kryterium J1 nie jest już kwadratowe wzgl˛edem parametrów, ponieważ funkcja f (a,ti ) nie jest liniowa wzgl˛edem a. Zatem kryterium to może mieć także, poza globalnym rozwiazaniem ˛ optymalnym, minima lokalne odpowiadajace ˛ dopasowaniom suboptymalnym. 6.7 Przykład - projektowanie filtrów cyfrowych Istnieje wiele metod do projektowania odpowiednich wag hm , wyst˛epujacych ˛ w funkh x . W zacji splotu danych wejściowych xn właśnie z tymi wagami: yn = ∑M−1 m n−m m=0 leżności od ich wartości operacja splotu realizuje wybrany rodzaj filtracji: dolno-, górno-, pasmowo-przepustowa˛ albo pasmowo-zaporowa.˛ Jedna˛ z metod projektowania wag ww. filtrów FIR sa˛ metody aproksymacji ich odpowiedzi cz˛estotliwościowych (tzn. transformacji Fouriera odpowiedzi czasowych, czyli impulsowych) według wybranej normy. Ogólnie, wielkościa˛ minimalizowana˛ jest: Z J= [ W (ω) · ( |H(ω)| − D(ω) ) ] p dω, (6.43) ω gdzie: • H(ω) - charakterystyka/odpowiedź cz˛estotliwościowa projektowanego filtra, • D(ω) - przyj˛ety wzorzec (desired) modułu charakterystyki cz˛estotliwościowej, czyli ch-ki amplitudowej (ch-ka faza jest z założenia liniowa), • W (ω) - wybrana funkcja wagowa (która określa jakie cz˛estotliwości sa˛ dla nas bardziej istotne, a które mniej - duże/małe wartości. Dla p = 2 otrzymujemy aproksymacj˛e średniokwadratowa˛ (least squares), natomiast dla p = ∞ - aproksymacj˛e minimax Czebyszewa (equiripple design). W Matlabie sa˛ funkcje, projektujace ˛ wagi filtrów splotowych na zasadzie aproksymacji: • remez() - algorytm Remeza aproksymacji minimax w implementacji ParksaMcClellana (exchange algorithm, zob. Buchanan, str. 273, Evans, str. 168) • firls() - algorytm najmniejszej sumy ważonej kwadratów odchyłek (weighted LS), • firlpnorm() – definiowany stopień normy w równaniu (6.43), domyślnie p=128; algorytm optymalizacyjny/minimalizacyjny quasi-Newton search. Literatura 133 6.8 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. 1. aproksymujemy, aby: • zapisać modelowa˛ relacj˛e mi˛edzy danymi wejściowymi i wyjściowymi (zakłóconymi), • w zwarty sposób przedstawić obszerny zbiór powiazanych ˛ danych, • szybko lub z małym zużyciem pami˛eci liczyć wartości funkcji trudnych obliczeniowo; 2. aproksymacja liniowa według zasady najmniejszej sumy kwadratów odchyłek daje rozwiazanie ˛ wyrażone równaniem macierzowym: a = (XT X)−1 XT y, 3. aproksymacja wielomianowa Czebyszewa używa w˛ezłów rozmieszczonych nieregularnie w celu zmniejszenia oscylacji używanych wielomianów, 4. aproksymacj˛e można interpretować jako przedstawianie analizowanego wektora danych (sygnału) za pomoca˛ liniowej kombinacji wektorów/funkcji bazowych (np. wielomianów, sinusów/kosinusów, zespolonych sygnałów harmonicznych cos() + j sin() (DFT)), 5. aproksymacja Padégo ilorazem wielomianów daje cz˛esto bardzo dobre efekty, 6. aproksymacja danych funkcja˛ nieliniowa˛ wzgl˛edem jej parametrów wymaga użycia algorytmów numerycznych minimalizacji. Literatura 1. B. Author, Title. Publisher, City, Year. 2. C. Moler: “Fourier Analysis”, in Numerical Computing with Matlab, on-line: https:// www. mathworks.com/ moler/ chapters.html.html 3. C. Moler: “Least Squares”, in Numerical Computing with Matlab, on-line: https:// www. mathworks.com/ moler/ chapters.html.html Rozdział 7 Różniczkowanie i całkowanie funkcji/danych Streszczenie Numeryczne przybliżenia pochodnej. Kwadratury Newtona-Cotesa. Całkowanie adaptacyjne. Kwadratury Gaussa. Całki wielokrotne. 7.1 Wprowadzenie Różniczkowanie. W zadaniu różniczkowania numerycznego należy wyznaczyć wartość D pochodnej funkcji y = f (x) w punkcie x = a, czyli nachylenie stycznej do funkcji w tym punkcie: d f (x) dx D= , (7.1) x=a z użyciem punktu (a, f (a)) oraz sasiednich. ˛ Umiej˛etność różniczkowania numerycznego jest wymagana podczas obliczania wielu ważnych wartości definiowanych różniczka: ˛ • czułości i wrażliwości metod przetwarzania danych, • pr˛edkości i przyspieszenia, wyznaczanych na podstawie położenia (odpowiednio: pierwsza i druga pochodna położenia), • nachylenia (gradientu) w metodach poszukiwania minimum funkcji. W wyniku różniczkowania numerycznego otrzymujemy wartość przybliżona,˛ gdyż korzystamy z danych dyskretnych, czyli niekompletnych (na podstawie skończonej liczby pobranych próbek danych). Dodatkowo stosujemy pewne przybliżenia, np. lokalna˛ linearyzacj˛e. W obliczeniach małej precyzji wystarczaja˛ proste metody dwupunktowych ilorazów różnicowych: zmiana wartości funkcji podzielona przez powia˛ zana˛ zmian˛e argumentu: D[x1 ,x2 ] = f (x2 ) − f (x1 ) . x2 − x1 (7.2) Całkowanie W zadaniu całkowania numerycznego należy wyznaczyć wartość całki oznaczonej z funkcji f (x) w przedziale [a, b]: Z b f (x)dx I= (7.3) a na podstawie znajomości wartości funkcji yi w punktach xi (narzuconych lub wybieranych). Całkujac ˛ funkcj˛e y = f (x) obliczamy pole powierzchni leżace ˛ pod przebiegiem funkcji, czyli akumulejemy jej kwadratur˛e (tzn. wartość funkcji pomnożona˛ przez przyrost argumentu). 135 136 7 Różniczkowanie i całkowanie funkcji/danych Rysunek 7.1 Ilustracja graficzna zadania różniczkowania numerycznego funkcji y = f (x) w punkcie x = a z użyciem jej sasiednich ˛ punktów. Rysunek 7.2 Ilustracja graficzna zadania całkowania numerycznego funkcji y = f (x) z użyciem jej punktów (xi , yi ), i = 1, 2, 3, 4. Umiej˛etność całkowania numerycznego jest wymagana podczas obliczania wielu ważnych wartości: • • • • prawdopodobieństwa poprzez całkowanie funkcji g˛estości prawdopodobieństwa, pola powierzchni i obj˛etości, wartości średniej, skutecznej, energii i mocy przebiegu funkcji, splotu dwóch funkcji. W wyniku całkowania numerycznego otrzymujemy wartość przybliżona,˛ gdyż przeprowadzamy operacj˛e sumowania danych dyskretnych (skończonej liczby pobranych próbek danych). W obliczeniach małej precyzji wystarcza proste całkowanie metoda˛ prostokatów ˛ (P) i trapezów (T): (P) I[a,b] = f (a)(b − a), wysokość × szerokość 1 1 (T ) I[a,b] = f (a)(b − a) + [ f (b) − f (a)] (b − a) = [ f (b) + f (a)] (b − a). 2 2 (7.4) (7.5) 7.2 Estymacja pochodnej i całki z 3 punktów Rozważmy prosty przykład na poczatek. ˛ Chcemy tak dobrać wartości współczynników a, b, c w wyrażeniu: A = ay−1 + by0 + cy1 , aby obliczona wartość A przybliżała: • całk˛e w przedziale [x−1 , x1 ], • pochodna˛ w punkcie x0 , • druga˛ pochodna˛ w punkcie x0 . Załóżmy punkty (w˛ezły) równoodległe z odst˛epem h: (7.6) 7.3 Różniczkowanie numeryczne 137 x−1 = x0 − h, (7.7) x+1 = x0 + h. (7.8) W tabeli 7.1 podano popularne wybory wartości parametrów a, b, c wyrażenia (7.6) oraz wynikajace ˛ z nich konkretne scenariusze zastosowań. Operacj˛e wykonywana˛ na danych można nazwać średnia˛ ważona,˛ a w przypadku jej wielokrotnego powtarzania - bieżac ˛ a˛ (ruchoma) ˛ średnia˛ ważona˛ (analogia do nierekursywnej filtracji sygnałów cyfrowych, opisanej funkcja˛ splotu). Tabela 7.1: Przybliżanie operacji różniczkowania i całkowania z użyciem średniej ważonej danych, wyliczonej z trzech punktów Wielkość przybliżana Wartości a, b, c Operacja numeryczna Dokładna wartość dla wielomianu stopnia: Całka (mnożnik h) Całka (mnożnik h) Całka (mnożnik h) Pochodna (mnożnik 1h ) Pochodna (mnożnik h1 ) 1 Pochodna (mnożnik 2h ) Druga pochodna (mnożnik 1, 1, 0 1 1 2 , 1, 2 1 4 1 , , 3 3 3 0, −1, 1 −1, 1, 0 −1, 0, 1 1, −2, 1 Suma prostokatów ˛ Suma trapezów Wzór Simpsona Iloraz różnicowy wprzód Iloraz różnicowy wstecz Iloraz różnicowy centralny Iloraz ilorazów wprzód/wstecz Zerowego Pierwszego Trzeciego Pierwszego Pierwszego Drugiego Trzeciego 1 ) h2 Problem 7.1 (* Sprawdzenie estymatorów 3-punktowych pochodnych i całek). Wybierz z tabeli 7.1 jedna˛ metod˛e przybliżania całki i jedna˛ metod˛e przybliżania pochodnej. Sprawdź czy prawda˛ jest, że sa˛ one poprawne dla wielomianów do określonego rz˛edu włacznie. ˛ Zastosuj metody dla trzech punktów funkcji sinus: y = sin(x), x = 0, π8 , π4 . Jakim wielomianem przybliża si˛e funkcj˛e sinus w okolicy x = 0? 7.3 Różniczkowanie numeryczne Najbardziej pogladowym ˛ zastosowaniem różniczkowania numerycznego jest obliczanie pr˛edkości i przyspieszenia na podstawie współrz˛ednych położenia, np. danych GPS (zrób to sam po lekturze tego podrozdziału!). Metody. W celu uzyskania przybliżenia numerycznego wartości pochodnej danych/funkcji stosowane sa˛ nast˛epujace ˛ metody: 1. dla w˛ezłów nierównoodległych: różniczkuje si˛e wielomian interpolacyjny zapisany w postaci: • klasycznej, • Newtona, • Lagrange’a; 2. dla w˛ezłów równoodległych: • różniczkuje si˛e wielomian interpolacyjny, 138 7 Różniczkowanie i całkowanie funkcji/danych • wykorzystuje si˛e rozwini˛ecie funkcji w szereg Taylora. 7.3.1 Zastosowanie wielomianu interpolacyjnego w postaci Newtona Jeśli różniczkowana˛ funkcj˛e f (x) przybliżymy wielomianem interpolacyjnym p(x) w postaci Newtona, korzystajacym ˛ z N punktów/w˛ezłów {x1 , x2 , ..., xN }: p (x) = a0 +a1 (x − x1 )+a2 (x − x1 ) (x − x2 )+. . .+aN−1 (x − x1 ) (x − x2 ) . . . (x − xN−1 ) , (7.9) to wówczas możemy przybliżyć pochodna˛ tej funkcji za pomoca˛ pochodnej wielomianu interpolacyjnego: p′ (x) = a1 + a2 [(x − x1 ) + (x − x2 )] + a3 [(x − x1 ) (x − x2 ) + (x − x1 ) (x − x3 ) + (x − x2 ) (x − x3 )] + ... N−1 N−1 aN−1 ∑ ∏ (x − x j ) (7.10) k=1 j=1, j̸=k Kiedy podstawimy za x w˛ezeł o poszukiwanej pochodnej x1 , x2 , x3 , ..., to zeruje si˛e wi˛ekszość składników wyrażenia (7.10) i uzyskujemy formuł˛e różnicowa: ˛ w przód, wstecz, lub centralna.˛ W˛ezły interpolacji nie musza˛ być równoodległe. Przykład. Przybliżenie pochodnej funkcji wielomianem interpolujacym ˛ Newtona, zbudowanym na 3 w˛ezłach/punktach (x1 , y1 ), (x2 , y2 ), (x3 , y3 ) ma nast˛epujac ˛ a˛ postać: p (x) = a0 + a1 (x − x1 ) + a2 (x − x1 ) (x − x2 ) , (7.11) gdzie: a0 = y1 , a1 = y2 − y1 , x2 − x1 a2 = y3 −y2 x3 −x2 1 − yx22 −y −x1 x3 − x1 . (7.12) Jego pochodna w dowolnym punkcie przedziału interpolacji [x1 , x3 ] jest równa: f ′ (x) ≈ p′ (x) = a1 + a2 [(x − x1 ) + (x − x2 )] . (7.13) Jeśli do zależności (7.13) podstawimy wartości a0 , a1 , a2 , określone przez (7.12), oraz jeśli przyjmiemy w˛ezły równoodległe: x2 = x1 + h, (7.14) x3 = x1 + 2h, (7.15) to otrzymamy z (7.13) nast˛epujace ˛ przybliżenia wartości pochodnych funkcji w w˛ezłach: 7.3 Różniczkowanie numeryczne 139 f ′ (x1 ) ≈ p′ (x1 ) = ′ ′ ′ ′ f (x2 ) ≈ p (x2 ) = f (x3 ) ≈ p (x3 ) = 1 2h 1 2h 1 2h (−3y1 + 4y2 − y3 ) , (7.16) (y3 − y1 ) , (7.17) (y1 − 4y2 + 3y3 ) . (7.18) Problem 7.2 ((L)* Obliczanie pochodnych metoda˛ interpolacji w zapisie Newtona). Zastosuj wzory (7.16)-(7.18) do obliczenia pochodnej funkcji sinus w trzech punktach: y = sin(x), x = 0, π4 , π2 . Jaki jest poprawny wynik i jak duże bł˛edy otrzymałeś? Może dla funkcji y = 0.5 + x + 2x2 , x = 1, 2, 3 byłoby lepiej? A jakby funkcja miała jeszcze jeden składnik 3x3 ? 7.3.2 Zastosowanie szeregu Taylora Na podstawie rozwini˛ecia funkcji y = f (x) w szereg Taylora w okolicy argumentu x (patrz Mathews J.H. “Numerical Methods ...”, str 333): 1 ′′ f (x) h2 + . . . (7.19) 2! możemy szacować zależność dokładności numerycznego przybliżenia pochodnej funkcji w zależności od wartości pochodnej wyższego rz˛edu oraz wartości kroku h. f (x + h) = f (x) + f ′ (x) h + Przykład. Jeśli rozwini˛ecie Taylora funkcji dla jej argumentów x + h i x − h zostanie ograniczone do pierwszego nieskracajacego ˛ si˛e składnika, zwiazanego ˛ z wyższa˛ pochodna,˛ w tym przypadku trzecia: ˛ 1 ′′ 1 f (x) h2 + f ′′′ (x) h3 2! 3! 1 ′′ 1 ′ 2 f (x − h) = f (x) − f (x) h + f (x) h − f ′′′ (x) h3 2! 3! f (x + h) = f (x) + f ′ (x) h + (7.20) (7.21) to odejmujac ˛ równanie (7.21) od równania (7.20) otrzymujemy: f (x + h) − f (x − h) = 2 f ′ (x) h + f ′′′ (x) + f ′′′ (x) 3 h 3! (7.22) Teraz obliczamy f ′ (x) z powyższego równania: f (x + h) − f (x − h) f ′′′ (x) 2 − h , (7.23) 2h 3! i wyciagamy ˛ wniosek, że oszacowanie wartości pochodnej za pomoca˛ ilorazu różnicowego centralnego jest dokładne dla wielomianów do drugiego stopnia włacznie, ˛ zaś bład ˛ takiego przybliżenia jest proporcjonalny do h2 . W podobny sposób wyprowadza si˛e bład ˛ estymatora drugiej pochodnej (czyli ilorazu różnicowego pierwszych pochodnych). f ′ (x) = 140 7 Różniczkowanie i całkowanie funkcji/danych 7.3.3 Wrażliwość przybliżeń różnicowych na bł˛edy i zakłócenia danych Stwierdzenie, że bład ˛ przybliżenia pochodnej jest zależny od określonej pot˛egi kroku h sugeruje, że zmniejszanie kroku wyrażenia różnicowego może tylko poprawić jakość wyniku, czyli dokładność obliczenia pochodnej. W przeprowadzonej analizie nie uwzgl˛edniono jednak bł˛edu reprezentacji maszynowej wartości funkcji. Dodatkowo silny wpływ na bł˛edy wyznaczanej pochodnej moga˛ mieć zaburzenia wartości funkcji (np. szumy addytywne wyst˛epujace ˛ podczas pomiaru danych). Przeanalizujmy własności dwóch podstawowych, centralnych wyrażeń różnicowych, używanych do szacowania wartości pierwszej i drugiej pochodnej, pod katem ˛ wrażliwości na zakłócenia danych (wzór po lewej stronie został powyżej wyprowadzony, c jest pewnym punktem leżacym ˛ w przedziale oszacowania, zaś f (k) (x) oznacza k-ta˛ pochodna˛ funkcji w punkcie x): f ′ (x0 ) ≈ y1 − y−1 f (3) (c) 2 − h , 2h 6 f ′′ (x0 ) ≈ y1 − 2y0 + y−1 f (4) (c) 2 − h . (7.24) h2 12 Przyjmujac ˛ zaburzenie danych y (szum lub bład ˛ reprezentacji komputerowej) na poziomie ε i ograniczenie odpowiedniej pochodnej przez liczb˛e M, uzyskujemy wyrażenia na łaczny ˛ bład: ˛ ε Mh2 4ε Mh2 + , δ ′′ = 2 + . (7.25) h 6 h 12 Teraz zadajemy sobie pytanie, dla jakiej wartości h wartość bł˛edu obliczonych pochodnych jest najmniejsza? Czyli szukamy minimum bł˛edu w funkcji h. Z tego powodu obliczamy pochodna˛ wyrażeń (7.25) wzgl˛edem h i przyrównujemy ja˛ do zera. Z tego warunku otrzymujemy optymalna˛ wartość kroku h, czyli rozwiazanie ˛ tzw. stepsize dilemma: δ′ = h′opt = 3ε M 1/3 , h′′opt = 48ε M 1/4 . (7.26) Z równań (7.26) wyciagmy ˛ nast˛epujace ˛ wnioski: • im wyższy jest rzad ˛ pochodnej, tym wi˛ekszy powinien być krok, aby mniej wzmacniać bład ˛ reprezentacji maszynowej danych, • kiedy dane sa˛ bardzo zaszumione, to lepiej jest korzystać z wielomianu aproksymujacego albo odszumiać dane przed obliczaniem pochodnej. Dowód w sprawie. Aby nie było “niedomówień”, w tabeli 7.2 wyprowadzono zależności (7.26). Tabela 7.2: Wyprowadzenie zależności 7.26, definiujacych ˛ optymalna˛ wartość kroku h podczas obliczania pierwszej i drugiej pochodnej funkcji Nr 1 2 3 4 5 Dla f ′ (x) Mh2 f (h) = εh−1 + 6 f ′ (h) = −εh−2 + 2 Mh 6 =0 Mh −2 3 = εh M h−3 = 3ε 31 h = 3ε M Dla f ′′ (x) Komentarz M 2 f ′ (h) = 4εh−2 + 12 h M −3 −8εh + 6 h = 0 M −3 6 h = 8εh 48ε 4 h = M 41 h = 48ε M Funkcje startowe Pochodne funkcji = 0 Prawo-lewo h solo Końcowy wynik 7.3 Różniczkowanie numeryczne 141 Rysunek 7.3: Ilustracja problemu różniczkowania numerycznego zaszumionych danych pomiarowych: obliczanie momentu nap˛edowego silnika jako pochodnej jego pr˛edkości obrotowej: lepiej jest najpierw odszumić dane filtrem uśredniajacym. ˛ Problem 7.3 ((L)* Test wrażliwości obliczeniowej). Wygeneruj jeden okres sinusa g˛esto spróbkowanego: N=1000; x=sin(2*pi/N*(0:N-1). Jego pierwsza˛ pochodna˛ jest kosinus, a druga˛ - minus sinus. Do danych dodaj szum gaussowski o różnej “sile” : x=x+0.1*randn(1,N). Oblicz numerycznie pierwsza˛ i druga˛ pochodna˛ danych ilorazem różnicowym, np. k=2; d1=(x(1+k:N)-x(1:N-k))/k, stosujac ˛ różna˛ wartość k. Oblicz średni bład ˛ przybliżeń dla wszystkich danych. Dla jakiej wartości k jest on najmniejszy? Czy wzory (7.26) okazały si˛e prawdziwe? 7.3.4 Problem różniczkowania zaszumionych danych rzeczywistych “Jeśli wydaje nam si˛e, że wszystko jest bezproblemowe, to pewnie coś uszło naszej uwadze!” Wiele zachodzacych, ˛ interesujacych ˛ nas zjawisk bio-fizyko-chemicznych jest bardzo słabych i dane z nich otrzymane sa˛ “zanurzone” w zakłóceniach. Operacja różniczkowania zaszumionych danych, skaczacych ˛ radośnie góra-dół, to koszmar: prawdziwa pochodna sygnału jest najcz˛eściej “spokojna”, wolnozmienna, a obliczona — “zwariowana”, rozedrgana. Co w takim przypadku należy zrobić? Zamknać ˛ sklep i pójść na ryby? Nie: najpierw trzeba zmniejszyć poziom zakłóceń, maksymalnie je odfiltrować i dopiero potem liczyć pochodna.˛ Na rysunku 7.3 pokazono przykład prosto z życia. Zarejestrowano sygnał pr˛edkości obrotowej ω(t) silnika (po lewej) i go zróżniczkowano numerycznie (w Matlabie: diff(w)/diff(t)), chcac ˛ obliczyć zmienny w czasie moment nap˛edowy urza˛ dω(t) dzeniana J(t) = dt (pośrodku), przyjmijmy że naszego wspaniałego Lamborghini. Otrzymano wynik bardzo zaszumiony, daleki od prawdy. Jednak kiedy przed różnikowaniem zastosowano bieżac ˛ a˛ średnia˛ ważona˛ (filtr przepuszczajacy ˛ niskie cz˛estotliwości) wynik zdecydowanie si˛e poprawił (rysunek po prawej). A teraz to samo inaczej powiedzane. Bezpośrednie przybliżenie pochodnej ilorazem różnicowym diff(w)/diff(t) nie kończy si˛e dobrze, ponieważ iloraz różnicowy (tak samo jak pochodna sygnału wysokocz˛estotliwościowego) jest bardzo wrażliwy na zakłócenia (środkowy rysunek). Bład, ˛ który popełniamy, to niepotrzebne, bardzo mocne wzmacnianie szumu w paśmie zakłóceń powyżej pasma sygnału. Pomysłem na rozwiazanie ˛ problemu jest wst˛epne ograniczenie zakłóceń przez filtracj˛e dolnopasmowa˛ (w Matlabie np. [h]=fir1(3,5/25); wf=conv(x,h,’same’); i dopiero późniejsze zastosowanie ilorazu różnicowego. Wynik jest lepszy (prawy rysunek). Dalszym krokiem byłoby połaczenie ˛ operacji filtrowania/odszumiania oraz róż- 142 7 Różniczkowanie i całkowanie funkcji/danych niczkowania, czyli obliczenie wspólnych wag odpowiadajacych ˛ obu operacjom wykonywanym równocześnie, a nie jedna za druga.˛ Problem 7.4 (* Filtrowanie, potem różniczkowanie). Wygeneruj jeden okres zaszumionego sinusa g˛esto spróbkowanego, tak jak w problemie 7.3. Jego pierwsza˛ pochodna˛ jest kosinus. Oblicz numerycznie pierwsza˛ pochodna˛ sygnału oryginalnego oraz odszumionego dla wszystkich danych - skorzystaj ze wskazówek podanych powyżej. Na jednym rysunku wyświetl oba przybliżenia pochodnej. W instrukcji [h]=fir1(3,5/25) pierwsza liczba określa liczb˛e wag filtra odszumiajacego, ˛ np. 3, 5, 7, zaś druga liczba, teraz równa 5/25=0.2, określa szerokość pasma przepustowego filtra i powinna być z zakresu [0,1] (0=nic nie przepuszczam, 1=wszystko przepuszczam). Wypróbuj różne filtry. Który okazał si˛e najlepszy? 7.3.5 Filtry różniczkujace ˛ w przetwarzaniu sygnałów “Sygnał” to dane z czujnika podpi˛etego do otaczajacego ˛ nas świata i zawierajace ˛ cenne informacje o tym świecie. Cyfrowe przetwarzanie sygnałów (CPS) (wygooglaj digital signal processing) to linia “frontowa” walki o znalezienie ukrytych informacji. A moga˛ być one także zawarte w pochodnych zarejestrowanych danych. Dlatego różniczkowanie jest bardzo ważna˛ operacja˛ w cyfrowym przetwarzaniu sygnałów i w CPS jest zaproponowanych wiele metod do obliczania pochodnych sygnałów y(x). Obecnie porównamy kilka z nich z pi˛eciopunktowym przybliżeniem pochodnej, bardzo popularnym w matematyce stosowanej: ′ yO(h4 ) (x) = y(−2) − 8y(−1) + 8y(1) − y(2) , 12h (7.27) gdzie O(h4 ) oznacza dokładność rz˛edu h4 . Ponieważ transformacja Fouriera F() pochodnej sygnału y′ (x) jest równa transformacji Fouriera F() oryginalnego sygnału y(x) pomnożonej przez 2π f (gdzie f to cz˛estoliwość): Fy′ (x) ( f ) = j2π f · Fy(x) ( f ) (7.28) dlatego wyciagamy ˛ stad ˛ wniosek, że idealna charakterystyka cz˛estotliwościowa D( f ) operacji różniczkowania jest równa: D( f ) = Fy′ (x) ( f ) = j2π f , Fy(x) ( f ) (7.29) czyli jest linia˛ prosta˛ w funkcji cz˛estotliwości. Poniżej sprawdzimy, która z 5-punktowych metod różniczkowania ma charakterystyk˛e D( f ) najbardziej zbliżona˛ do prostej. Porównamy nast˛epujace ˛ metody: 1. schemat różnicowy zdefiniowany równaniem (7.27), 2. filtr różniczkujacy ˛ CPS z minimalizacja˛ sumy kwadratów odchyłek D( f ) od linii prostej (w Matlabie projektowany funkcja˛ firls(), 3. filtr różniczkujacy ˛ CPS z minimalizacja˛ bł˛edu maksymalnego odchyłki D( f ) od linii prostej - aproksymacja Czebyszewa, algorytm Parksa–McClellana (w Matlabie projektowany funkcja˛ firpm(). Do porównania użyto programu 7.1, a otrzymane wyniki przedstawiono na rysunku 7.4. Jak widać najlepszym okazał algorytm CPS-LS z minmalizacja˛ błedu średniokwadratowego. 7.3 Różniczkowanie numeryczne 143 |D(fnorm)| 0.5 REF DIFF LS MIN-MAX 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1 0.05 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 fnorm Rysunek 7.4: Porównanie charakterystyk cz˛estotliwościowych trzech metod różniczkowania numerycznego: chcemy otrzymać lini˛e prosta˛ o nachyleniu 1 w okolicy f norm = f f = 0 (jak najdłużej). probkowania Listing 7.1: Test porównawczy różnych metod różniczkowania numerycznego stosowanych w CPS % diff_cps.m clear all; close all; K = 5; % liczba wezlow/wag filtra w = 0 : pi/100 : pi; d1=1/12*[-1 8 0 -8 1], % d1 = [-0.0833 0.6667 0 -0.6667 0.0833 ] d2=firls(K-1,[0 0.5 0.7 1],[0 0.5*pi 0 0],’differentiator’), % d2 = [-0.0890 0.6862 0 -0.6862 0.0890 ] d3=firpm(K-1,[0 0.5 0.7 1],[0 0.5*pi 0 0],’differentiator’), d3 = [-0.0295 0.6474 0 -0.6474 0.0295 ], pause plot( 0:0.01:0.5, 0:0.01:0.5,’k.’, ... w/pi, abs(freqz(d1,1,w))/pi,’b-’, ... w/pi, abs(freqz(d2,1,w))/pi,’r--’, ... w/pi, abs(freqz(d3,1,w))/pi,’m-.’); xlabel(’f/fnorm’); title(’|D(fnorm)|’); grid; legend(’REF’,’DIFF’,’LS’,’MIN-MAX’); Problem 7.5 ((L)* Różniczkowanie w CPS). Zapoznaj si˛e z programem 7.1. Zwróć uwag˛e na problemy z projektowaniem filtra różniczkujacego ˛ typu min-max, który zwraca czasami za duża˛ liczb˛e wag. Zmień wartość K na wi˛eksza: ˛ czy filtry różniczkujace ˛ CPS bardziej upodabniaja˛ si˛e do filtra idealnego (linia prosta)? Zapoznaj si˛e z opisem funkcji firls(), firpm() i spróbuj zaprojektować lepsze filtry różniczkujace. ˛ Zastosuj otrzymane wagi filtrów do sygnału sinusoidalnego: czy sinus staje si˛e kosinusem oraz czy amplituda sygnału wynikowego rośnie liniowo wraz ze wzrostem cz˛estotliwości sygnału przetwarzanego? 144 7 Różniczkowanie i całkowanie funkcji/danych 7.3.6 Różniczkowanie w wielu wymiarach Analizowane i przetwarzane dane sa˛ jednowymiarowe (np. mowa, muzyka), dwuwymiarowe (np. obrazy), trójwymiarowe (np. z medycznych urzadzeń ˛ tomografii komputerowej i rezonansu magnetycznego), itd. Dlatego zasadnym jest pytanie czy wiedza dotyczaca ˛ różniczkowania 1D da si˛e zastosować w przypadku multi-D. Odpowiedź jest twierdzaca. ˛ Przejście z wyprowadzonymi wzorami do wielu wymiarów nie jest skomplikowane w przypadku prostokatnej ˛ siatki w˛ezłów. Wtedy różniczkowanie po poszczególnych wymiarach/zmiennych przekłada si˛e na stosowanie reguł różniczkowania numerycznego wzdłuż kierunków siatki. Przypadkiem trudniejszym jest siatka nierównomierna (np. obszar dzielony na trójkaty). ˛ Przykład: wykrywanie kraw˛edzi w obrazach. Cz˛estym zadaniem w przetwarzaniu obrazów jest wyodr˛ebnianie poszczególnych, widocznych obiektów, a potem ich automatyczne rozpoznawanie (twarzy, rzeczy, ..., pieszych, samochodów, ...). Operacje różniczkowania numerycznego sa˛ stosowane do wzmacniania kraw˛edzi obiektów, gdyż daja˛ wyniku duża˛ wartość podczas gwałtownej zmiany pikseli obrazu: coś si˛e kończy i coś innego zaczyna. Proces różniczkowania 2D obrazu można przedstawić jako sumowanie 2D lokalnych wartości pikseli, po ich uprzednim przeskalowaniu przez specjalnie dobrane współczynniki maski. W zależności od użytych wag, jest realizowana inna funkcja przetwarzania, podobnie jak to miało miejsce w przypadku 1D (patrz tabela 7.1). Proces skalowania danych współczynnikami wagowymi, czyli ważenia istotnosci danych, można również tłumaczyć z użyciem znanego już nam poj˛ecia splotu 1D/2D danych z wagami (odpowiedzia˛ impulsowa) ˛ układu przetwarzania (patrz równanie (3.11)). Idea tworzenia masek 2D jest prosta: powtarzaja˛ one najcz˛eściej wartości masek 1D w wybranym kierunku. Przykładowo, niżej przedstawione trzy maski: 0 1 0 0 0 0 0 1 0 0 0 0, 1 −2 1, 1 −4 1, (7.30) 0 −1 0 0 0 0 0 1 0 służa˛ do obliczenia (kolejno, od strony lewej do prawej): 1. pierwszej pochodnej obrazu w pionie z użyciem centralnego ilorazu różnicowego (detekcja skoku wartości w pionie, czyli kraw˛edzi poziomych), 2. drugiej pochodnej obrazu w poziomie - iloraz ilorazów różnicowych pierwszego rz˛edu (detekcja przyspieszenia zmian wartości w poziomie, czyli kraw˛edzi pionowych), 3. drugiej pochodnej obrazu w obu kierunkach (detekcja przyspieszenia zmian wartości w dowolnym kierunku, czyli kraw˛edzi w dowolnym kierunku). Przykładowe wagi najprostszych, różniczkujacych ˛ masek 2D sa˛ zebrane w tabeli 7.3. Zostały one użyte w programie 7.2 do zróżniczkowania standardowego obrazu Lena.bmp - wynik tej operacji jest pokazany na rys. 7.5. Listing 7.2: Przykład różniczkowania obrazu i wykorzystania tego do wzmocnienia jego kraw˛edzi % diff_image.m clear all; close all; [im1,map] = imread(’lena512.bmp’); % wczytaj obraz figure; imshow(im1,map); title(’Wejsciowy obraz’); w = [ 0, 1, 0; ... % 1, -4, 1; ... % 0, 1, 0 ]; % uzyta maska/filtr 7.3 Różniczkowanie numeryczne 145 Rysunek 7.5 Wynik obliczenia drugiej pochodnej obrazu Lena.bmp w obu kierunkach - przykład detekcji kraw˛edzi o dowolnym nachyleniu z użyciem wag typu laplasjan. Przetwarzony obraz Tabela 7.3: Definicja wag macierzy różniczkujacych ˛ obraz (wagi masek filtrujacych) ˛ Rodzaj filtru Zastoswanie Definicja Różniczkowanie Kraw˛edzie — | 1 2 1 Sobel: 0 0 0 −1 −2 −1 1 0 −1 2 0 −2 1 0 −1 1 1 1 Prewitt: 0 0 0 −1 −1 −1 1 0 −1 1 0 −1 1 0 −1 Różniczkowanie Kraw˛edzie ⧸⧹ 1 0 Roberts: 0 −1 0 1 −1 0 1 1 1 skew: 1 −2 −1 1 −1 −1 1 1 1 −1 −2 1 −1 −1 1 Podwójne różniczkowanie Kraw˛edzie dowolne 0 −1 0 −1 4 −1 0 −1 0 1 −2 1 −2 4 −2 1 −2 1 −1 −1 −1 −1 8 −1 −1 −1 −1 −1 −1 −1 −1 − 1 −1 −1 −1 −1 −1 −1 −1 24 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 Laplasjan z Gaussa Kraw˛edzie dowolne 00 1 00 0 1 2 1 0 1 2 −16 2 1 0 1 2 1 0 00 1 00 0 1 1 2 2 2 1 1 0 1 2 4 5 5 5 4 2 1 1 22 2 110 4 55 5 4 2 1 5 30 3 5 4 1 3 −12 −24 −12 3 5 2 0 −24 −40 −24 0 5 2 3 −12 −24 −12 3 5 2 5 30 3 5 4 1 4 55 5 4 2 1 1 22 2 110 im2 = conv2( im1, w); % splot, filtracja, suma wazona figure; imshow(4*im2,map); title(’Przetwarzony obraz’); Problem 7.6 (* Różniczkowanie obrazu). Zmodyfikuj program 7.2: zastosuj w nim wszystkie macierze wag filtrów różniczkujacych ˛ z tabeli 7.3. Popraw skuteczność wizualizacji kraw˛edzi/tekstur poprzez nieliniowe skalowanie wartości pikseli. 146 7 Różniczkowanie i całkowanie funkcji/danych 7.4 Całkowanie numeryczne Najbardziej pogladowym ˛ zastosowaniem całkowania numerycznego jest obliczanie pr˛edkości i położenia na podstawie przyspieszenia, np. zmierzonego przez akcelerometr w naszym telefonie komórkowym (zrób to sam po lekturze tego podrozdziału!). 7.4.1 Proste kwadratury Newtona-Cotesa Podobnie jak w przypadku przybliżania numerycznego wartości pochodnych, narzucajacym ˛ si˛e rozwiazaniem ˛ w całkowaniu numerycznym jest interpolacja funkcji na N w˛ezłach i przybliżanie całki z funkcji całka˛ z wielomianu interpolacyjnego. Tak sa˛ definiowane kwadratury Newtona-Cotesa kolejnych rz˛edów (brawa dla szanownych Panów!) Stosujac ˛ analogi˛e do ilorazów różnicowych, możemy również oszacować dokładność przybliżenia wartości całki oznaczonej, czyli kwadratury szerokość razy wysokość, w zależności od pochodnych funkcji i wielkości kroku całkowania. Też to pokażemy. Poniżej podano wzory kwadratur Newtona-Cotesa kolejnych rz˛edów dla stałego kroku h (I, II, III, IV - stopień wielomianu interpolacyjnego, funkcja y = f (x), yk = f (xk ), f (p) (x) - p-ta pochodna funkcji, c - pewien argument funkcji w przedziale całkowania): Zx2 Trapezy (I): x1 Zx3 Simpson (II): x1 Zx4 Simpson 3/8 (III): x1 Zx5 Boole (IV): x1 f (x) dx ≈ h f ′′ (c) 3 (y1 + y2 ) − h 2 12 (7.31) f (x) dx ≈ f (4) (c) 5 h (y1 + 4y2 + y3 ) − h 3 90 (7.32) f (x) dx ≈ 3 f (4) (c) 5 3h (y1 + 3y2 + 3y3 + y4 ) − h 8 80 (7.33) f (x) dx ≈ 8 f (6) (c) 7 2h (7y1 + 32y2 + 12y3 + 32y4 + 7y5 ) − h 45 945 (7.34) W tabeli 7.4 wyprowadzono wzór kwadratury Simpson II (7.32). Problem 7.7 ((L)* Obliczanie całki dla ćwiartki okresu funkcji sinus). Zastosuj wzory (7.31)-(7.34) do obliczenia całki z 41 okresu funkcji sinus, zakładajac ˛ równoodległe w˛ezły w przedziale [0, π2 : K=?; x=(0:K-1)*(pi/2)/K; y=sin(x);. Jaki jest poprawny wynik i jak duże bł˛edy otrzymałeś? Problem 7.8 (* Obliczanie pola koła). Pole koła o jednostkowym promieniu ma wartość π. Policzmy t˛e wartość metodami Newtona-Cotesa kolejnych rz˛edów na ćwiartce 7.4 Całkowanie numeryczne 147 Tabela 7.4: Przykład wyprowadzenia wzoru całkowania dla kwadratury Simpsona II. Nr Wzór Komentarz x2 1 p2 (x) = a0 + a1 x + a2 p2 (−h) = a0 + a1 (−h) + a2 (−h)2 2 p2 (0) Wielomian interpolujacy ˛ p(x) 2-ego stopnia = a0 + a1 · 0 + a2 · 02 Równania dla punktów (−h, yk−1 ), (0, yk ), (+h, yk+1 ) 2 3 4 5 p2 (+h) = a0 + a1 (+h) + a2 (+h) a 0 = yk yk+1 − yk−1 a1 = 2h 1 yk+1 + yk−1 a2 = 2 − yk h 2 Z +h 1 1 I= p2 (x)dx = a0 x + a1 x2 + a2 x3 2 3 −h I h 3 = 2yk h + Obliczone współczynniki a0 , a1 , a2 +h = −h 2 2a0 h + a2 h3 3 2h yk+1 +yk−1 − yk = 3 2 Po podstawieniu wielomianu do całki Po podstawieniu a0 , a2 (yk−1 + 4yk + yk+1 ) koła - co zaimplementowano w programie 7.3. Uruchom program, porównaj wyniki, otrzymywane z różnych metod. Dlaczego sa˛ one tak niedokładne? Jak możemy zmniejszyć bład? ˛ Listing 7.3: Program do obliczenia pola koła % integ_circle.m clear all; close all; format long; Methods={ % nazwa metody ’trapezy1’, ’simpson2’, ’simpson3’, ’bool4’ }; Ns=2:5; % liczba wezlow W={ % wagi wezlow: [1 1]/2, % trapezy 1 [1 4 1]/3, % Simpson 2 [1 3 3 1]*3/8, % Simpson 3 [7 32 12 32 7]*2/45 % Boole 4 }; alf = 0 : (pi/2)/200 : pi/2; c=cos(alf); s=sin(alf); for i = 1:length(Ns) % PETLA - wybor metody metoda = Methods{i} % nazwa metody N = Ns(i); % liczba wezlow h = 1/(N-1); % odleglosc pomiedzy wezlami x = 0 : h : 1; % kolejne wartosci x y = sqrt(1-x.^2); % kolejnosci wartosci y (x^2 + y^2 = 1) PI = sum( W{i} .* y )*h*4 % suma kwadratur, czyli calka figure; plot(c,s,’b-’,x,y,’ro’); title(metoda = Methods{i}); axis square; grid; end 148 7 Różniczkowanie i całkowanie funkcji/danych Rysunek 7.6: Ilustracja graficzna zadania całkowania wielo-w˛ezłowego jako złożenia (sumy) kwadratur prostych (bazowych) dla metody: (po lewej) trapezów, (po prawej) Simpsona. 7.4.2 Złożone kwadratury Newtona-Cotesa Na podstawie kwadratury bazowej w podstawowym przedziale interpolacji (mi˛edzy dwoma w˛ezłami (x1 , y1 )...(x2 , y2 ) dla wzoru trapezów z interpolacja˛ pierwszego stopnia, a pi˛ecioma w˛ezłami (x1 , y1 )...(x5 , y5 ) dla wzoru Boole’a z wielomianem interpolacyjnym czwartego stopnia) możemy wyznaczyć kwadratur˛e w dowolnym przedziale z wieloma w˛ezłami (x1 , y1 )...(xN , yN ) przez sumowanie kwadratur w przedziałach podstawowych: ZxN f (x) dx I( f , h) = (7.35) x1 Rysunek 7.6 ilustruje takie post˛epowanie. Wynikaja˛ z tego zwi˛ezłe wzory na całk˛e w przedziale N punktów, podane poniżej dla metody (oznaczenie: fk = f (xk ) = yk , zapisy alternatywne): • trapezów: IT 1 ( f , h) ≈ h N f ′′ (c) ( fk−1 + fk ) − (xN − x1 ) h2 , ∑ 2 k=2 12 h ( f1 + 2 f2 + 2 f3 + . . . + 2 fN−1 + fN ) , 2 N−1 h IT 3 ( f , h) ≈ ( f1 + fN ) + h ∑ fk , 2 k=2 IT 2 ( f , h) ≈ (7.36) (7.37) (7.38) • Simpsona (N = 2M + 1 - liczba nieparzysta): IS1 ( f , h) ≈ h M f (4) (c) ( f + 4 f + f ) − (xN − x1 ) h4 , 2k−1 2k 2k+1 ∑ 3 k=1 180 h ( f1 + 4 f2 + 2 f3 + 4 f4 + . . . + 2 f2M−1 + 4 f2M + f2M+1 ) , 3 h 2h M−1 4h M IS3 ( f , h) ≈ ( f1 + fN ) + f2k+1 + ∑ ∑ f2k , 3 3 k=1 3 k=1 IS2 ( f , h) ≈ (7.39) (7.40) (7.41) Prosz˛e zwrócić uwag˛e na inne oszacowanie bł˛edu. Nie omawiamy w tym miejscu rekursywnych zależności pomi˛edzy kwadraturami, używanych do zwi˛ekszania dokładności wyniku całkowania, oraz kwadratur Romberga (zob. np. Mathews). 7.4 Całkowanie numeryczne 149 Problem 7.9 (* Obliczanie całki dla połowy okresu funkcji sinus). Zastosuj wzory (7.36)-(7.41) do obliczenia wartości całki oznaczonej dla połowy okresu funkcji sinus, zakładajac ˛ równoodległe w˛ezły w przedziale [0, π]: K=?; x=(0:K-1)*pi/K; y=sin(x);. Jaki jest poprawny wynik i jak duże bł˛edy otrzymałeś, np. dla K = 7? Powtórz obliczenia dla coraz wiekszej liczby w˛ezłów. Wszystkie wyniki obliczeń zbierz w jednej tabeli. Porównaj bł˛edy. 7.4.3 Adaptacyjny dobór kroku całkowania Aby uzyskać wymagana˛ dokładność całkowania numerycznego dobiera si˛e adaptacyjnie długość kroku h. W tym celu szacuje si˛e popełniany bład ˛ obliczeń w stosunku do wartości dokładnej, otrzymywany dla kwadratur o długości kroku h (mniejszy) oraz 2h (wi˛ekszy). Jeśli dla kroku mniejszego bład ˛ jest mniejszy, to ten krok jest wybierany. Jako przykład przedstawimy poniżej adaptacyjna˛ implementacj˛e dla metody Simpsona. Dla 5-punktowego podprzedziału całkowania o w˛ezłach {x1 , ..., x5 } mamy: • dla pojedynczej kwadratury Simpsona dla w˛ezłów {x1 , x3 , x5 }: 16 f (4) (c1 ) 5 2h ( f1 + 4 f3 + f5 ) − h ; (7.42) 3 90 • dla sumy dwóch kwadratur Simpsona na w˛ezłach {x1 , x2 , x3 } oraz {x3 , x4 , x5 }: I( f , h) = S ( f1,3,5 , 2h) = I( f , h) = S ( f1,2,3,4,5 , h) = S ( f1,2,3 , h) + S ( f3,4,5 , h) , (7.43) gdzie: h f (4) (c2 ) 5 ( f1 + 4 f2 + f3 ) − h , 3 90 h f (4) (c3 ) 5 S ( f3,4,5 , h) = ( f3 + 4 f4 + f5 ) − h , 3 90 S ( f1,2,3 , h) = (7.44) (7.45) Kiedy zakłada si˛e równość pochodnych w oszacowaniu bł˛edu, to otrzymuje si˛e nastepujace ˛ wyrażenie na bład ˛ popełniany przez kwadratur˛e S( f1,2,3,4,5 , h) (bez dowodu): Zx5 ε= x1 f (x) dx − S ( f1,2,3,4,5 , h) ≈ 1 S ( f1,2,3,4,5 , h) − S ( f1,3,5 , 2h) . 15 (7.46) Porównujac ˛ aktualna˛ wartość bł˛edu ε, zależac ˛ a˛ od różnicy otrzymanych wyników dla kwadratur 5-punktowej i 3-punktowej, możemy podjać ˛ decyzj˛e o rekurencyjnym wywołaniu całkowania dla podprzedziałów, czyli o zag˛eszczeniu w˛ezłów. Proces takiej adaptacji można śledzić w Matlabie z ustawionym parametrem trace, np. dla funkcji quad(), przedstawionej na listing 7.4. Jest ona implementacja˛ adaptacyjnej metody Simpsona. Listing 7.4: Kod matlabowskiej funkcji quad() b˛edacej ˛ implementacja˛ adaptacyjnej metody Simpsona function [Q,fcnt,warn] = quadstep (f,a,b,fa,fc,fb,tol,trace,fcnt,hmin,varargin) 150 7 Różniczkowanie i całkowanie funkcji/danych %QUADSTEP Recursive core routine for function QUAD. maxfcnt = 10000; % Evaluate integrand twice in interior of subinterval [a,b]. h = b - a; c = (a + b)/2; if abs(h) < hmin | c == a | c == b % Minimum step size reached; singularity possible. Q = h*fc; warn = 1; return end x = [(a + c)/2, (c + b)/2]; y = feval(f, x, varargin{:}); fcnt = fcnt + 2; if fcnt > maxfcnt % Maximum function count exceeded; singularity likely. Q = h*fc; warn = 2; return end fd = y(1); fe = y(2); % Three point Simpson’s rule. <-------------------------------------------Q1 = (h/6)*(fa + 4*fc + fb); % Five point double Simpson’s rule. <-------------------------------------Q2 = (h/12)*(fa + 4*fd + 2*fc + 4*fe + fb); % One step of Romberg extrapolation. <------------------------------------Q = Q2 + (Q2 - Q1)/15; if ~isfinite(Q) % Infinite or Not-a-Number function value encountered. warn = 3; return end if trace disp(sprintf(’%8.0f %16.10f %18.8e %16.10f’,fcnt,a,h,Q)) end % Check accuracy of integral over this subinterval. <---------------------if abs(Q2 - Q) <= tol warn = 0; return % Subdivide into two subintervals. <--------------------------------------else [Qac,fcnt,warnac] = quadstep(f,a,c,fa,fd,fc,tol,trace,fcnt,hmin,varargin{:}); [Qcb,fcnt,warncb] = quadstep(f,c,b,fc,fe,fb,tol,trace,fcnt,hmin,varargin{:}); Q = Qac + Qcb; warn = max(warnac,warncb); end 7.4.4 Kwadratury Gaussa-Lagrange’a Jak już wiemy, prosty algorytm trapezów daje dokładne wyniki dla wielomianów do pierwszego stopnia włacznie. ˛ Pomysłem na lepsza˛ kwadratur˛e jest przesuni˛ecie w˛ezłów do takiego położenia, aby całka była dokładna również dla wielomianów wyższego stopnia. Ilustruje to rysunek 7.7 dla przedziału całkowania [−1, 1]. 7.4 Całkowanie numeryczne 151 Rysunek 7.7 Ilustracja graficzna istoty metody całkowania numerycznego z użyciem kwadratur Gaussa-Lagrange. Załóżmy, że zmodyfikowana w ten sposób metoda trapezów ma być dokładna dla wielomianów do stopnia 3. Chcemy tak dobrać w˛ezły {x1 , x2 } i skojarzone z nimi wagi {w1 , w2 }, żeby równość: Z1 f (x)dx = w1 f (x1 ) + w2 f (x2 ) (7.47) −1 była spełniona dla czterech funkcji: f (x) = 1, x, x2 , x3 . (7.48) Daje to układ równań nieliniowych (po prawej mamy wartość całki obliczonej analitycznie dla kolejnej funkcji): w1 + w2 = 2, w1 x1 + w2 x2 = 0, (7.49) 2 w1 x1 2 + w2 x2 2 = , 3 w1 x1 3 + w2 x2 3 = 0. Jego rozwiazaniem ˛ sa˛ nast˛epujace wartości wag wk oraz argumentów xk : w1 = w2 = 1 (7.50) 1 − x1 = x2 = √ 3 (7.51) Ostatecznie wyrażenie (7.47) przyjmuje nast˛epujac ˛ a˛ postać (z oszacowaniem bł˛edu, którego nie wyprowadzamy): Z1 f (x)dx = f −1 −1 1 f 4 (c) √ +f √ + 135 3 3 (7.52) Natomiast kwadratura Gaussa-Lagrange’a wykorzystujaca ˛ 3 w˛ezły (jej wyprowadzenie jest podobne) jest zdefiniowana nast˛epujacym ˛ wzorem: Z1 f (x)dx = −1 p i f 6 (c) 1h p 5 f − 3/5 + 8 f (0) + 5 f 3/5 + 9 15750 (7.53) 152 7 Różniczkowanie i całkowanie funkcji/danych W praktyce dla kwadratur wyższego rz˛edu położenia w˛ezłów (które sa˛ zerami wielomianów Legendre’a) sa˛ pami˛etane w procedurach całkowania, w postaci przeliczonej z określona˛ dokładnościa.˛ Problem 7.10 (* Sprawdzenie metody Gaussa-Lagrange’a dla dwóch w˛ezłów). Sprawdź analitycznie, czy wagi (7.50) oraz argumenty/w˛ezły (7.51), rzeczywiście spełniaja˛ wszystkie równania układu równań (7.49). Oblicz jaki bład ˛ całkowania oferuja˛ one dla wielomianu czwartego stopnia y = f (x) = x4 ? Czy zastosowanie wzoru (7.53) poprawia w tym przypadku wynik? Problem 7.11 (** Wyprowadzenie wzoru metody Gaussa-Lagrange’a dla trzech w˛ezłów). Spróuj wyprowadzić analitycznie równanie (7.53). Zmiana granic przedziału całkowania . Problemem, który pozostaje jeszcze do rozwiazania, ˛ jest określenie jak można zastosować kwadratury, wyprowadzone dla standardowego przedziału [−1, 1], w przypadku dowolnego przedziału [a, b]. Należy zastosować nast˛epujace ˛ podstawienie zmiennych: a+b b−a b−a + x, dt = dx (7.54) 2 2 2 Wówczas całka oraz N-punktowa kwadratura Gaussa dla przedziału [−1, 1] z w˛ezłami (wagami) {xN,k , wN,k } sa˛ odpowiednio równe: t= Z1 Zb f (t) dt = a f −1 b−a a+b b−a + x dx, 2 2 2 b−a N GN ( f , a, b) = ∑ wN,k f 2 k=1 a+b b−a + xN,k . 2 2 (7.55) (7.56) Przykładowo funkcja Matlaba quadl() jest implementacja˛ adaptacyjnej metody Gaussa-Legendre’a z 4/7 w˛ezłami. Problem 7.12 (** Całkowanie w niestandardowym przedziale). Oblicz całk˛e oznaczona˛ funkcji kosinus w przedziale [− π2 , π2 ] oraz funkcji sinsus w przedziale [0, π], stosujac ˛ podstawienie (7.54) w 2-punktowej i 3-punktowej metodzie Gaussa-Lagrange’a. Porównaj otrzymane wyniki. Jaka jest wartość poprawna? Przykład: obliczenie prawdopodobieństwa na podstawie zadanej funkcji g˛estości prawdopodobieństwa. W celu porównania dokładności różnych metod całkowania numerycznego scałkujemy praktycznie funkcj˛e gaussowska˛ N(0, 1): 1 2 1 f (x) = √ e− 2 x , 2π (7.57) w przedziale [−3σ , +3σ ]. Zakładamy, że opisuje ona g˛estość prawdopodobieństwa, czyli powinniśmy otrzymać wartość bliska˛ 1. Przybliżenie szukanej wartości, obliczonej w j˛ezyku Matlab za pomoca funkcji erf(), jest równe: 7.4 Całkowanie numeryczne 153 erf(3/sqrt(2)) = 0.99730020393674. Całkowana funkcja została zadana nast˛epujac ˛ a˛ instrukcja: ˛ f=inline(’1/sqrt(2*pi)*exp(-x.ˆ2/2)’). W tabeli 7.5 sa˛ przedstawione otrzymane wyniki. Jak widać prosta metoda Simpsona okazała si˛e bardzo skuteczna. Jednak zdecydowanie wygrały metody hybrydowe (quad()) oraz adaptacyjne (quadl()), zaimplementowane w funkcjach Matlaba o podanych nazwach. Tabela 7.5: Porównanie dokładności różnych metod całkowania numerycznego na przykładzie funkcji gaussowskiej (7.57) (przyj˛eto h=0.6) Metoda Implementacja Wartość całki Bład ˛ Trapezy, krok 0.6, 11 w˛ezłów, 10 podprzedz. x=-3:0.6:3; w=ones(size(x)); w(2:1:end-1)=2; c=0.6/2*w*f(x)’; 0.99653089305 -7.69e-4 Simpson 1/3, krok 0.6, 11 w˛ezłów, 5 podprzedz. x=-3:0.6:3; N=length(x); w=ones(1,N); w(3:2:N-2)=2; w(2:2:N-1)=4; c=0.6/3*w*f(x)’; 0.99719530908 -1.05e-4 Gauss, 3 w˛ezły x=[-sqrt(3/5) 0 sqrt(3/5)]; w=1/9*[5 8 5]; c=3*w*f(3*x)’; x=[-sqrt(3/5) 0 sqrt(3/5)]; w=1/9*[5 8 5]; c=w*f(x-2)’+w*f(x)’+w*f(x+2)’; 1.15321648276 0.15 0.99763817396 3.38e-4 Simpson+Newton-Cotes, tolerancja 1e-6, 57 wywołań funkcji [c,i]=quad(f,-3,3); 0.99729991863 -2.9e-7 Gauss-Lagrange, tolerancja 1e-6, 48 wywołań funkcji [c,i]=quadl(f,-3,3); 0.99730020452 5.9e-10 Gauss, 3 podprzedz. po 3 w˛ezły Problem 7.13 (* Porównanie bł˛edów różnych metod całkowania numerycznego funkcji gaussowskiej). Zapoznaj si˛e z programem 7.5. Sprawdź czy kod z tabeli 7.5 został w nim poprawnie zaimplementowany. Uruchom program i porównaj bł˛edy całkowania numerycznego, otrzymane dla różnych metod. Zmień wartość kroku h jeśli jest on parametrem metody (obecnie przyj˛eto h=0.6). Zmień całkowana˛ funkcj˛e na inna˛ i powtórz eksperyment. Analitycznie oblicz wartość poprawna˛ całki. Która metoda okazała si˛e najlepsza? Listing 7.5: Test porównawczy różnych metod całkowania numerycznego % integ_erf_compare.m % Porownanie roznych metod podczas calkowania funkcji erf() clear all; close all; c_erf = erf( 3/sqrt(2) ), f = inline( ’1/sqrt(2*pi)*exp(-x.^2/2)’ ); h = 0.6; % wartosc obliczona przez Matlaba % calkowana funkcja % odleglosc pomiedzy wezlami x = -3 : h : 3; w = ones(size(x)); w(2:1:end-1) = 2; % metoda trapezow % wagi 154 7 Różniczkowanie i całkowanie funkcji/danych c_trapez = h/2*w*f(x)’, % suma iloczynow (kwadratur) x=-3 : h : 3; N = length(x); w = ones(1,N); w(3:2:N-2)=2; w(2:2:N-1)=4; c_simpson13 = h/3*w*f(x)’, % metoda Simpsona 1/3 % wagi % suma iloczynow (kwadratur) x=[-sqrt(3/5) 0 sqrt(3/5)]; w=1/9*[5 8 5]; c_gauss3 = 3*w*f(3*x)’, % metoda Gaussa 3 wezly % suma iloczynow (kwadratur) x=[-sqrt(3/5) 0 sqrt(3/5)]; w=1/9*[5 8 5]; c_gauss33 = w*f(x-2)’+w*f(x)’+w*f(x+2)’, % metoda Gaussa 3*3 wezly % suma trzech sum [c_quad,i] = quad(f,-3,3), % metoda adaptacyjna Simpsona + Newtona-Cotesa [c_quadl,i] = quadl(f,-3,3), % metoda adaptacyjna Gaussa-Lagrange’a format longE % porownanie bledow [ abs(c_trapez-c_erf); abs(c_simpson13-c_erf); abs(c_gauss3-c_erf); ... abs(c_gauss33-c_erf); abs(c_quad-c_erf); abs(c_quadl-c_erf) ] 7.4.5 Całkowanie w wielu wymiarach Rozszerzenie algorytmów całkowania 1D na przypadek wielowymiarowy nie jest trudne. Ponieważ całkowanie po poszczególnych zmiennych można wykonać sekwencyjnie, tzn.: Zd Zb Zd f (x, y) dxdy = c a Zb F (y) dy , F (y) = c f (x, y = const) dx , (7.58) a dlatego realizacja numeryczna tego zadania b˛edzie polegać na dyskretyzacji całkowanej funkcji w wybranych lub narzuconych w˛ezłach wzdłuż zmiennej y, a nast˛epnie dla każdego dyskretnego w˛ezła y wzdłuż zmiennej x. Zauważmy, że skala problemu rośnie geometrycznie z ilościa˛ zmiennych. Przykład: Załóżmy, że dwuwymiarowa funkcja g˛estości prawdopodobieństwa wyst˛epienia łacznego ˛ dwóch zmiennych/zdarzeń niezależnych x i y jest określona przez funkcj˛e Gaussa N(0, σ 2 ): 2 2 1 − 12 x σ+y2 p (x, y) = e . (7.59) 2πσ 2 Obliczmy, jakie jest prawdopodobieństwo równoczesnego przyj˛ecia przez obie zmienne wartości wi˛ekszej od σ , ale mniejszej od 3σ , czyli leżacej ˛ w przedzoale (σ , 3σ ). Rozwiazaniem ˛ jest całka dwuwymiarowa: Z3σZ3σ p (x, y) dxdy. (7.60) σ σ zaimplementowana w programie 7.6. Fragment całkowanej funkcji jest pokazany na rysunku 7.8. 7.5 Podsumowanie 155 Rysunek 7.8 Fragment dwuwymiarowej funkcji (7.60), całkowanej w naszym przykładzie. Listing 7.6: Przykład całkowania 2D w Matlabie % integ_2D.m % Calkowanie 2D clear all; close all; sigma=1; [X, Y] = meshgrid(1:0.2:3,1:0.2:3); p = 1/(2*pi*sigma^2)*exp(-1/2*(X.^2+Y.^2)/sigma^2); figure; surf(X,Y,p); xlabel(’x’); ylabel(’y’); title(’p(x,y)’); w = 0.2/2*[1 2*ones(1,9) 1]; c = w*p*w’, % wartosc parametru % zmiennosc argumentow x, y % wartosci funkcji w punktach (x,y) % zobacz co calkujesz % opis rysunku % metoda trapezow % calka 2D Problem 7.14 (* Całkowanie w dwóch wymiarach). Zmodyfikuj program 7.6 tak, aby obliczyć prawdopodowieństwo łacznego ˛ wystapienia ˛ obu zmiennych w przedziale (−σ , σ ). 7.5 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. 1. Algorytmy różniczkowania i całkowania numerycznego bazuja˛ na zastosowaniu interpolacji wielomianowej pomi˛edzy wybranymi/zadanymi w˛ezłami funkcji. 2. Przy takim podejściu wyprowadzanie formuł numerycznych jest łatwe i wynika z prostych reguł analitycznego różniczkowania i całkowania wielomianów. 3. Ponieważ różniczkowanie jest wrażliwe na zaburzenie danych (bł˛edy reprezentacji, zakłócenia, szumy), dlatego praktyczne podejście łaczy ˛ różniczkowanie i filtracj˛e dolnopasmowa˛ (odszumianie). 4. Różniczkowanie jest stosowane do detekcji zmian (np. kraw˛edzi w obróbce obrazów). 156 7 Różniczkowanie i całkowanie funkcji/danych 5. Całkowanie numeryczne polega na wyznaczaniu pola (kwadratury) pod wielomianem interpolujacym. ˛ 6. Podczas całkowania numerycznego możliwy jest adaptacyjny dobór kroku całkowania w zależności od zmienności funkcji całkowanej. Ma to na celu uzyskanie zadanej dokładności - monitorujemy wówczas zmian˛e wyniku przy zmianie kroku. 7. Wymuszenie położenia w˛ezłów interpolacji zwi˛eksza dokładność całkowania, co ma miejsce w kwadraturach Gaussa-Legendre’a. Literatura 1. B. Author, Title. Publisher, City, Year. 2. C. Moler: “Quadrature”, in Numerical Computing with Matlab, on-line: https:// www.mathworks. com/ moler/ chapters.html.html Rozdział 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy Streszczenie Przykłady zastosowań analizy wartości/wektorów własnych macierzy w technice i obliczeniach numerycznych. Definicja dekompozycji macierzy wzgl˛edem wartości własnych (EVD). Klasyfikacja zagadnień własnych. Metody obliczania wartości/wektorów własnych: dekompozycji QR, przekształceń przez podobieństwo, pot˛egowa. Dekompozycja macierzy wzgl˛edem wartości osobliwch (SVD): definicja i zastosowania (rozwiazywanie ˛ układów równań nadokreślonych, aproksymacja macierzy - np. kompresja obrazów). 8.1 Wprowadzenie - przykłady zastosowań EVD Poniżej wymieniono przykładowe, ważne zastosowania techniczne i numeryczne obliczania wartości i wektorów własnych macierzy, a patrzac ˛ szerzej - jej dekompozycji wzgl˛edem wartości własnych (EVD - Eigen Value Decomposition). 1. Sprowadzanie opisu systemu dynamicznego z zależnościami wzajemnymi do problemów niezależnych (structure analysis) 2. Wydzielanie składowych nieskorelowanych w danych - Karhunen-Loeve Transform (KLT). Redukcja wymiarowości opisu danych przez pomini˛ecie najmniej istotnych elementów zwiazanych ˛ z najmniejszymi wartościami własnymi macierzy - Principal Component Analysis (PCA). Analiza spektralna grafów, majaca ˛ szerokie zastosowania, np. w algorytmach pozycjonowania stron internetowych. 3. Selekcja i ekstrakcja najistotniejszych (najbardziej różnicujacych) ˛ cech w klasyfikacji, np. podczas automatycznego rozpoznawaniu kształtów – liter, twarzy, sygnałów, zmian zwyrodnieniowych na zdj˛eciach rentgenowskich, obiektów na polu walki. 4. Projektowanie optymalnego kształtu sygnałów transmitowanych przez dyspersyjny kanał w telekomunikacji (eigenfilter), wyznaczanie optymalnego korektora linii transmisyjnej z formy kwadratowej (Rayleigh quotient), dodawanie cyklicznego prefiksu w ortogonalnej transmisji OFDM/DMT z wieloma nośnymi, w celu uzyskania macierzy splotowej linii z wektorami własnymi równymi wierszom macierzy dyskretnej transformacji Fouriera (DFT). 5. Obliczanie wskaźnika uwarunkowania κ układu równań liniowych Ax = b jako . Postosunku maksymalnej do minimalnej wartości własnej macierzy A: κ = λλmax min dobnie: obliczanie sztywności układu dynamicznego opisanego równaniem stanu x′ = Ax, gdzie ()′ oznacza pochodna.˛ Powyższa lista powinna przekonać każdego Czytelnika, że warto wygodnie usiaść ˛ w fotelu, poświ˛ecić 1-2 godziny i starannie przeczytać obecny rozdział, jeden z najważniejszych w tej ksia˛żce. Rozdział “robiacy ˛ różnic˛e” w przygotowaniu do rozwia˛ zywania przyszłych, poważnych problemów obliczeniowych. Zach˛ecam do deep learning ... 157 158 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy 8.2 Dekompozycja EVD: wartości i wektory własne macierzy 8.2.1 Definicja Podstawowe sformułowanie zagadnienia własnego ma nast˛epujac ˛ a˛ postać matematyczna: ˛ Ax = λ x, A → x =?, λ =? (8.1) Interpretacja powyższej zależności jest nastepujaca: ˛ dla macierzy kwadratowej A sa˛ poszukiwane takie realizacje v wektora x, których pomnożenie (transformacja) przez macierz A daje taki sam wynik jak pomnożenie przez stała˛ λ - czyli ich kierunek nie ulega zmianie, jest “własny”. Z tego powodu wektory v, spełniajace ˛ (8.1), sa˛ nazywane wektorami własnymi macierzy A, zaś powiazane ˛ z nimi stałe λ - wartościami własnymi. Równanie (8.1) jest równoważne homogenicznemu układowi równań ze wzgl˛edu na λ oraz x: (A − λ I) x = 0, (8.2) który ma nietrywialne rozwiazanie ˛ x ̸= 0 tylko wtedy, gdy: (A − λ I) = 0 ↔ p(λ ) = λ N + aN−1 λ N−1 + ... + a1 λ 1 + a0 = 0. (8.3) W ten sposób otrzymujemy “definicyjna” ˛ metod˛e obliczania wartości własnych macierzy, znana˛ z algebry liniowej, sprowadzajac ˛ a˛ si˛e do wyznaczenia wielomianu charakterystycznego macierzy p(λ ), zdefiniowanego właśnie przez (8.3), i poszukiwanie miejsc zerowych λ1 , ..., λN tego wielomianu. Jest to jednak sposób mało praktyczny numerycznie, ponieważ ma on złożoność N!, czyli duża,˛ i dodatkowo złe uwarunkowanie (patrz definicja w rozdziale 2). Zapisujac ˛ problem macierzowo (zbiorczo dla wszystkich istniejacych ˛ wektorów/wartości własnych), w zagadnieniu własnym poszukujemy dekompozycji macierzy A na dwie macierze składowe: • V - macierz kwadratowa,˛ zawierajaca ˛ w swoich kolumnach wszystkie istniejace ˛ wektory własne vi macierzy A, patrz równanie (8.1): v1 (1) v2 (1) · · · vN (1) v1 (2) v2 (2) · · · vN (2) V= . = v1 v2 · · · vN , (8.4) . . . .. .. .. .. v1 (N) v2 (N) · · · vN (N) • D - macierz diagonalna˛ z wartościami własnym λi na głównej przekatnej: ˛ λ1 0 · · · 0 0 λ2 · · · 0 D= . . . .. , . . . . . . . 0 0 · · · λN (8.5) dla których zachodzi równość (zauważ, że w równaniu (8.7) wykonaliśmy prawostronne mnożenie przez V−1 ): 8.2 Dekompozycja EVD: wartości i wektory własne macierzy 159 λ1 0 A · v1 v2 · · · vN = v1 v2 · · · vN · . .. 0 ··· λ2 · · · .. . . . . 0 0 ··· −1 AV = VD ↔ A = VDV , 0 0 .. . (8.6) λN A → V =? D =? (8.7) Uzupełnienie - dygresja. Uogólniona wartość własna λ i uogólniony wektor własny v ̸= 0 pary (p˛eku) macierzy A i B spełniaja˛ nast˛epujace ˛ równanie: Av = λ Bv → (A − λ B)v = 0, → (A − λ B) = 0. (8.8) 8.2.2 Przykłady liczbowe dla szczególnych macierzy Macierz diagonalna. Wywołaj funkcj˛e Matlaba [V,D] = eig(A) i sprawdź poprawność poniższego przykładu: 100 100 100 A = 0 2 0 (8.9) → V = 0 1 0 , D = 0 2 0 . 004 001 004 Macierz obrotu lewoskr˛etnego na płaszczyźnie (x, y) o kat ˛ ϕ jest równa: cos(ϕ) sin(ϕ) A= − sin(ϕ) cos(ϕ) (8.10) i ma rzeczywiste wartości własne tylko dla katów ˛ ϕ = 0 oraz ϕ = π. Wówczas kierunek obracanego wektora nie zmienia si˛e. Sprawdź to przez obrót dowolnego wektora oraz z użyciem funkcji Matlaba [V,D]=eig(A) . Macierz stochastyczna o sumie elementów w każdej kolumnie równej 1 (lewa macierz stochastyczna) ma najwi˛eksza˛ wartość własna˛ równa˛ 1. Mówi o tym twierdzenie Perrona-Frobeniusa. Sprawdź to dla macierzy: 0.1 0.0 0.4 D = 0.6 0.9 0.2 (8.11) 0.3 0.1 0.4 z użyciem kodu Matlaba: A=[0.1, 0.0, 0.4; 0.6, 0.9, 0.2; 0.3, 0.1, 0,4 ]; [V,D] = eig(A) Macierz jak wyżej może opisywać prawdopodobieństwa przejść (liczby od 0 do 1) w tzw. łańcuchach Markowa. Sa˛ one używane w modelowaniu przejść pomiedzy stanami układów dynamicznych, np. w sterowaniu, genetyce, analizie sieci. 8.2.3 Ważne właściwości i interpretacje 160 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy Właściwości. Poniżej zostały wymienione wybrane, ważne właściwości wartości i wektorów własnych. 1. Macierz o wymiarach N × N ma co najwyżej N różnych wektorów własnych i skojarzonych z nimi wartości własnych. 2. Wektory własne wyznaczaja˛ tylko kierunki i moga˛ mieć dowolna˛ długość. Tzn. jeśli wektor v jest rozwiazaniem ˛ równania (8.1), to jest nim także wektor av, gdzie a ̸= 0 jest dowolna˛ liczba˛ rzeczywista˛ (czyli wektor majacy ˛ ten sam kierunek co v). Zazwyczaj, w celu jednoznacznej reprezentacji, normuje si˛e wektory własne H do wartości/długości 1: vH i vi = 1 ((.) - hermitowska transpozycja, czyli transpozycja i sprz˛eżenie, dla wektorów rzeczywistych tylko transpozycja (.)T ). 3. Wartości własne moga˛ być rzeczywiste albo zespolone. Zbiór wartości własnych jest nazywany widmem macierzy. 4. Wektory własne dla różnych wartości własnych sa˛ liniowo niezależne. 5. Macierze hermitowskie (tj. symetryczne macierze zespolone, dla których jest prawdziwa zależność AH = (A∗ )T = A) maja˛ wartości własne rzeczywiste. 6. Macierz rzeczywista symetryczna, szczególny przypadek macierzy hermitowskiej, ma wartości własne rzeczywiste i wektory własne ortogonalne dla różnych wartości własnych (wtedy V−1 = VT oraz A = VDVT ). Macierz rzeczywista symetryczna dodatnio określona (patrz definicja w rozdziale 3 o macierzach i rachunku macierzowym) ma dodatnie wartości własne. 7. Wyznacznik macierzy jest równy iloczynowi jej wartości własnych. 8. Ufff ... “A Pan gada, gada, gada, ...” Mnożenie wektora przez macierz jako jego transformacja, kierunki niezmiennicze. Operacj˛e macierzowa˛ y = Ax możemy interpretować jako transformacj˛e wektora x w wektor y. Jeśli x b˛edzie wektorem własnym macierzy A, to efekt transformacji b˛edzie taki sam jak pomnożenie wektora x przez skalar (czyli tylko skalowanie, zmiana długości wektora). Kierunek wskazywany przez wektor własny jest wi˛ec kierunkiem niezmienniczym: nie ulega zmianie w wyniku transformacji. Przykład: Kierunki niezmiennicze dla macierzy diagonalnej (tylko skalowanie). Ponieważ macierz A ma w tym przypadku postać diagonalna,˛ wymagana˛ dla macierzy D, to kierunki niezmiennicze (wskazywane przez wektory własne) pokrywaja˛ si˛e z kierunkami osi układu współrz˛ednych. Interpretacja rozkładu macierzy na składowe z użyciem wartości/wektorów własnych. Zakładajac, ˛ że macierz A o wymiarach N × N jest rzeczywista i symetryczna, to jej dokompozycj˛e wzgl˛edem wektorów/wartości własnych A = VDVT można zapisać w prostszej postaci: vi (1) · vi (1) vi (2) · · · vi (N) vi (2) N N N , A = ∑ λi Ai = ∑ λi vi vTi = ∑ λi . .. i=1 i=1 (8.12) i=1 vi (N) gdzie vi to i-ty wektor własny (kolumna ortogonalnej macierzy V). Macierz A jest wi˛ec przedstawiana jako suma kwadratowych macierzy składowych Ai = vi vTi rz˛edu 1-szego o wymiarach N × N (uzyskanych przez pomnożenie i-tego pionowego wektora własnego przez swoja˛ transpozycj˛e), przeskalowanych przez skojarzone wartości własne λi (Mercer’s theorem, inaczej spectral theorem). Przybliżenie macierzy rzeczywistej symetrycznej. Jeśli w równaniu (8.12) uwzgl˛ednimy tylko K pierwszych składowych, zwiazanych ˛ z najwi˛ekszymi wartościami własnymi λi , to otrzymamy najlepsze przyblizenie macierzy A w sensie minimalizacji 8.3 Praktyczne inżynierskie przykłady użycia EVD 161 sumy kwadratów bł˛edów odchyłek wartości elementów macierzy aproksymujacej ˛ od wartości elementów macierzy oryginalnej. 8.3 Praktyczne inżynierskie przykłady użycia EVD 8.3.1 PCA - dekorelacja informacji wektorowej Załóżmy, że dysponujemy zbiorem, składajacym ˛ si˛e z K rejestracji wektorowych xk (n), k = 1...K, n = 1...N, np. codziennymi pomiarami temperatury (n odpowiada godzinom g1 , g2 , ..., gN ) w 5 miejscach w Polsce (K = 5) albo nat˛eżeniem procesów myślowych u 10 studentów w okresie sesji (K = 10), mierzonym co 1 godzin˛e poprzez pomiar nat˛eżenia pola magnetycznego wokół głowy. Łatwo możemy obliczyć macierz kowariancyjna˛ Σ tych obserwacji (o wymiarze odpowiednio 5 × 5 albo 10 × 10): E[x1 · x1 ] E[x1 · x2 ] · · · E[x1 · xK ] E[x2 · x1 ] E[x2 · x2 ] · · · E[x2 · xK ] (8.13) Σx = . .. .. .. .. . . . . E[xK · x1 ] E[xK · x2 ] · · · E[xK · xK ] gdzie E[xi · x j ] to wartość oczekiwana iloczynu zmiennych losowych xi oraz x j , po uprzednim odj˛eciu od nich wartości średnich. W uproszczeniu jest to macierz wartości średnich iloczynów zmiennych xi i x j po czasie n = 1...N. Jeśli elementy wektora sa˛ “skorelowane”, to wówczas wyst˛epuja˛ duże wartości poza diagonala˛ macierzy. Taka forma macierzy wskazuje, że w obserwowanych zachowaniach temperatury albo studentów wyst˛epuja˛ składowe wspólne. Jak wydzielić te składowe? Oznaczmy przez x wektor pionowy zawierajacy ˛ wszystkie pomiary/obserwacje w danej chwili (u nas miejsca pomiaru temperatury albo zbiór studentów). Wówczas równanie (8.13), macierz kowariancji w zbiorze obserwacji, można zapisać jako: Σx = E xxT (8.14) Poszukujemy takiej ortonormalnej transformacji wektora x na wektor y, zdefiniowanej przez macierz A: y = AT x, (8.15) która spowoduje, że składowe wektora y b˛eda˛ nieskorelowane, czyli macierz kowariancji b˛edzie dla tego wektora macierza˛ diagonalna˛ D: Σy = E yyT ≡ D. (8.16) Przekształcajac ˛ ostatni wzór otrzymujemy: Σy = E (Ax)(Ax)T = E AxxT AT = AE[xxT ]AT = AΣx AT . (8.17) Ponieważ macierz A jest ortogonalna, dlatego wynik ostatniego równania możemy także zapisać w postaci: AΣx AT = AT Σx A. (8.18) Teraz przyrównujemy (8.18) do macierzy D, tak jak w (8.16), potem mnożymy lewostronie przez macierz A i otrzymujemy: 162 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy A AT Σx A ≡ AD → Σx A = AD. (8.19) czyli równanie o strukturze (8.7). Wynika stad, ˛ że poszukiwana macierz ortogonalna A, dekorelujaca ˛ (“rozsupływujaca”) ˛ nasze dane, jest macierza,˛ która w swoich kolumnach ma wektory własne vk macierzy Σx , gdyż równanie (8.19) ma taka˛ sama˛ struktur˛e jak równanie definicyjne (8.7) zagadnienia własnego. Wniosek. Dekorelowanie losowego wektora danych x to jego rzutowanie na wektory własne macierzy kowariancyjnej, czyli pomnożenie analizowanego wektora przez ortogonalna˛ macierz ww. wektorów własnych. Analizowany wektor x jest wówczas przedstawiany jako suma wektorów własnych vk macierzy kowariancyjnej Σx , czyli jej kolumn, przeskalowanych przez współczynniki obliczonego wektora y: K x= ∑ yk vk . (8.20) k=1 Operacja taka jest znana jako transformacja Karhunena-Loeve’ego. Problem 8.1 ((L)* Automatyczne, głosowe wybieranie numeru telefonu w samochodzie). W programie 8.1 zastosowano dekompozycj˛e EVD w wersji analizy PCA do separacji dźwi˛eków nagranych przez dwa mikrofony w samochodzie (tatakierowca chce zadzwonić i głosowo wybiera numer telefonu, dzieci-pasażerowie słuchaja˛ głośno muzyki na tylnym siedzeniu). Przeanalizuj program, uruchom go. Zastap ˛ sygnały nagrane swoimi sygnałami: nagranymi lub zsyntezowanymi, zwi˛eksz liczb˛e źródeł dźwi˛eku i mikrofonów. Listing 8.1: Przykład zastosowania analizy wektorów głównych PCA do separacji dźwi˛eków pochodzacych ˛ z różnych źródeł zarejestrowanych przez kilka mikrofonów % evd_pca.m % Separacja zrodel - nagrania clear all; close all; [y1,fpr1]=audioread(’mix1.wav’); y1=y1(:,1)’; % wczytaj nagrania z dwoch mikrofonow [y2,fpr2]=audioread(’mix2.wav’); y2=y2(:,1)’; % tylko pierwszy kanal, zmien kierunek size(y1), size(y2), pause % pokaz wymiary wektorow N = min( length(y1), length(y2) ), % dlugosc krotszego nagrania n = 1:N; y1=y1(1:N); y2=y2(1:N); % pozostaw taka sama liczbe probeka figure; subplot(211); plot(n,y1); title(’y1(n)’); grid; % pokaz oba subplot(212); plot(n,y2); title(’y2(n)’); grid; % nagrania soundsc(y1(1:7*fpr1),fpr1), pause % odsluchaj oba soundsc(y2(1:3*fpr2),fpr2), pause % nagrania % Separacja zrodel C1 = cov( y1, y2 ), y12 = [ y1-mean(y1); y2-mean(y2) ]; C2 = y12 * y12’/N, pause C = C2; % C = C1 albo C2 [V,D] = eig(C2), pause xe = V’ * [ y1; y2 ]; % Wynik separacji % macierz kowariancji Matlaba % odjecie wartosci srednich % macierz kowariancji Nasza % wybor macierzy % dekompozycja EVD % PCA - rzutowanie na wektory wlasne 8.3 Praktyczne inżynierskie przykłady użycia EVD 163 figure; subplot(211); plot(n,xe(1,:),’b’); title(’x1est(n)’); grid; subplot(212); plot(n,xe(2,:),’b’); title(’x2est(n)’); grid; soundsc(xe(1,:),fpr1), pause soundsc(xe(2,:),fpr2), pause 8.3.2 Rozprz˛eganie różniczkowych układów równań stanu układów dynamicznych Jednorodne równanie stanu obiektu dynamicznego jest zdefiniowanego nast˛epujaco: ˛ ẋ = Ax (8.21) gdzie: • x oznacza wektor zmiennych stanu układu, • ẋ - wektor pochodnych tych zmiennych po czasie, • A - macierz współczynników. Znajomość wartości i wektorów własnych macierzy A stanu układu/obiektu ma dla nas bardzo duże znaczenie, ponieważ wielkości te dobrze charakteryzuja˛ taki obiekt. Przykładowo obiekt dynamiczny dwuinercyjny (dwie stałe czasowe T1 i T2 ), nieoscylacyjny, opisany równaniem różniczkowym drugiego rzedu (np. czujnik temperatury w obudowie), ma nast˛epujac ˛ a˛ transmitancj˛e (także drugiego rz˛edu, s - zmienna transformacji Laplace’a): G (s) = K . (1 + sT1 ) (1 + sT2 ) (8.22) Macierz A równania stanu, determinujaca ˛ własności dynamiczne obiektu, jest w tym przypadku równa: T1 +T2 − T1 T2 − T11T2 A= , (8.23) 1 0 i ma wielomian charakterystyczny p(λ ) postaci: 1 1 1 T1 + T2 p (λ ) = det [A − λ I] = λ + λ+ = λ+ λ+ , T1 T2 T1 T2 T1 T2 2 (8.24) oraz nast˛epujace ˛ wartości własne λ i wektory własne v (zaznaczone tym samym kolorem): 1 λ1 = − , T1 1 λ2 = − , T2 1 v1 = −T1 T , 1 v2 = −T2 T . (8.25) W zwiazku ˛ z powyższym macierz stanu A układu można zapisać jako (wynik dekompozycji EVD): #" # " 1 −T2 −1 − T1 0 1 1 −1 T1 −T2 T1 −T2 A = VDV = . (8.26) T1 1 −T1 −T2 0 − T12 T −T T −T 1 2 1 2 164 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy Elementy a, b, c, d macierzy V−1 , podane powyżej, oblicza si˛e z definicji macierzy odwrotnej: 1 1 ab 10 −1 VV = · = , (8.27) −T1 −T2 cd 01 czyli z czterech równań: a + c = 1, −aT1 − cT2 = 0, b + d = 1, −bT1 − dT2 = 0. Załóżmy, że naszym zadaniem jest rozwiazanie ˛ równania różniczkowego (8.21). W zwiazku ˛ z powyższym wykonujemy nast˛epujace ˛ przekształcenia: ẋ = Ax (wyjściowe równanie stanu), −1 ẋ = VDV x −1 (8.28) (podstawiamy za A wynik dekompozycji EVD), −1 −1 −1 (8.29) V ẋ = V VDV x (mnożymy lewostronnie przez V ), (8.30) ẏ = Dy (upraszczamy V, nowa zmiena y). (8.31) gdzie: y = V−1 x. (8.32) Ponieważ macierz D jest diagonalna, to rozwiazanie ˛ równania różniczkowego (8.31) ze wzgledu na y nie jest trudne, a znajac ˛ y obliczamy x, czyli sumarycznie: ẋ = Ax → A = VDV−1 → ẏ = Dy → x = V · y. (8.33) Wi˛ecej pasjonujacych ˛ szczegółów z tego tematu zainteresowany Czytelnik może znaleźć w ksia˛żce Kaczorek T. “Macierze w Automatyce i Elektrotechnice”. 8.3.3 Rozrzut dwuwymiarowy wektora losowego I na koniec w tej cz˛eści przedstawimy prosty lecz pouczajacy ˛ przykład jak okrag ˛ może pomóc elipsie. Punkt leży na okr˛egu o promieniu 1 i o środku w poczatku ˛ układu współrz˛ednych, jeśli jego współrz˛edne (x, y) i zwiazany ˛ z nim wektor v = [x, y] spełniaja˛ nast˛epujace warunki: x vT · v = x y · = x2 + y2 = 1. (8.34) y Z kolej elipsa rozrzutu jest określona przez symetryczna˛ macierz kowariancyjna˛ S i równanie: uT S−1 u = r. (8.35) T Jeśli macierz kowariancji poddamy dekompozycji EVD (S = VDV ), podstawimy do równania (8.35) i b˛edziemy to równanie przekształcać dalej (dzielimy obie strony przez r i wprowadzamy zmienna˛ v) to otrzymamy: 8.3 Praktyczne inżynierskie przykłady użycia EVD Rysunek 8.1 Elipsa wygenerowana przez program 8.2, używajacy ˛ EVD. 165 Circle/Ellipse 2 1.5 1 y 0.5 0 -0.5 -1 -1.5 -2 -1 -0.5 0 0.5 1 x uT (VD−1 VT )u = r, uT (V(rD)−1 VT )u = 1, uT V(rD)−1/2 · (rD)−1/2 VT u = 1, | {z } | {z } vT v czyli równanie okr˛egu. Dlatego, aby otrzymać punkty leżace ˛ na elipsie, generujemy punkty v leżace ˛ na okr˛egu, spełniajace ˛ (8.34), a potem przekształcamy je poniższym równaniem na punkty u, leżace ˛ na elipsie: 1 u = V · (rD) 2 v. (8.36) Ten sposób generowanie punktów leżacych ˛ na elipsie i wewnatrz ˛ niej został zaimplementowany w programie 8.2. Otrzymano z niego rysunek 8.1. Listing 8.2: Program używajacy ˛ dekompozycji EVD do wygenerowania punktów leżacych ˛ na i wewnatrz ˛ elipsy % evd_elipsa.m clear all; close all; N = 1000; % Elipsa - symetryczna macierz kowariancji elipsy S = [ 1 0.5; ... % do zmiany 0.5 1 ]; % x = elipsa(S,1,N); figure; plot(x(1,:),x(2,:), ’ro’); grid; hold on; x = x .* (2*(rand(1,N)-0.5)); %x = x .* (0.33*(randn(1,N))); plot(x(1,:),x(2,:), ’b*’); grid; xlabel(’x’); ylabel(’y’); title(’Circle/Ellipse’); grid; axis square function x = elipsa(S,r,N) [V,D] = eig(S); V = V*sqrt(r*D); alfa = linspace(0,2*pi,N); x = V * [ cos(alfa); sin(alfa)]; end % EVD % macierz transformacji y (okrag) --> x (elipsa) % katy okregu % transformacja punktow okregu na elipse 166 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy Problem 8.2 (* Generowanie punktów leżacych ˛ na i wewnatrz ˛ elipsy). W programie 8.2 zastosowano dekompozycj˛e EVD, aby wygenerować punkty, leżace ˛ na i wewnatrz ˛ elipsy. Znajdź wpływ wartości elementów macierzy S na wielkość, nachylenie i szerokość elipsy. Sprawdź czy macierz V wektorów własnych ma zwiazek ˛ z macierza˛ rotacji prawoskr˛etnej (zgodnie z ruchem wskazówek zegara) o kat ˛ ϕ: cos(ϕ) sin(ϕ) R= . − sin(ϕ) cos(ϕ) 8.4 Wyznaczanie wartości i wektorów własnych 8.4.1 Klasyfikacja rodzajów zadań obliczeniowych i metod Wyznaczanie zbioru wartości własnych macierzy jest nazywane analiza˛ wartości własnych (eigenanalysis) oraz analiza˛ spektralna˛ macierzy (matrix spectrum). Wybór najdogodniejszej metody rozwiazania ˛ zagadnienia własnego zależy od celu rozwiazania ˛ i postaci dekomponowanej macierzy. Wyróżnia si˛e nast˛epujace przypadki, od których zależy stosowana metoda rozwiazania: ˛ • ze wzgl˛edu na poszukiwane wartości: 1. wszystkie wartości własne lub tylko wybrane (najmniejsze, najwi˛eksze), 2. poszukiwane sa˛ tylko wartości własne albo pary {wartość własna, wektor własny }, • ze wzgl˛edu na struktur˛e macierzy: 1. rzeczywista lub zespolona, 2. pełna lub rzadka, 3. specjalna, np. symetryczna. 8.4.2 Metoda pot˛egowa W metodzie pot˛egowej (power method, odmiany: inverse power, shifted inverse power) wyznacza si˛e jedynie najwi˛eksza˛ wartość własna˛ λmax i skojarzony z nia˛ wektor własny vmax . Działanie tej metody jest oparte na wielokrotnym, lewostronnym mnożeniu obu stron równania Ax = λ x przez macierz A i na wielokrotnym korzystaniu z zależności startowej Ax = λ x po prawej stronie równania przekształconego. W wyniku tego wyrażenie Ax jest zast˛epowane przez λ x i λ jest podnoszone do coraz wyższej pot˛egi, skad ˛ wynika nazwa metody: 8.4 Wyznaczanie wartości i wektorów własnych 167 Ax = λ x AAx = λ (Ax) = λ (λ x) = λ 2 x AAAx = λ 2 (Ax) = λ 2 (λ x) = λ 3 x .. .. . . i−1 i−1 i A...A | {z } x = λ (Ax) = λ (λ x) = λ x (8.37) i razy W pracy Mathews J.H. „Numerical Methods for ...” można znaleźć dowód wyprowadzenia algorytmu metody pot˛egowej, przedstawionego w tabeli 8.1. Startujemy w nim od wartości poczatkowej ˛ x0 (np. samych jedynek), a nast˛epnie przeprowadzamy obliczenia iteracyjne, prowadzace ˛ do znalezienia szukanych wartości λmax oraz vmax . Odmiany metody różnia˛ si˛e od oryginału tym, że wyznacza si˛e w nich wybrane pary {wartość własna, wektor własny}. Tabela 8.1: Wyznaczanie maksymalnej wartości własnej λmax oraz skojarzonego z nia˛ wektora własnego vmax za pomoca˛ metody pot˛egowej Krok Operacja Opis 1 2 3 4 k = 0, x0 = 1 k = k+1 yk = Axk−1 imaxabs = arg |{z} max {|yk (n)|} 5 λmax = yk (imaxabs ) 6 7 1 yk vmax = λmax xk = vmax , powrót do kroku 2 inicjalizacja licznika oraz wartości x0 zwi˛ekszenie licznika kolejny iloczyn znalezienie indeksu elementu o najwiekszej wartości bezwzgl˛ednej aktualna estymata λmax to wartość elementu wektora yk o znalezionym indeksie aktualna estymata vmax to unormowany wektor yk jeśli jest ciagle ˛ obserwowana zmiana wartości λmax n=1...N Program 8.3 implementuje metoda˛ pot˛egowa.˛ Listing 8.3: Programowa implementacja obliczania najwi˛ekszej wartości własnej i skojarzonego wektora własnego z użyciem metody pot˛egowej clear all; close all; if(1) A = [ 4 0.5; 0.5 1 ]; else A = magic(4); end [ N, N ] = size(A); % wybor/definicja symetrycznej macierzy kwadratowej x = ones(N,1); for i = 1:20 y = A*x; [ymax,imax] = max(abs(y)); x = y/ymax; lambda = ymax; end x, lambda, [ V, D ] = eig(A) % inicjalizacja % poczatek petli % pierwsze mnozenie % najwieksza wartosc abs() i jej indeks % wektor wlasny % wartosc wlasna % koniec petli % pokaz wynik: max wartosc wlasna i wektor wlasny % porownaj z funkcja Matlaba % wymiar % Na ekranie monitora otrzymujemy: x= 1.0000 0.1623 lambda = 4.0811 168 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy V= 0.1602 -0.9871 -0.9871 -0.1602 D= 0.9189 0 0 4.0811 Problem 8.3 (* Testowanie metody pot˛egowej). Zastosuj program 8.3 do wyznaczania maksymalnej wartości własnej i jej wektora własnego dla macierzy o coraz wiekszym wymiarze. Dlaczego wartość wektora x, wyświetlana na ekranie komputera, jest różna od wszystkich kolumn macierzy V (gdzie tkwi bład?), ˛ w sytuacji kiedy obliczona wartość lambda jest poprawna, gdyż wyst˛epuje na przekatnej ˛ macierzy D? Przykład zastosowania metody pot˛egowej - algorytm Google PageRank. Wyszukiwarka Google stosuje algorytmy rankingu wyników wyszukiwania stron internetowych według ich adekwatności do hasła wyszukiwania oraz według ważności w strukturze połaczeń ˛ stron. Algorytm PageRank opiera si˛e na analizie spektralnej grafu relacji mi˛edzy stronami internetowymi, czyli na analizie wektorów własnych odpowiedniej macierzy. Graf opisuje liczb˛e i ważność połaczeń ˛ (linków), wskazujacych ˛ do danej strony internetowej. Ważność danego linku jest tym wi˛eksza im wyższy jest ranking strony wskazujacej. ˛ Szczegóły algorytmu nie zostały opublikowane (zrób to sam! - możesz zostać milionerem lub noblista). ˛ Poniżej przedstawiono tylko znana,˛ ogólna˛ koncepcj˛e algorytmu. Równaniem do rozwiazania ˛ ze wzgl˛edu na wektor r (PageRank) jest w tym przypadku zależność: 1−d E r = 1 · r ↔ Ax = 1 · x, (8.38) dP + N gdzie: • P - macierz prawdopodobieństwa wyboru poszczególnych połaczeń pomi˛edzy stronami: element Pi, j określa prawdopodobieństwo przejścia ze strony i-tej do j-tej; suma wszystkich elementów w każdej kolumnie macierzy jest równa 1.0, • r – wektor własny, odpowiadajacy ˛ wartości własnej równej 1.0 (konsekwencja wartości 1 w równaniu (8.38 ) oraz właściwości suma = 1), • d – statystycznie wyznaczony współczynnik kontynuacji/poda˛żania (d - damping, tłumienie) za linkami (∼ 0.85), • N – liczba wszystkich powiazanych ˛ stron, • E – macierz z samymi jedynkami. Wektor rankingu stron PageRank r to wektor własny macierzy, zaznaczonej nawiasem kwadratowym [.]=A w równaniu (8.38), odpowiadajacy ˛ najwi˛ekszej wartości własnej. Czyli w tym zadaniu interesuje nas wyłacznie ˛ obliczenie najwiekszej wartości własnej i zwiazanego ˛ z nia˛ wektora. 8.4.3 Metoda przekształceń macierzy przez podobieństwo Metoda Jacobiego wyznacza wszystkie wartości i wektory własne, wykorzystujac ˛ przekształcenia macierzy przez podobieństwo. Może być ona zastosowana tylko dla macierzy symetrycznych. Idea˛ bazowa˛ tej metody jest taka iteracyjna rotacja układu 8.4 Wyznaczanie wartości i wektorów własnych 169 współrz˛ednych według kolejnych osi, aby sprowadzić dekomponowana˛ macierz do postaci diagonalnej. Rotacja macierzy A (transformacja przez podobieństwo - similarity transformation), wykorzystujaca ˛ ortogonalna˛ macierz rotacji R1 : RT1 AR1 = A′ , (8.39) A′ , nie zmienia wartości własnych macierzy. Dlatego macierz wynikowa podobna do macierzy oryginalnej A, oraz macierz A maja˛ takie same wartosci własne λk . W wyniku sekwencji N rotacji-transformacji chcemy otrzymać macierz diagonalna˛ D: RTN · · · RT2 [RT1 AR1 ]R2 · · · RN = D = diag (λ1 , λ2 , · · · , λN ), (8.40) czyli chcemy zamienić zadanie wejściowe na zadanie transformowane i to zadanie rozwiazać ˛ (zwróć uwag˛e na inne wektory własne y): Ax = λ x → Dy = λ y. (8.41) I tak robimy. Podstawmy jednak (8.40) do oryginalnego zadania własnego. Otrzymujemy wówczas (drugie równanie mnożymy lewostronnie przez R): Ax = λ x → (RT AR)x = λ x → A(Rx) = λ (Rx) → Ay = λ y, (8.42) gdzie R = R1 R2 · · · RN , y = Rx. (8.43) Jak widać rozwiazuj ˛ ac ˛ równanie podobne otrzymujemy takie same wartości własne, ale inne wektory własne: nie x tylko y. Ale znajac ˛ zleżność pomi˛edzy nimi, możemy obliczyć x znajac ˛ y na podstawie (8.43) . Jednak jak należy dobrać macierze rotacji? Zerowanie poszczególnych elementów pozadiagonalnych przez operacj˛e obrotu (transformacji przez podobieństwo) umożliwia macierz rotacji o ściśle określony kat ˛ ϕ: 1 (p) (q) .. . . .. . . . · · · · · · c · · · s · · · (p) .. .. . 1 . Ri = (8.44) , .. .. . . · · · · · · −s · · · c · · · (q) .. .. . . . . . .. .. . . 1 gdzie: 170 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy Aq,q − A p,p , 2A p,q sign(ξ ) p , t= |ξ | + 1 + ξ 2 1 c= √ , 1 + t2 s = t · c. ξ= (8.45) (8.46) (8.47) (8.48) i c reprezentuje wartość cos(ϕ), zaś s - wartość sin(ϕ). W wyniku sekwencji rotacji otrzymujemy macierz D z poszukiwanymi wartościami własnymi na głównej przekatnej ˛ oraz macierz R = R1 R2 ...RN sumarycznej rotacji, z poszukiwanymi wektorami własnymi w jej kolumnach: V = R. Przykład W ksia˛żce Yang-2005 podano nast˛epujacy, ˛ bardzo prosty przykład ilustujacy ˛ metod˛e Jacobiego. Symetryczna macierz A o wymiarach 3 × 3 ma tylko “jeden” element niezerowy A(1, 3) = A(3, 1) = 1 poza główna˛ przekatn ˛ a,˛ który należy wyzerować. W jej przypadku otrzymujemy: 2 0 A = 0 −2 1 0 1 0 , 2 3 0 D = 0 −2 0 0 0 0 , 1 0 − √12 R=V= 0 1 0 1 1 √ 0 √ 2 2 √1 2 (8.49) Poprawność tego wyniku demostruje program 8.4 Listing 8.4: Przykład pojedynczej rotacji w metodzie Jacobiego % evd_jacobi.m clear all; close all; A = [ 2 0 1; 0 -2 0; 1 0 2 ], % przyklad z Yang, 2005 % A = hankel( [1 2 3], [3,4,5] ), [N,N] = size(A), % Pojedyncza rotacja zerujaca element A(p,q) macierzy A p=1; q=3; xi = (A(q,q)-A(p,p)) / (2*A(p,q)); if( xi > -eps ) t = (abs(xi) + sqrt(1+xi^2)); else t = -(abs(xi) + sqrt(1+xi^2)); end c = 1 / sqrt(1+t^2), s = t * c, R1 = eye(N); R1(p,p) = c; R1(q,q) = c; R1(p,q) = -s; R1(q,p) = s; R1, A = R1.’ * A * R1, Odmiany metod rotacji. Od metody Jacobiego efektywniejsze sa˛ metody obrotów Householdera i Givensa, w których macierze obrotu sa˛ inaczej definiowane. Zapewniaja˛ one szybsza˛ zbieżność macierzy transformowanej do diagonalej. Zach˛ecami Czytelników do dalszego, samodzielnego zgłebiania tematu, np. do lektury „Numerical Recipes ...”. 8.4 Wyznaczanie wartości i wektorów własnych 171 Problem 8.4 (*** Pozytywnie zakr˛eceni programuja˛ metod˛e rotacji macierzy). Spróbuj napisać program implementujacy ˛ opisana˛ powyżej metod˛e przekształceń macierzy przez podobieństwo. Jego testowanie zacznij od macierzy (symetrycznej!) o wymiarach 4 × 4. Pami˛etaj, że po każdym przekształceniu przez podobieństwo powinieneś zerować najwi˛eksze (co do modułu) elementy macierzy przekształconej, leżace ˛ poza główna˛ przekatn ˛ a.˛ 8.4.4 Metoda dekompozycji QR Kiedy zainteresowani jesteśmy tylko wyznaczeniem wartości własnych macierzy, to można zastosować metod˛e dekompozycji QR, ponieważ w takim przypadku bardziej efektywne jest przekształcanie macierzy nie do postaci diagonalnej tylko do postaci trójkatnej ˛ górnej. Wówczas wartości własne otrzymuje si˛e na przekatnej ˛ głównej otrzymanej macierzy trójkatnej. ˛ Dekompozycja QR macierzy została skrótowo scharakteryzowana˛ w rozdziale 4, ale bez podania algorytmu obliczeniowego. Przeprowadźmy dekompozycj˛e QR macierzy A, której wartości własne chcemy obliczyć: A = QR, (8.50) gdzie: • Q - macierz ortgonalna, • R - macierz trójkatna ˛ górna. Jeśli przekształcimy teraz macierz A przez podobieństwo, mnożac ˛ ja˛ lewostronnie przez QT i prawostronnie przez Q, co nie zmienia wartości własnych macierzy, to otrzymamy: A1 = QT (A)Q = QT (QR)Q = RQ. (8.51) Jeśli postapimy ˛ tak samo, tylko w stosunku macierzy A1 , to: A1 = Q 1 R1 (8.52) T A2 = Q1 (A1 )Q1 = QT1 (Q1 R1 )Q1 = R1 Q1 , (8.53) a potem dla macierzy A2 : A2 = Q 2 R2 A3 = QT2 (A2 )Q2 (8.54) = QT2 (Q2 R2 )Q2 = R2 Q 2 , (8.55) i tak dalej, to macierz Ai w kolejnych iteracjach przekształca si˛e do macierzy trójkat˛ nej górnej (diagonalnej dla A symetrycznej, gdyż podobieństwo zachowuje struktur˛e macierzy), co pokazano w przykładzie. Listing 8.5: Przykład programu do znajdowania wszystkich wartości własnych macierzy metoda˛ dekompozycji QR % evd_qr.m clear all; close all; 172 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy if(1) A = [ 4 0.5; 0.5 1 ]; else A = magic(4); end [N,N]=size(A); x = ones(N,1); % analizowana macierz [Q,R] = qr(A); for i=1:30 [Q,R] = qr(R*Q); end A1 = R*Q, lambda = diag(A1), ref = eig(A), pause % Z ekranu komputera: A1 = 4.0811 -0.0000 -0.0000 0.9189 lambda = 4.0811 0.9189 ref = 0.9189 4.0811 % pierwsza dekompozycja QR % petla - start % kolejne iteracje % petla -stop % ostatni wynik % elementy na przekatnej % porownanie z Matlabem % jej wymiary % inicjalizacja Problem 8.5 ((L)* Znajdowanie wszystkich wartości własnych macierzy metoda˛ dekompozycji QR). Zapoznaj si˛e z programem 8.5. Zwi˛eksz wymiar macierzy. Zmień struktur˛e macierzy. Wybierz “trudne” macierze z wyznacznikiem bliskim 0. 8.5 Dekompozycja SVD: wartości i wektory osobliwe macierzy SVD (Singular Value Decomposition), czyli dekompozycja macierzy wzgl˛edem jej wartości osobliwych, jest podobna do dekompozycji EVD (Eigen Value Decompostion) wzgl˛edem wartości własnych macierzy. W odróżnieniu od niej może być zastosowana także dla macierzy prostokatnych ˛ (duży PLUS!). 8.5.1 Definicja i interpretacja Każda˛ nie kwadratowa˛ macierz A, o wartościach rzeczywistych i wymiarach M × N, można przedstawić jako wynik mnożenia trzech macierzy U, S, V: A = USVT , (8.56) b˛edacych ˛ wynikiem dekompozycji SVD macierzy A wzgl˛edem jej wartości osobliwych (singularnych) σ , gdzie: • U - macierz unitarna (UT U = I) o wymiarach M × M, czyli zbudowana z ortonormalnych (ortogonalnych i unormowanych) wierszy i kolumn o długości M, • V - macierz unitarna (VT V = I) o wymiarach N × N, 8.5 Dekompozycja SVD: wartości i wektory osobliwe macierzy 173 Rysunek 8.2: (góra) Ilustracja graficzna istoty dekompozycji SVD macierzy A o wymiarach 4 × 7 na trzy macierze U, S, V (w macierzy S okr˛egi nie wypełnione kolorem w środku oznaczaja˛ wartości zerowe). (dół) Macierz A jest suma˛ macierzy Ak , otrzymanych w wyniku pomożenia k-tej kolumny macierzy U przez k-ty wiersz macierzy VT oraz przeskalowaniu wyniku przez k-ty element diagonalny macierzy S, czyli k-ta˛ wartość osobliwa.˛ • S - diagonalna macierz o wymiarach M ×N z wartościami osobliwymi σi na głównej przekatnej ˛ (K = min{M, N}), uzupełniona na końcu zerami w poziomie jeśli M < N albo w pionie jeśli M > N: σ1 0 · · · 0 0 σ2 · · · 0 D0 (8.57) S= , D= . . . . , 0 0 .. .. . . .. 0 0 · · · σK Równanie (8.56) można zapisać w nast˛epujacej postaci: uk (1) · vk (1) vk (2) · · · vk (N) min{M,N} min{M,N} uk (2) N A = ∑ Ak = ∑ σk · uk vTk = ∑ σk . .. k=1 k=1 i=1 uk (M) (8.58) Na rysunku 8.2, w górnej cz˛eści, pokazano w celach pogladowych ˛ wielkość i struktur˛e trzech macierzy U, S, V, na które została zdekomponowana macierz A o wymiarach M = 4, N = 7, zgodnie z równaniem (8.56). Należy zwrócić uwag˛e na fakt, że macierz S nie jest kwadratowa i została uzupełniona zerami na końcu każdego wiersza. W dolnej cz˛eści rysunku zilustrowano równanie (8.58): macierz A jest suma˛ macierzy Ak , k = 1, 2..., min(M, N), powstałych w wyniku: 1. pomnożenia k tej kolumny macierzy U przez traspozycj˛e k-tej kolumny macierzy V (czyli k-ty wiersz macierzy VT ), 2. przeskalowania wyniku tego iloczynu przez k-ta˛ wartość osobliwa˛ σk macierzy S Wi˛ecej szczegółów dotyczacych SVD można znaleźć w: Bjorck, Dahlquist „Metody numeryczne” i Golub, Loan „Matrix Computations”. 174 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy 8.5.2 Przykłady zastosowań SVD Obliczanie macierzy pseudo-odwrotnej. Macierz pseudoodwrotna do macierzy prostokatnej ˛ A, zdefiniowana jako: A pinv = AT A −1 AT , (8.59) może być bardzo prosto obliczona jeśli dysponujemy wynikiem dekompozycji SVD macierzy A, czyli macierzami U, S, V (patrz (8.56)): 1 σ1 0 · · · 0 0 1 ··· 0 −1 σ2 D 0 T (8.60) A pinv = V · ·U , D= .. .. . . .. . 0 0 . . . . 0 0 · · · σ1K Rozwiazywanie ˛ nadokreślonych układów równań liniowych. Możliwość szybkiego obliczania pseudo-odwrotności macierzy (8.59) z użyciem SVD (8.60) powoduje, że dekompozycja ta jest powszechnie stosowana do rozwiazywania ˛ nadokreślonych układów równań liniowych (estymacji LS, aproksymacji): Ax = b → AT Ax = AT b → x = (AT A)−1 AT b → x = A pinv · b. (8.61) Poprawianie uwarunkowania i odszumianie nadokreślonego układu równań. Podczas obliczania macierzy pseudoodwrotnej w równaniu (8.61) można użyć tylko pierwszych P < K najwi˛ekszych wartości i wektorów osobliwych w równaniu (8.60). Uzyskuje si˛e w ten sposób odszumione przybliżenie tej macierzy, co wpływa na popraw˛e uwarunkowania obliczeniowego zadania rozwiazywania ˛ nadokreślonego układu równań. Ten temat jest rzadko omawiany w standardowych kursach metod numerycznych, ale zyskuje na popularności. Problem 8.6 (* Rozwiazywanie ˛ nadokreślonych układów równań liniowych połaczone ˛ z odszumianiem). Zapoznaj si˛e z listingiem 8.6. Zawiera on program svd_ar.m, w którym przeprowadza si˛e analiz˛e sygnału, składajacego ˛ si˛e z kilku składowych kosinusoidalnych o różnych cz˛estotliwościach i tłumieniach (jest to np. przykład rezonansu magnetycznego). Podobny problem już rozpatrywaliśmy w rozdziale 3 w przykładzie autoregresyjnej analizy danych: tam również rozwiazywaliśmy ˛ w programie matrix_ar.m podobny układ równań liniowych, teraz jednak liczba równań jest o wiele wi˛eksza niż liczba niewiadowych, czyli układ równań jest nadmiarowy. W programie równanie Ax = b jest rozwiazane: ˛ • w sensie LS za pomoca˛ macierzy pseudoodwrotnej x = (AT A)−1 AT · b = A pinv · b, zapisanej tak jak w równaniu (8.60) - z użyciem metody Prony’ego i funkcji fLP(), która jest też pokazana na listingu 8.6, • jak wyżej tylko z uproszczeniem macierzy D w równaniu (8.60) do jej pierwszych, najistotniejszych składowych osobliwych - z użyciem metody Kumaresana-Tuftsa i funkcji fLPSVD() (metoda używa liniowej predykcji “wstecz” oraz zakłada i stosuje w równaniach poczatkowych ˛ wyższy rzad ˛ samej predykcji, który koryguje dopiero w linii implementujacej ˛ równanie (8.60). Zapoznaj si˛e z obiema funkcjami, porównaj dokładność ich obliczeń. Zaobserwuj jak bład ˛ oszacowania zależy od: 1) liczby użytych danych/próbek N, 2) poziomu zakłóceń (SNR), 3) poprawności informacji o liczbie składowych (K), przekazanej do 8.5 Dekompozycja SVD: wartości i wektory osobliwe macierzy 175 programów, 4) samych wartości parametrów składowych oraz 5) ich liczby. Która metoda okazała si˛e lepsza? Listing 8.6: Program do oszacowania cz˛estotliwości i tłumienia kilku sinusoidalnych składowych sygnału metoda˛ liniowej predykcji - nie używajacy ˛ i używajacy ˛ SVD do odszumiania danych % svd_ar.m clear all; close all; N = 200; % liczba analizowanych probek danych fpr = 10000; dt = 1/fpr; % liczba probek danych na sekunde, okres probkowania f = [ 1000 2000 3000 ]; % liczba powtorzen na sekunde skladowych sinusoidalnych d=[1 10 20 ]; % tlumienie kolejnych skladowych A=[1 0.5 0.25 ]; % amplituda kolejnych skladowych K = length(f); % liczba skladowych sygnalu x = zeros(1,N); % inicjalizacja danych for k = 1 : K % generacja i akumulacja kolejnych sinusoid x = x + A(k) * exp(-d(k)*(0:N-1)*dt) .* cos(2*pi*f(k)*(0:N-1)*dt + pi*rand(1,1)); end SNR = 60; x = awgn(x,SNR); % dodanie szumu, poziom w decybelach figure; plot(x); grid; title(’x(n)’); pause % pokazanie sygnalu [fest1, dest1 ] = fLP(x,K,dt), % metoda LP Prony’ego [fest2, dest2 ] = fLPSVD(x,K,dt), % metoda LP-SVD Kumaresana-Tuftsa [fest1 fest2], [dest1 dest2], % porownanie % ########################################## function [fest, dest] = fLP(x,K,dt) % Metoda LP Prony’ego % x - analizowany sygnal % K - przyjeta liczba skladowych (tlumionych kosinusow) N = length(x); % liczba probek danych P = 2*K; % rzad predykcji M = N-P; % maksymalna liczba rownan FirstCol = x(1:M); LastRow = x(M:M+P-1); % parametry dla macierzy Hankela Y = hankel( FirstCol, LastRow ); % macierz MxL y = x(P+1:P+M).’; % wektor Mx1 %a = -pinv(Y)*y; a = -Y\y; %[U,S,V] = svd(Y,0); S = diag(S); %a = -V * (diag(1./S) * (U’*y)); % 1) klasyczne rozwiazanie % 2) optymalizowane rozwiazanie Matlaba % 3) "nasze" rozwiazanie % 3) macierz pseudoodwrotna z SVD p = log( roots( [1 fliplr(a’)] ) ); % pierwiastki wielomianu a Om = imag(p); [Om indx] = sort( Om, ’ascend’ ); Om = Om(K+1:2*K); % cz. katowe D = -real( p(indx(K+1:2*K)) ); % tlumienia fest = Om/(2*pi*dt); % czestotliwosci obliczone dest = D/dt; % tlumienie obliczone Obliczanie wartości własnych macierzy AT A i AAT . Ponieważ prawdziwe sa˛ nast˛epujace równości (oznaczenia: M, N - wymiary macierzy A, K = min(M, N)): VT (AT A)V = diag(σ12 , σ22 , ..., σK2 , 0, ..., 0), T T U (AA )U = diag(σ12 , σ22 , ..., σK2 , 0, ..., 0), (8.62) (8.63) to wartości własne macierzy AT A (N × N) i AAT (M × M) można obliczyć podnoszac ˛ do kwadratu wartości osobliwe macierzy A. 176 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy Rysunek 8.3: Obraz Lena o wymiarach 512 × 512, odtworzony z: 1, 3, 5, 10, 25, 50 podobrazów osobliwych (kolejno wierszami), zwiazanych ˛ z najwi˛ekszymi wartościami osobliwymi dekompozycji SVD. Kompresja obrazów. “Dawno, dawno temu, za siedmioma ...”. Nieprawda. Około 50 lat temu, w dodatku powszechnie: 1. przeprowadzano dekompozycj˛e SVD obrazów cyfrowych z użyciem wzoru (8.56), 2. przedstawiano je jako ważona˛ sum˛e obrazów składowych, tzw. singular images, otrzymanych w wyniku iloczynu wektorowego par odpowiadajacych ˛ sobie wektorów osobliwych uk i vk , tak jak w (8.60), 3. upraszczano ww. sum˛e do pierwszych L składowych, zwiazanych ˛ z najwi˛ekszymi wartościami osobliwymi σk , k = 1...L, 4. otrzymywano w ten sposób stosunkowo dobre przybliżenie obrazu, po jego odtworzeniu tylko z cz˛eści wartości i wektorów osobliwych, 5. i znacznie redukowano w ten sposób pami˛eć potrzebna˛ do przechowywania danych (nie zapisywano wartości wszystkich pikseli obrazu, tylko wybrane wartości i wektory osobliwe). Właściwości SVD powoduja,˛ że rozkład ten b˛edzie najefektywniejszy spośród wszystkich możliwych transformat ortogonalnych, tj. resztkowa energia kolejnych składowych, zwiazanych ˛ z coraz mniejszymi wartościami osobliwymi, b˛edzie najmniejsza. Na rysunku 8.3 pokazano przykładowe wyniki rekonstrukcji obrazu o wymiarach 512 × 512 jako sumy jego: 1, 3, 5-ciu, 10-ciu, 25-ciu, 50-ciu najistotniejszych podobrazów osobliwych. Problem 8.7 ((L)* Dekompozycja SVD obrazów). Zapoznaj si˛e z programem 8.7, w którym przeprowadza si˛e dekompozycj˛e i rekonstrukcj˛e (analiz˛e-syntez˛e) obrazu cyfrowego metoda˛ SVD. Uruchom go, obejrzyj rysunki. Sporzadź ˛ wykres zmienności wartości osobliwych, od najwi˛ekszej do najmniejszej. Oblicz jak średni bład ˛ odtworzenia wszystkich pikseli obrazu zależy od liczby zsumowanych macierzy osobliwych, zaczynaj ˛ ac ˛ od najbardziej istotnych (zwiazanych ˛ z najwi˛ekszymi wartościami osobliwymi). Jaki stopień kompresji obrazu uzyskujemy redukujac ˛ liczb˛e sumowanych podobrazów? Zmodyfikuj program tak, aby możliwa była analiza-synteza obrazów kolorowych. Czy wszystkie kolory sa˛ tak samo istotne? 8.6 Podsumowanie 177 Listing 8.7: Program do dekomopozycji i rekonstrukcji obrazów cyfrowych metoda˛ SVD % svd_image.m clear all; close all; [X,map] = imread(’lena512.bmp’); wymiary = size(X), % wczytaj obraz X = double(X); image(X); title(’Oryginal’); colormap(map); axis image off; pause % pokaz go [U,S,V] = svd(X); image( U*S*V’ ); title(’SVD’); colormap(map); axis image off; pause % zrob dekompozycje SVD % odtworz obraz ze wszystkich skladowych mv=[1, 2, 3, 4, 5, 10, 15, 20, 25, 50]; for i = 1:length(mv) mv(i) mask = zeros( size(S) ); mask( 1:mv(i), 1:mv(i) ) = 1; figure; image( U*(S.*mask)*V’ ); colormap(map); axis image off; pause end % okresl liczbe skladowych % PETLA - START % wybrana liczba skladowych % maska zerujaca wartosci osobliwe (w.o.) % wstaw "1" pozostawiajace najwieksze w.o. % synteza i pokaznie obrazu zrekonstruowanego % bez osi % a widzisz? % PETLA - STOP 8.6 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. 1. Wartości i wektory własne macierzy kwadratowej A pozwalaja˛ nam zrozumieć istot˛e problemu obliczeniowego, zwiazanego ˛ z rozwiazywaniem ˛ równania macierzowego Ax = b, czyli układu N równań z N niewiadomymi: • wydzielaja˛ z macierzy składowe o różnej dynamice zmian, • w zwiazku ˛ z czym pokazuja˛ dominujace ˛ komponenty wyst˛epujace ˛ w macierzy i opisywanym przez nia˛ zjawisku, • sa˛ baza˛ dla ważnego algorytmu Principal Component Analysis (PCA), który taka˛ analiz˛e danych przeprowadza. 2. Wartości i wektory własne moga˛ być wyznaczone metoda˛ pot˛egowa,˛ przekształceniami przez podobieństwo oraz metoda˛ dekompozycji QR. 3. Rozkład macierzy prostokatnej ˛ A na wartości i wektory osobliwe: • umożliwia przedstawienie macierzy jako sumy ważonej podmacierzy, otrzymanych z jej dekompozycji SVD, • pozwala na przybliżanie macierzy przez ograniczona˛ liczb˛e podmacierzy ww. sumy, • pozwala na efektywne rozwiazywanie ˛ nadokreślonego układu M równań z N niewiadomymi (M > N), czyli równania macierzowego Ax = b, w sensie minimalizacji sumy kwadratów odchyłek: – pod wzgl˛edem obliczeniowym - proste obliczanie macierzy pseudoodwrotnej dla macierzy prostokatnej, ˛ 178 8 Obliczanie wartości oraz wektorów własnych i osobliwych macierzy – pod wzgledem redukcji wpływu szumu - pozostawianie tylko składowych zwiazanych ˛ z najwi˛ekszymi wartościami osobliwymi. • jest podstawa˛ algorytmów Independent Component Analysis (ICA). Literatura 1. G.H. Golub, C.F. Van Loan, Matrix computations. The Johns Hopkins University Press, Batlimore, 2013. 2. C. Moler: “Eigenvalues and Singular Values”, in Numerical Computing with Matlab, on-line: https:// www.mathworks.com/ moler/ chapters.html Rozdział 9 Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań nieliniowych Streszczenie Równania nieliniowe w technice. Zadanie wyznaczenia pierwiastków równania nieliniowego. Metody iteracji w obszarze zamkni˛etym: z otaczaniem i podziałem (bisekcja i regula-falsi). Metody iteracji w obszarze otwartym z wykorzystaniem: siecznej i stycznej. Zera wielomianu charakterystycznego macierzy jako wartości własne tej macierzy. Problemy wielowymiarowe - układy równań nieliniowych. 9.1 Wprowadzenie - równania i funkcje nieliniowe w technice Opis funkcjami nieliniowymi wzgl˛edem wielkości wejściowej, wyjściowej, wewn˛etrznej (np. stanu) badź ˛ parametrów jest powszechny w technice. Poniżej podano wybrane przykłady. 1. Nie-prostoliniowy ruch obiektów, poddawanych zewn˛etrznym oddziaływaniom, na przykład: • tor planet w polu grawitacyjnym Słońca, • ruch czastek ˛ naładowanych w polu magnetycznym spektrometru masowego, • trajektoria pocisku przy pr˛edkości poczatkowej, ˛ oporach powietrza i grawitacji. 2. Zależności nieliniowe sa˛ powszechne w zagadnieniach technicznych z powodu ograniczeń fizycznych, na przykład: • tarcie suche jest opisane nieliniowa˛ funkcja˛ wzgl˛edem pr˛edkości, w przeciwieństwie do tarcia wiskotycznego, • nasycanie si˛e tranzystorów i wzmacniaczy (ograniczenie od napi˛ecia zasilajacego), ˛ • nasycanie si˛e materiałów magnetycznych (np. blach transformatorowych). 3. Odpowiedzi liniowych układów dynamicznych sa˛ nieliniowymi funkcjami czasu, cz˛estotliwości i parametrów układów, na przykład: • odpowiedź impulsowa zależy nieliniowo od czasu, • wysokość lokalnego maksimum rezonansowego odpowiedzi cz˛estotliwościowej obiektu oscylacyjnego jest nieliniowe wzgl˛edem tłumienia. Równania i układy równań nieliniowych powstaja˛ przy nakładaniu warunków (np. osiagni˛ ˛ ecie określonej wartości, przeci˛ecie trajektorii) na nieliniowe funkcje opisujace. ˛ PRZYKŁAD - krzywa balistyczna Tor pocisku o masie m, wystrzelonego pod ka˛ tem α z pr˛edkościa˛ poczatkow ˛ a˛ v0 , opisuje wzór: m2 xb mg x + g 2 ln 1 − (9.1) y(x) = tan(α) + bv0 cos(α) b mv0 cos(α) gdzie: g - przyspieszenie ziemskie, b - współczynnik oporu powietrza. Jest to równanie niepełne, ponieważ wartość b nie jest stała, ale zależy od kształtu pocisku i jego pr˛edkości chwilowej (która˛ w zwiazku ˛ z tym także trzeba obliczać, a jest ona zmienna w czasie). Kiedy zaniedbujemy wpływ oporu powietrza, wzór (9.1) redukuje si˛e do: 179 180 9 Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań nieliniowych Rysunek 9.1 Położenie kuli podczas rzutu ukośnego, obliczone w programie 9.1. y(x) 100 80 60 y 40 20 0 -20 -40 0 50 100 150 200 250 300 350 x y(x) = tan(α)x − g 2v20 cos2 (α) x2 (9.2) Problem 9.1 (* Zadanie balisty - rzut ukośny). Wyznacz zasi˛eg rzutu kuli kamiennej o masie m = 5 kg, wystrzelonej z katapulty z pr˛edkościa˛ v0 = 50 m/s pod katem ˛ α = 30o ze wzgórza o wysokości h = 50 m nad płaskim terenem. Przypomnijmy: g = 9.81 m/s2 . Inaczej: wyznacz wartość x, dla której y(x) osiaga ˛ wartość 0. Skorzystaj z programu 9.1, implementujacego ˛ zależność (9.2) oraz generujacego ˛ rysunek 9.1. Spróbuj napisać program, implementujacy ˛ bliższe prawdy, ale trudniejsze równanie (9.1), uwzgl˛edniajac ˛ lub nie zmienność wartości b. Listing 9.1: Program implementujacy ˛ równanie rzutu ukośnego (9.2) % equnonlin_balista.m clear all; close all; m=5; v0=50; alpha=30; h=50; g=9.81; alpha = alpha/180*pi; x = 0 : 1 : 350; y = h + tan(alpha)*x - g / (2*v0^2*cos(alpha)) * x.^2; figure; plot(x,y); xlabel(’x’); ylabel(’y’); title(’y(x)’); grid; 9.2 Wyznaczanie miejsc zerowych równania nieliniowego trudności i podstawowe metody Trudności: • możliwość braku miejsc zerowych (np. wielomian z zerami zespolonymi kiedy szukamy rzeczywistych) - patrz lewy rysunek 9.2, • duże nagromadzenie zer w przedziale (np. dla funkcji sin(1/x) w pobliżu zera) patrz środkowy rysunek 9.2, • możliwość braku zmiany znaku (np. dla zer wielomianu o parzystej krotności) patrz prawy rysunek 9.2, • nieciagłości, ˛ osobliwości. Pomysły na rozwiazanie: ˛ • zgrubne narysowanie przebiegu funkcji w celu zorientowania si˛e w problemie, 9.3 Metody itercji w obszarze zamkni˛etym - z otaczaniem zera i podziałem przedziału 181 Rysunek 9.2: Ilustracja możliwych problemów, które moga˛ wystapić podczas wyznaczania miejsc zerowych funkcji y = f (x). • znalezienie przedziału, w którym funkcja zmienia znak i jego iteracyjne zaw˛eżanie, • wystartowanie z dowolnego punktu i poda˛żanie w kierunku malejacych ˛ co do modułu wartości. Informacja do wykorzystania: • wartości funkcji, • wartości lub przybliżenie pochodnych funkcji, • poprzednio znalezione miejsca zerowe. Sposób kontroli dokładności: • różnica mi˛edzy wartościa˛ funkcji a zerem, • różnica mi˛edzy dwoma kolejnymi oszacowaniami, • różnica mi˛edzy bieżacym ˛ oszacowaniem zera, a poprawnym rozwiazaniem ˛ (ale to niestety nie jest znane). 9.3 Metody itercji w obszarze zamkni˛etym - z otaczaniem zera i podziałem przedziału Idea obustronnego otoczania miejsca zerowego funkcji punktami testowymi i iteracyjnego zbliżania si˛e do niego jest podstawa˛ metod obszaru zamkni˛etego (closed domain). Ponieważ umożliwiaja˛ one kontrol˛e szerokości przedziału zawierajacego ˛ pierwiastek, maja˛ one znana˛ szybkość zbieżności i wielkość bł˛edu końcowego. 9.3.1 Metoda bisekcji połowienia przedziału Idea metody bisekcji jest przedstawiona na rysunku 9.3: w każdej iteracji nast˛epuje wybór dwóch nowych punktów ograniczajacych ˛ przedział z zerem spośród trzech punktów: dwóch starych punktów ograniczajacych ˛ oraz punktu leżacego ˛ pośrodku pomi˛edzy nimi (bisekcja). Algorytm metody bisekcji jest scharakteryzowany w tabeli 9.1. Jego implementacja w j˛ezyku Matlab jest cz˛eścia˛ funkcji nonlinsolvers.m, przedstawionej na listingu 9.3. Program główny, definiujacy ˛ zadanie i uruchamiajacy ˛ wybrane funkcje, zawiera listing 9.2. Listing 9.2: Program główny definiujacy ˛ zadanie i wywołujacy ˛ funkcje % equnonlin_solve.m clear all; close all; 182 9 Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań nieliniowych Rysunek 9.3: Ilustracja zasady działania metody bisekcji: jeden z dwóch punktów otaczajacych, ˛ “a” albo “b” jest zast˛epowany punktem “c” leżacym ˛ pośrodku pomi˛edzy nimi. Tabela 9.1: Charakterystyka metody bisekcji połowienia przedziału poszukiwań Zagadnienie Omówienie Algorytm ak + bk 2 2) if( f (ak ) · f (ck ) < 0) 1) ck = else Oszacowanie wartości zera w k-tym kroku Bład ˛ oszacowania wartości zera w k-tym kroku ak+1 = ak , bk+1 = ck ; ak+1 = ck , bk+1 = bk ; 3) k = k + 1; goto 1) zk = ck −a0 |z − zk | ≦ εk = b20k+1 = 12 εk−1 (zbieżność liniowa) it = 12; a = pi-pi/5; b=pi+pi/5; % znajdz zero funkcji y=sin(x) dla x=pi f = @(x) sin(x); % definicja funkcji fp = @(x) cos(x); % definicja pochodnej funkcji x = 0 : 0.01 : 2*pi; plot( x, f(x), ’b-’, x, fp(x),’r-’); grid; xlabel(’x’); title(’f(x), fp(x)’); legend(’Funkcja’,’Jej pochodna’); pause cb = nonlinsolvers( f, fp, a, b, ’bisection’, it ); cr = nonlinsolvers( f, fp, a, b, ’regula-falsi’, it); cn = nonlinsolvers( f, fp, a, b, ’newton-raphson’, it); plot( 1:it,cb,’o-’, 1:it,cr,’*’, 1:it,cn,’^-’); xlabel(’iter’); title(’c(iter)’) grid on, legend(’Bisection’,’Regula-Falsi’,’Newton-Raphson’); Listing 9.3: Funkcja wyznaczajaca ˛ miejsce zerowe wybranym algorytmem function C = nonlinsolvers(f, fp, a, b, solver, iter) C = zeros(1,iter); c = a; % kolejne oszacowania miejsca zerowego % pierwsze oszacowanie for i = 1 : iter fa = feval(f,a); fb=feval(f,b); fc=feval(f,c); fpc=feval(fp,c); % oblicz switch(solver) case ’bisection’, if( fa*fc<0 ) b=c; else a=c; end c = (a+b)/2; case ’regula-falsi’, if( fa*fc<0 ) b=c; else a=c; end c = b-fb*(b-a)/(fb-fa); 9.3 Metody itercji w obszarze zamkni˛etym - z otaczaniem zera i podziałem przedziału 183 case ’newton-raphson’, c = c-fc/fpc; otherwise, error(’Brak metody’); end C(i)=c; % zapamietaj end Problem 9.2 ((L)*(*) Testowanie metody bisekcji). Zapoznaj si˛e z programem 9.2 oraz funkcja˛ 9.3. Uruchom program, sprawdź “jakość” rozwiazania ˛ oferowanego przez metod˛e bisekcji: dokładność wyniku końcowego i szybkość zbieżności. Ile iteracji jest potrzebnych, aby wyznaczyć miejsce zerowe z = π z dokładnościa˛ 0.001%? (*) Zmień funkcj˛e na inna,˛ np. na parabol˛e y = f (x) = ax2 + bx + c, w Matlabie: f = @(x) a*x.ˆ2+b*x+c; fp= @(x) 2*a*x+b; Ustaw parametry paraboli tak, aby nachylenie krzywej w miejscu zerowym było równe: około 45 stopni, 5-10 stopni, 80 stopni. 9.3.2 Metoda regula-falsi interpolacji liniowej Wybór trzeciego kandydata na nowy punkt ograniczajacy ˛ metoda˛ połowienia powoduje, że zbieżność metody jest niezależna od kształtu funkcji w otoczeniu zera. Ale można ja˛ przyspieszyć wybierajac ˛ trzeci punkt droga˛ interpolacji liniowej, używaja˛ cej dwóch starych punktów. Zasada wyboru dwóch nowych punktów ograniczajacych ˛ spośród trzech kandydatów pozostaje ta sama. Rysunek 9.4 Ilustracja zasady działania metody regulafalsi: jeden z dwóch punktów otaczajacych ˛ jest zast˛epowany punktem leżacym ˛ pomi˛edzy nimi, wyznaczonym metoda˛ interpolacji liniowej. Idea metody jest przedstawiona na rysunku 9.4. Przyrównujac ˛ nachylenie prostej interpolujacej ˛ przechodzacej ˛ przez punkty ograniczajace ˛ a i b do nachylenia prostej przechodzacej ˛ przez punkt b i poszukiwany punkt c (proporcje trójkata), ˛ otrzymujemy: f (b) − f (a) f (b) = b−a b−c → c = b− f (b) f (b)− f (a) b−a (9.3) skad ˛ obliczamy nowe, k-te oszacowanie miejsca zerowego funkcji: zk = ck = bk − f (bk ) f (bk )− f (ak ) bk −ak . (9.4) 184 9 Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań nieliniowych Algorytm metody regula-falsi jest scharakteryzowany w tabeli 9.2. Metoda jest szybciej zbieżna niż metoda bisekcji dla funkcji dobrze przybliżanych prosta˛ w okolicach wartości zerowej. Bład ˛ maleje liniowo. Tabela 9.2: Charakterystyka metody requla-falsi używajacej ˛ interpolacji liniowej do zaw˛eżenia przedziału otaczania Zagadnienie Omówienie 1) ck = bk − f (bk )(bk − ak ) f (bk ) − f (ak ) 2) if( f (ak ) · f (ck ) < 0) Algorytm Oszacowanie wartości zera w k-tym kroku Bład ˛ oszacowania wartości zera w k-tym kroku ak+1 = ak , bk+1 = ck ; ak+1 = ck , bk+1 = bk ; else 3) k = k + 1; goto 1) zk = ck |z − zk | ≦ εk = K · εk−1 , K - stała zależna od krzywizny funkcji w okolicy zera (zbieżność liniowa) Problem 9.3 (*(*) Testowanie metody regula-falsi). Zapoznaj si˛e z implementacja˛ metody regula-falsi, b˛edac ˛ a˛ cz˛eścia˛ funkcji 9.3. Wykonaj wszystkie zadania z problemu 9.2 dla tej metody. 9.4 Metody itercji w obszarze otwartym Drugim historycznie pomysłem na poszukiwanie miejsca zerowego funkcji był start z dowolnego punktu i poda˛żanie w kierunku wartości malejacych ˛ co do modułu. Zacznijmy od przystosowania metody interpolacji liniowej do tego podejścia. Ponieważ rezygnujemy z zasady otaczania zera, to rozwiazanie ˛ interpolacyjne musimy zastapić ˛ ekstrapolacyjnym. 9.4.1 Metoda siecznych - ekstrapolacji liniowej Na rysunku 9.5 wytłumaczono ide˛e metody siecznych. Nast˛epne oszacowanie zera jest identyczne jak w metodzie regula-falsi, (9.4): tym razem wykonujemy jednak nie liniowa˛ (wielomianowa) ˛ interpolacj˛e tylko liniowa˛ ekstrapolacj˛e (predykcj˛e/prognoz˛e): zk = ck = bk − f (bk ) f (bk )− f (ak ) bk −ak . (9.5) 9.4 Metody itercji w obszarze otwartym 185 Rysunek 9.5 Ilustracja zasady działania metody siecznych: nowy punkt, kolejny kandydat do 2-punktowej ekstrapolacji liniowej, jest znajdowany metoda˛ ... ekstrapolacji liniowej. W tabeli 9.3 całościowo scharakteryzowano metod˛e siecznych. Wybór pary punktów {ak , bk } do nast˛epnego oszacowania, spośród trzech punktów {ak , bk , ck }, jest przeprowadzany według zasady “bliżej bieżacego ˛ oszacowania”. Szybkość zbieżności metody dla zer jednokrotnych jest wi˛eksza niż liniowa (superliniowa). Tabela 9.3: Charakterystyka metody siecznych używajacej ˛ ekstrapolacji liniowej do znalezienia miejsca zerowego funkcji Zagadnienie Omówienie 1) ck = bk − Algorytm Oszacowanie wartości zera w k-tym kroku Bład ˛ oszacowania wartości zera w k-tym kroku f (bk )(bk − ak ) f (bk ) − f (ak ) 2) for(|ck − ak | < |ck − bk |) : ak+1 = ck , bk+1 = bk ; for(|ck − ak | > |ck − bk |) : ak+1 = ak , bk+1 = ck ; 3) k = k + 1; goto 1) zk = ck 1.62 , K - stała zależna od pierw|z − zk | ≦ εk = K · εk−1 szej i drugiej pochodnej funkcji f (x) Problem 9.4 (*(*) Implementacja i testowanie metody siecznych). Dodaj do funkcji 9.3 implementacj˛e metody siecznych. Nast˛epnie wykonaj dla tej metody wszystkie zadania z problemu 9.2. 9.4.2 Metoda Newtona-Raphsona Przy malejacej ˛ odległości punktów interpolacji wyrażenie na nachylenie prostej w metodzie siecznych zbliża si˛e do wartości pochodnej w punkcie, czyli do nachylenia linii stycznej do funkcji. Algorytm wyznaczania miejsca zerowego z użyciem pochodnej jest nazywany metoda˛ Newtona-Raphsona. Ma ona zastosowanie, kiedy znana jest analityczna pochodna funkcji, którego zera szukamy, oraz w przypadku numerycznego przybliżania pochodnej. W metodzie Newtona-Raphsona w równaniu (9.5): • wyrażenie bk jest zast˛epowane przez zk , k-te przybliżenie miejsca zerowego, f (ak ) • natomiast f (bbk )− - przez pochodna˛ funkcji f ′ (zk ) punkcie zk . −a k k Łacznie ˛ otrzymujemy: 186 9 Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań nieliniowych zk = bk − f (bk ) f (bk )− f (ak ) bk −ak → zk+1 = zk − f (zk ) . f ′ (zk ) (9.6) Iteracyjne wyznaczanie miejsca zerowego na podstawie (9.6) (prawa strona) jest zbieżne jeśli dla x ∈ [z − δ , z + δ ] spełniony jest nast˛epujacy ˛ warunek (patrz wyprowadzenie np. w J.H. Mathews, „Numerical methods for ...”): | f (x) f ′′ (x)| < 1. | f ′ (x)| (9.7) Szybkość zmniejszania si˛e bł˛edu wyznaczenia zera określaja˛ nast˛epujace ˛ równania: dla jednokrotnego zera zależność jest kwadratowa : dla M-krotnego zera zależność jest liniowa : | f (z)| 2 ε , 2| f ′ (z)| k−1 M−1 εk = εk−1 . M εk = (9.8) (9.9) Problem 9.5 (*(*) Testowanie metody Newtona-Raphsona). Zapoznaj si˛e z implementacja˛ metody Newtona-Raphsona, b˛edac ˛ a˛ cz˛eścia˛ funkcji 9.3. Wykonaj wszystkie zadania z problemu 9.2 dla tej metody. Problem 9.6 (* Obliczanie pierwiaska kwadratowego dowolnej liczby metoda˛ Newtona-Raphsona). Jako przykład, zastosujemy metod˛e Newtona-Raphsona do obliczanie pierwiastka kwadratowego liczby A jako zera√funkcji: f (x) = x2 − A. Wykorzystamy nast˛epujacy ˛ schemat iteracyjny, zbieżny do A: f (x) = x2 − A; ′ (funkcja) f (x) = 2x; (jej pochodna) A = 4; x1 = 1; k = 0; (inicjalizacja) xk+1 = xk − xk2 − A dla k = 1, 2, 3, ... 2xk (interacja) Powyższy algorytm jest zaimplementowany, z drobnymi zmianami, w programie 9.4. Zapoznaj si˛e z programem, uruchom go, sprawdź zbieżność obliczeń i jej szybkość: narysuj jak zmienia si˛e xk i bład ˛ wyniku estymacji zera w kolejnych iteracjach w przypadku dokładnej znajomości pochodnej funkcji oraz jej estymacji. Czy prawdziwe jest równanie (9.8)? Ustaw x(1)=10; x(2)=9; oraz sprawdź zbieżność i wynik. Zmień funkcj˛e na A = 2, f1 (x) = (x − A)2 , f2 (x) = (x − A)3 . Coś nie działa? Może nie jest spełnione równanie (9.7)? Sprawdź czy prawdziwe jest równanie (9.9). Listing 9.4: Program metody Newtona-Raphsona % equnonlin_newtonraphson.m clear all; close all; format long; A = 4; f = @(x) x^2 - A; % wzor funkcji fp = @(x) 2*x; % wzor jej pochodnej x(1) = 1; x(2) = 1.1; K=10; % punkty startowe (estymata poczatkowa), liczba iteracji 9.4 Metody itercji w obszarze otwartym 187 for k = 3 : K x(k)=x(k-1) - f(x(k-1)) / fp(x(k-1)); % z wzorem pochodnej % x(k)=x(k-1) - f(x(k-1))/((f(x(k-1))-f(x(k-2)))/(x(k-1)-x(k-2))); % z estym. pochodnej end blad = sqrt(A) - x(K), plot(1:K, x,’b.-’, 1:K, sqrt(A)*ones(1,K),’r-’); grid; title(’x(k)’); pause 9.4.3 Metoda Mullera ekstrapolacji-interpolacji kwadratowej Poprzednie metody siecznej i stycznej (pochodnej) używały modelu liniowego funkcji w bieżacym ˛ punkcie dla predykcji miejsca zerowego funkcji (droga˛ interpolacji lub ekstrapolacji). Dla funkcji z duża˛ krzywizna˛ w okolicy zera oznacza to wolna˛ zbieżność algorytmu. Naturalne wi˛ec jest zwi˛ekszenie stopnia wielomianu interpolacyjnego do drugiego, co powinno skutkować lepsza˛ zbieżnościa.˛ To właśnie realizuje algorytm Mullera. Majac ˛ trzy punkty: {xk , yk }, {xk−1 , yk−y }, {xk−2 , yk−2 } (9.10) ax2 możemy: 1) wstawić je do równania paraboli y = f (x) = + bx + c, która przez nie przechodzi, 2) otrzymać układ 3 równań nieliniowych z 3 niewiadowymi a, b, c, 3) rozwiazać ˛ go ze wzgl˛edu na te niewiadome. Załóżmy, że rozpatrujemy sytuacj˛e przedstawiona˛ na rysunku 9.6 i stosujemy nast˛epujace równanie paraboli, troch˛e inaczej zapisane: y = f (x) = a (x − xk )2 + b (x − xk ) + c. (9.11) Wówczas współczynniki a, b, c sa˛ równe: a= δ1 h2 − δ2 h1 , h1 h2 (h1 − h2 ) b= δ2 h21 − δ1 h22 , h1 h2 (h1 − h2 ) c = yk . (9.12) W równaniu (9.12) używane sa˛ zmienne h1 , h2 , δ1 , δ2 zdefiniowane nast˛epujaco: ˛ h1 = xk−1 − xk , δ1 = yk−1 − yk , (9.13) h2 = xk−2 − xk , δ2 = yk−2 − yk . (9.14) Rysunek 9.6 Ilustracja zasady działania metody Mullera, używajacej ˛ ekstrapolacji/interpolacji funkcja˛ kwadratowa.˛ Miejsce zerowania si˛e paraboli interpolujacej, ˛ dopasowanej do aktualnie wybranych trzech punktów (9.10), jest wyrażone znanym równaniem (2.13): 188 9 Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań nieliniowych √ −b ± b2 − 4ac 2c √ = , (9.15) 2a −b ± b2 − 4ac które daje nam kolejne oszacowanie szukanego miejsca zerowego analizowanej funkcji. W kolejnych iteracjach zbliżamy si˛e do prawdziwego miejsca zerowego. Algorytm ma zbieżność superliniowa˛ równa: ˛ zk = 1.84 εk = K · εk−1 , (9.16) która jest troch˛e lepsza od metody siecznej (1.62), ale troch˛e gorsza od metody stycznej (2). Czyli nie jest najlepiej. Dodatkowo konieczne jest znalezienia rozwiazania ˛ równania kwadratowego, które dla pewnych wartości współczynników a, b, c jest źle uwarunkowane. Z tego powodu znaleziono lepsze rozwiazanie. ˛ Ciag ˛ dalszy nastapi ˛ ... w kolejnej sekcji. Problem 9.7 (* Implementacja metody Mullera). Czy spróbujesz? Dodaj do funkcji 9.3 implementacj˛e metody Mullera. Nast˛epnie wykonaj dla tej metody wszystkie zadania z problemu 9.2. 9.4.4 Metoda odwrotnej ekstrapolacji-interpolacji kwadratowej Idea metody polega na zastapieniu ˛ w algorytmie Mullera klasycznej postaci wielomianu interpolujacego ˛ przez wielomian zapisany w postaci Lagrange’a na relacji odwrotnej, tj. na punktach {y, x} zamiast {x, y} (patrz rysunek 9.7): {yk , xk }, {yk−1 , xk−1 }, {yk−2 , xk−2 } (9.17) Rysunek 9.7 Ilustracja zasady działania metody odwrotnej ekstrapolacji/interpolacji kwadratowej: teraz dopasowanie wielomianu do x = f −1 (y) zamiast do y = f (x). W tym miejscu należy przypomnieć sobie równania (5.15)(5.17), definiujace ˛ wielomian Lagrange’a: suma składników postaci “znana wartość funkcji pomnożona przez wielomian wyznaczony przez znane wartości argumentów i wybrana,˛ nowa˛ wartość argumentu x”. W zapisie odwrotnym (y, x) a nie (x, y) mamy: xk+1 = (y − yk−2 )(y − yk−1 ) (y − yk−2 )(y − yk ) xk + xk−1 + ... (yk − yk−2 )(yk − yk−1 ) (yk−1 − yk−2 )(yk−1 − yk ) (y − yk−1 )(y − yk ) ... + xk−2 . (9.18) (yk−2 − yk−1 )(yk−2 − yk ) 9.5 Przypadek szczególny - miejsca zerowe wielomianu charakterystycznego macierzy 189 Po podstawieniu y = 0 otrzymujemy kolejne, iteracyjne oszacowanie zera funkcji: xk+1 = yk−2 yk−1 yk−2 yk xk + xk−1 + ... (yk − yk−2 )(yk − yk−1 ) (yk−1 − yk−2 )(yk−1 − yk ) yk−1 yk xk−2 . (9.19) ... + (yk−2 − yk−1 )(yk−2 − yk ) Algorytm Brenta, zaimplementowany w środowisku Matlab jako funkcja fzero(), jest kombinacja˛ metody bisekcji, siecznych oraz odwrotnej interpolacji kwadratowej - jak widzisz: “nie ma lekko”! Co ciekawe, implementacja tej samej funkcji w środowisku Octave zawiera dodatkowo implementacj˛e odwrotnej interpolacji sześciennej. Problem 9.8 ((L)* Obliczanie pierwiaska kwadratowego dowolnej liczby metoda˛ odwrotnej interpolacji/ekstrapolacji kwadratowej). Teraz rozwia˛żemy zadanie obliczania pierwiastka kwadratowego liczby A jako zera funkcji metoda˛ odwrotnej interpolacji/ekstrapolacji kwadratowej, a nie z użyciem metody Newtona-Raphsona tak jak w problemie 9.6 oraz w programie 9.4. Zapoznaj si˛e z kodem programu 9.4. Uruchom go, sprawdź wynik i zbieżność. Przetestuj wpływ wyboru punktów startowych. Zmień funkcj˛e na A = 2, f1 (x) = (x − A)2 , f2 (x) = (x − A)3 . Listing 9.5: Program odwrotnej interpolacji/ekstrapolacji kwadratowej - odrócony algorytm Mullera % equnonlin_invmuller.m clear all; close all; format long; A = 4; f = @(x) x^2 - A; % wzor funkcji x(1)=1; x(2)=1.1; x(3)=1.2; K=10; % punkty startowe (estymata poczatkowa), liczba iteracji for k = 3 : K-1 k x(k+1)=f(x(k-1))*f(x(k-2)) / ((f(x(k))-f(x(k-1)))*(f(x(k))-f(x(k-2)))) *x(k) + ... f(x(k))*f(x(k-2)) / ((f(x(k-1))-f(x(k)))*(f(x(k-1))-f(x(k-2)))) *x(k-1) + ... f(x(k))*f(x(k-1)) / ((f(x(k-2))-f(x(k)))*(f(x(k-2))-f(x(k-1)))) *x(k-2); end blad = sqrt(A) - x(K), plot(1:K, x,’b.-’, 1:K, sqrt(A)*ones(1,K),’r-’); grid; title(’x(k)’); pause 9.5 Przypadek szczególny - miejsca zerowe wielomianu charakterystycznego macierzy Wartości własne macierzy sa˛ zerami jej wielomianu charakterystycznego (właściwość ta jest używana w mało efektywnej metodzie rozwiazania ˛ zagadnienia własnego). Majac ˛ dany wielomian możemy postapić ˛ odwrotnie, tzn. utworzyć macierz, dla której b˛edzie on wielomianem charakterystycznym i wyznaczyć wszystkie zera wielomianu (rzeczywiste i zespolone) algorytmem rozwiazania ˛ zagadnienia własnego. Jak można sprawdzić, wielomian postaci: p (x) = xN + aN−1 xN−1 + . . . + a1 x + a0 (9.20) 190 9 Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań nieliniowych jest wielomianem charakterystycznym tzw. macierzy stowarzyszonej (companion matrix): −aN−1 −aN−2 · · · −a1 −a0 1 0 ··· ··· 0 .. .. . 1 . (9.21) P= 0 , . . . . .. .. 1 . . .. 0 ··· 0 1 0 ponieważ jest on rozwiazaniem ˛ nastepujacego ˛ równania (I - macierz identycznościowa: zerowa z jedynkami na głównej przekatnej): p(x) = det [P − xI] . (9.22) Z tego powodu miejsca zerowe wielomianu p(x) sa˛ wartościami własnymi macierzy P. W taki właśnie sposób wyznacza zera p(x) funkcja Matlaba z=roots(p): buduje macierz 9.21 i za pomoca˛ funkcji eig() oblicza jej wartości własne - patrz listing 9.6. Ogólniejszy wielomian zawsze możemy sprowadzić do tej postaci (9.20) dzielac ˛ go przeez aN . Listing 9.6: Fragment funkcji roots() Matlaba function r = roots(c) % Copyright 1984-2002 The MathWorks, Inc. ... % Polynomial roots via a companion matrix n = length(c); if n > 1 a = diag(ones(1,n-2),-1); % przesuniecie w lewo o -1 a(1,:) = -c(2:n) ./ c(1); r = [r; eig(a)]; end Problem 9.9 (* Testowanie metody wielomianu charakterystycznego macierzy). Znajdź ta˛ metoda˛ miejsca zerowe nast˛epujacych ˛ równań: f1 (x) = x2 − A, f2 = (x − 2 3 A) , f3 = (x − A) dla A = 4. 9.6 Wyznaczanie miejsc zerowych funkcji w Matlabie - funkcja fzero() Kończac ˛ już powoli nasza˛ podróż po bezdrożach znajdowania pierwiastków równań nieliniowych, zobaczmy “jak to robia˛ zawodowcy”. Wydruk 9.7 zawiera fragment kodu funkcji Matlaba fzero() - jego “skrzynki narz˛edziwej” do rozbrajania miejsc zerowych. Cóż my tytaj widzimy? Metody: bisekcji, interpolacji liniowej i odwrotnej kwadratowej. Powinno nas to przekonać, że czas poświ˛econy na lektur˛e tego rozdziału nie był stracony. Listing 9.7: Fragment funkcji fzero() Matlaba function [b,fval,exitflag,output] = fzero(FunFcnIn,x,varargin) %FZERO Scalar nonlinear zero finding. % Copyright 1984-2002 The MathWorks, Inc. 9.6 Wyznaczanie miejsc zerowych funkcji w Matlabie - funkcja fzero() 191 ... fc = fb; % Main loop, exit from middle of the loop while fb ~= 0 % Insure that b is the best result so far, a is the previous % value of b, and c is on the opposite of the zero from b. ... % Convergence test and possible exit m = 0.5*(c - b); toler = 2.0*tol*max(abs(b),1.0); if (abs(m) <= toler) | (fb == 0.0), break, end % Choose bisection or interpolation if (abs(e) < toler) | (abs(fa) <= abs(fb)) % Bisection d = m; e = m; step=’ bisection’; else % Interpolation s = fb/fa; if (a == c) % Linear interpolation p = 2.0*m*s; q = 1.0 - s; else % Inverse quadratic interpolation q = fa/fc; r = fb/fc; p = s*(2.0*m*q*(q - r) - (b - a)*(r - 1.0)); q = (q - 1.0)*(r - 1.0)*(s - 1.0); end; if p > 0, q = -q; else p = -p; end; % Is interpolated point acceptable if (2.0*p < 3.0*m*q - abs(toler*q)) & (p < abs(0.5*e*q)) e = d; d = p/q; step=’ interpolation’; else d = m; e = m; step=’ bisection’; end; end % Interpolation % Next point ... end % Main loop A teraz, kiedy już wiemy jak działaja˛ poszczególne metody, zobaczymy jakie proste jest korzystanie ze skarbca z funkcjami Matlaba. Program 9.8 demonstruje przykładowe użycie funkcji fzero(). Listing 9.8: Przykład użycia funkcji Matlaba fzero() % equnonlin_fzero.m clear all; close all; x = 0 : .02 : 2; % zmiennosc argumentu y = fun_zero(x); % zmiennosc funkcji, zdefiniowanej ponizej albo zapisaj na dysku figure; plot(x,y); % rysunek title(’Funkcja y=f(x) - zauwaz zero w poblizu x = 1.3’), grid % Aby znalezc zero funkcji w otoczeniu x = 1.3, wywolujemy funkcje FZERO xokolica = 1.3; % x w poblizu ktorego szukamy zera xtoler = 1e-9; %eps; % tolerancjsca rozwiazania z = fzero( ’fun_zero’, xokolica, xtoler); % wyznaczmy argument zera 192 9 Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań nieliniowych x = 0.8 : .01 : 1.6; y = fun_zero(x); figure; plot( x, y, z, fun_zero(z),’ro’); title(’(o) Zero funkcji y=f(x)’); grid; zero = z, wartosc_funkcji = fun_zero(z) % x w otoczeniu zera % y w otoczeniu zera % rysujemy funkcje i obliczone zero % tytul % argument zera % wartosc dla zera % ####################################################################### function y = fun_zero(x) % funkcja, ktorej miejsc zerowych poszukujemy y = 1 ./ ((x-.3).^2 + .01) + 1 ./ ((x-.9).^2 + .04) - 6; end Problem 9.10 (* Testowanie użycia funkcji fzero() Matlaba). Zapoznaj si˛e z programem 9.8. Uruchom, sprawdź. Zapoznaj si˛e z opcjami funkcji fzero(). Pobaw si˛e nimi. Zmień funkcj˛e na inna,˛ np. f1 (x) = x2 − A, f2 = (x − A)2 , f3 = (x − A)3 dla A = 4. 9.7 Wybrane przykłady Przykład - obiekt oscylacyjny drugiego rz˛edu. Rozpatrzymy teraz problem wyznaczenia chwili pierwszego przejścia odpowiedzi obiektu oscylacyjnego drugiego rz˛edu (np. wahadło, czujnik ciśnienia, amortyzator, układ elektryczny RLC) na skok jednostkowy (0 → 1), pojawiajacy ˛ si˛e na wejściu układu. W tym przypadku równanie funkcji, której zera szukamy (po odj˛eciu od interesujacej ˛ nas odpowiedzi skokowej wartości 1), oraz jej pochodnej sa˛ nastepujace: ˛ x(t) = − p 1 p p e−ξ ω0 t sin 1 − ξ 2 ω0t + asin 1−ξ2 , 1−ξ2 p ω0 x′ (t) = p e−ξ ω0 t sin 1 − ξ 2 ω0t . 1−ξ2 (9.23) (9.24) Listing 9.9 zawiera program modelujacy ˛ taki obiekt. Z rysunku 9.8 (lewa strona) zrubnie odczytujemy t0 = 2.5. W zwiazku ˛ z tym przyjmujemy punkt startowy dla metod obszaru otwartego t0=2, a dla metod przedziału zamkni˛etego t0=2, t1=4. Na wykresie znajdujacym ˛ si˛e po prawej stronie rysunku 9.8 porównano szybkość zbieżności wybranych metod, omówionych w tym rozdziale, do poprawnej wartości t0 = 2.4184. Metoda bisekcji zbiega si˛e najwolniej, natomiast metody siecznej i stycznej (pochodnej) - podobnie szybko. 9.7 Wybrane przykłady 193 c(k) x(t) 0.2 3 t 0 (k) [s] Bisection Regula-Falsi Newton-Raphson 2.9 0 2.8 -0.2 [s] 2.7 -0.4 2.6 2.5 -0.6 2.4 -0.8 2.3 -1 2.2 0 2 4 6 8 10 0 t [s] 2 4 6 8 10 12 k Rysunek 9.8: Obiekt oscylacyjny drugiego rz˛edu: (po lewej) funkcja, dla której szukamy pierwszego miejsca zerowego - t0 ≈ 2.5, (po prawej) wynik obliczeń w kolejnych iteracjach, zbliżajacy ˛ si˛e do wartości t0 = 2.4184. Listing 9.9: Przykład wyznaczania chwili pierwszego dojścia do wartości ustalonej odpowiedzi skokowej obiektu dynamicznego/oscylacyjnego drugiego rz˛edu % equnonlin_stepresponse.m clear all; close all; iter = 12; a=2; b=4; % liczba iteracji, wartosci poczatkowe argumentu funkcji figure; t=0:0.01:10; plot([t(1),t(end)],[0,0],’r--’,t,f(t),’b-’); title(’x(t)’); xlabel(’t [s]’); grid; pause cb = nlsolvers(’bisection’,a,b,iter); cr = nlsolvers(’regula-falsi’,a,b,iter); cn = nlsolvers(’newton-raphson’,a,b,iter); figure; plot( 1:iter, cb, ’o-’, 1:iter, cr,’*-’, 1:iter, cn, ’^-’); title(’c(k) \approx t_0(k) [s]’); xlabel(’k’); ylabel(’[s]’); grid on, legend(’Bisection’,’Regula-Falsi’,’Newton-Raphson’); % ############### function y = f(t) % odpowiedz skokowa obiektu oscylacyjnego minus 1 w0=1; ksi=0.5; p1 = sqrt(1-ksi^2); y = -1/p1 * exp(-ksi*w0*t); y = y .* sin(w0*p1*t+asin(p1)); end % ############## function y=fp(t) % pochodna odpowiedzi skokowej, czyli odpowiedz impulsowa w0=1; ksi=0.5; p1 = sqrt(1-ksi^2); y = w0/p1 * exp(-ksi*w0*t); y = y .* sin(w0*p1*t); end % ########################################## function C = nlsolvers( solver, a, b, iter ) C=zeros(1,iter); c=a; for i=1:iter switch(solver) case ’bisection’, if f(a)*f(c)<0 b=c; else a=c; end c=(a+b)/2; case ’regula-falsi’, if f(a)*f(c)<0 b=c; else a=c; end 194 9 Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań nieliniowych c=b-f(b)*(b-a)/(f(b)-f(a)); case ’newton-raphson’, c=c-f(c)/fp(c); otherwise, error(’Brak metody’); end C(i)=c; end end Przykład - śledzenie okresu spróbkowanego sygnału sinusoidalnego, np. napi˛ecia sieciowego. Mamy nast˛epujace ˛ pomysły na rozwiazanie ˛ tego zadania/problemu: • analiza cz˛estotliwościowa z użyciem dyskretnej transformacji Fouriera (DFT, lepiej Fast DFT czyli FFT) i wybór maksymalnego pra˛żka widma; zalety: dobra rozdzielczość analizy dla dużej liczba okresów, wady: słabe śledzenie zmian; • aproksymacja sinusem w jednym okresie, czyli dopasowanie nieliniowe trzech parametrów: amplitudy, cz˛estotliwości i kata ˛ fazowego; zalety: dobre śledzenie, wzgl˛edna odporność na szum, wady: mniejsza rozdzielczość pomiaru okresu; • wyznaczenie chwil zmiany znaku ± i proste zliczanie próbek pomi˛edzy nimi; zalety: prostota, szybkie śledzenie zmian, wady: wrażliwość na szum, mniejsza rozdzielczość pomiaru okresu; • bardziej precyzyjne wyznaczenie chwil zmiany znaku z zastosowaniem lokalnej interpolacji albo aproksymacji, np. lokalna interpolacja pierwszego stopnia, lokalna interpolacja trzeciego stopnia, lokalna aproksymacja trzeciego stopnia, lokalna aproksymacja sinusem w okolicy zera. W programie 9.10 zaimplementowano trzy metody: 1) prostego zliczania, w którym wyznacza si˛e miejsca zerowe sygnału, 2) interpolacji pierwszego stopnia, 3) iterpolacji trzeciego stopnia. Otrzymane wyniki dla ww. trzech metod sa˛ przedstawione na rysunku 9.9. Wnioski: 1) najgorsza jest prosta metoda przejść przez zero (bład ˛ wzgl˛edny |ε| < 0.01), 2) interpolacja liniowa wcale nie jest taka zła i może być wystarczajaca ˛ (|ε| < 10−6 ), 3) iterpolacja sześcienna jest zdecydowanie najlepsza −9 (|ε| < 10 ), 4) ale trzeba jeszcze sprawdzić aproksymacj˛e. BLAD(iter) dla LiczZero 0.01 50 0 0 -0.015 -0.01 0 2 100 10 200 300 -6 400 500 600 700 800 900 -0.005 0 0.005 0.01 BLAD(iter) dla Interp 1 HIST(blad) dla Interp 1 100 50 0 -2 0 2 -0.01 1000 0 -2 HIST(blad) dla LiczZero 100 100 10 200 300 -9 400 500 600 700 800 900 -1.5 -1 -0.5 0 0.5 1 1.5 1000 2 10-6 BLAD(iter) dla Interp 3 HIST(blad) dla Interp 3 100 0 -2 50 0 -2 0 100 200 300 400 500 600 700 800 900 1000 -1.5 -1 -0.5 0 0.5 blad iter Rysunek 9.9: Wartości bł˛edu wzgl˛ednego wyznaczania okresu sygnału sinusoidalnego z użyciem trzech metod: (lewo) bład ˛ wzgl˛edny w kolejnych iteracjach, (prawo) histogram bł˛edu. Metody: (góra) proste zliczanie - najgorzej, (środek) interpolacja pierwszego stopnia - lepiej, (dół) iterpolacja trzeciego stopnia - najlepiej. 1 1.5 2 2.5 10-9 9.8 Problem wielowymiarowy: rozwiazywanie ˛ układów równań nieliowych 195 Listing 9.10: Przykład wyznaczania okresu zaszumionej sinusoidy trzema metodami % equnonlin_sinperiod.m clear all; close all; L = 1000; dt = 0.01; t = -0.25 : dt : 1.25; % liczba powtorzen testu % okres probkowania % chwile pobieranie probek, 1.5 okresu danych for i = 1 : L % PETLA GLOWNA % sygnal T = 1 + 0.05*randn; w = 2*pi*(1/T); y = sin( w*t + 2*pi*0.05*randn ); % losowa wartosc okresu w okolicy 1 sekundy % 2*pi*czestotliwosc % zbior probek danych % Proste zliczanie ys = sign(y); yz = diff(ys); iz = find( yz>0 ); count = iz(2)-iz(1); Tep = count*dt; % od ZBOCZA-+ 1 do ZBOCZA-+ 2 % znak, roznica znaku % indeksy skoku wartosci "-" --> "+" % estymata 1 % Interpolacja pierwszego stopnia y1 = y(iz(1)); y2=y(iz(1)+1); dt1 = dt*y2/(y2-y1); y1 = y(iz(2)); y2=y(iz(2)+1); dt2 = dt-dt*y2/(y2-y1); Tei = (count-1)*dt + dt1 + dt2; % na ZBOCZU-+ 1 i ZBOCZU-+ 2, potem roznica % y1=ostatnia ujemna, y2=pierwsza dodatnia % liniowa interpolacja czasu ZBOCZA 1 % y1=ostatnia ujemna, y2=pierwsza dodatnia % liniowa interpolacja czasu ZBOCZA 2 % estymata 2 % Interpolacja trzeciego stopnia % na ZBOCZU-+ 1 i ZBOCZU-+ 2, potem roznica p = polyfit(-1:2,y(iz(1)-1:iz(1)+2),3); % wsp. wielomianu na 3 punktach ZBOCZA 1 r = roots(p); ir = find(imag(r)==0); % miejsca zerowe wielomianu, tylko real ic = find(r(ir)>=0 & r(ir)<=1); % tylko w przedz. [0,1] dt1 = dt*(1-r(ic)); % szescienna interpolacja czasu ZBOCZA 1 p = polyfit(-1:2,y(iz(2)-1:iz(2)+2),3); % wielomian na 3 punktach ZBOCZA 2 r = roots(p); ir=find(imag(r)==0); % miejsca zerowe wielomianu, tylko real ic = find(r(ir)>=0 & r(ir)<=1); % tylko w przedz. [0,1] dt2 = dt*r(ic); % szescienna interpolacja czasu ZBOCZA 1 Tea = (count-1)*dt+dt1+dt2; % estymata 3 % Zapamietanie wynikow Tref(i)=T; Tp(i) = Tep; Ti(i) = Tei; Ta(i) = Tea; end dTp = (Tp-Tref) ./ Tref; % Blad metoda 1: przejscia przez zero dTi = (Ti-Tref) ./ Tref; % Blad metoda 2: interpolacja liniowa dTa = (Ta-Tref) ./ Tref; % Blad metoda 3: interpolacja szescienna figure; subplot(311); plot( dTp ); title( ’BLAD(iter) dla LiczZero’ ); subplot(312); plot( dTi ); title( ’BLAD(iter) dla Interp 1’ ); subplot(313); plot( dTa ); title( ’BLAD(iter) dla Interp 3’ ); xlabel(’iter’); pause 9.8 Problem wielowymiarowy: rozwiazywanie ˛ układów równań nieliowych Uogólnienie metody Newtona-Raphsona (metoda pochodnej/stycznej w punkcie) na przypadek wielowymiarowy to metoda Newtona, która˛ przez analogi˛e do równania (9.6) zapiszemy wektorowo jako: zk+1 = zk − f(zk ) = zk + d, J(zk ) (9.25) 196 9 Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań nieliniowych gdzie (dla liczby równań równej liczbie zmiennych niezależnych): wektor zmiennych: z1 .. z = . , wektor funkcji: f1 (z) f(z) = ... , macierz Jakobianu: ∂f 1 ∂ z1 J(f) = ∂ fN ∂ z1 fN (z) zN ∂f = .. ∂z . ··· ··· ∂ f1 ∂ zN .. . . (9.26) ∂ fN ∂ zN Zarys algorytmu poszukiwania f(z) metoda˛ Newtona jest przedstawiony w tabeli 9.4. Tabela 9.4: Charakterystyka algorytmu Newtona dla przypadku wielowymiarowego Krok Opis operacji 1 2 3 Równania Oblicz wartości funkcji i Jakobianu w bieżacym ˛ punkcie: fk = f(zk ), Jk = J(zk ) Rozwia˛ż układ równań nieliniowych ze wzgledu na d Jk d = −fk → d = − Jfk =? k Wyznacz nast˛epne oszacowanie zera zk+1 = zk + d Ulepszona postać tego algorytmu jest zaimplementowana w funkcji Matlaba fsolve() jako opcja dogleg. Inny sposób rozwiazania ˛ to zamiana problemu rozwiazania ˛ układu wielu równań nieliniowych na problem poszukiwania minimum sumy kwadratów bł˛edów estymat zer wszystkich równań składowych. Ponieważ suma kwadratów ma minimalna˛ wartość zero dla wszystkich składowych zerowych, wi˛ec jest to problem równoważny. Funkcja Matlaba fsolve() może działać w ten sposób (algorytmy lm i gn). Algorytmami minimalizacji zajmiemy sie podczas nast˛epnego laboratorium. Problem 9.11 (*(*)(**)(*) Rozwiazywanie ˛ układu równań nieliniowych). Spróbuj rozwiazać ˛ poniższy układ równań, zaczerpni˛ety z W.Y. Yang “Applied Numerical Methods...”: x12 + 4x22 = 5 2x12 − 2x1 − 3x2 (9.27) = 2.5 (9.28) f1 (x1 , x2 ) = x12 + 4x22 − 5 = 0, (9.29) Na poczatku ˛ inaczej go zapisz: f2 (x1 , x2 ) = 2x12 − 2x1 − 3x2 − 2.5 = 0. (9.30) Nast˛epnie oblicz pochodne czastkowe: ˛ ∂ f1 (x1 , x2 ) = 2x1 , ∂ x1 ∂ f2 (x1 , x2 ) = 4x1 − 2, ∂ x1 ∂ f1 (x1 , x2 ) = 8x2 , ∂ x2 ∂ f2 (x1 , x2 ) = −3. ∂ x2 (9.31) (9.32) 9.8 Problem wielowymiarowy: rozwiazywanie ˛ układów równań nieliowych 197 Na rysunku 9.10 sa˛ przedstawione kształty 3D obu funkcji (9.29)(9.30). Zostały one wygenerowane w programie 9.11, który implementuje algorytm Newtona (z tabeli 9.4) dla rozpatrywanego przypadku. Estymaty miejsc zerowych obu funkcji, otrzymane w kolejnych iteracjach, sa˛ pokazane na rysunku 9.11. Oto Twoje zadania: 1. dodaj do programu wizualizacj˛e dochodzenia algorytmu do rozwiazania ˛ oraz uruchom program z różnych punktów startowych: czy zawsze otrzymujesz takie same rozwiazanie? ˛ dlaczego tak si˛e dzieje? w przypadku utraty zbieżności, spróbuj znaleźć rozwiazanie ˛ tego problemu; 2. spróbuj samemu zaimplementować algorytm Newtona dla przypadku nieznanych funkcji pochodnych czastkowych ˛ (kierunkowych): estymuj je punktowo, wzoruj si˛e na programie 9.4 dla zagadnienia jednowymiarowego; 3. napisz osobna˛ funkcj˛e, implementujaca ˛ algorytm Newtona dla N funkcji Nargumentowych; 4. użyj funkcji Matlaba fsolve() do rozwiazania ˛ naszego zadania. Rysunek 9.10: Kształt funkcji (9.29)(9.30), dla których szukamy wspólnego miejsca zerowego. 198 9 Obliczanie miejsc zerowych funkcji: rozwiazywanie ˛ równań nieliniowych Rysunek 9.11 Wartości estymat miejsc zerowych funkcji (9.29)(9.30), w kolejnych iteracjach algorytmu Newtona, wykonywanych w programie 9.11. z1(iter), z2(iter) 3.5 3 2.5 2 1.5 1 0.5 0 0 5 10 15 20 25 numer iteracji Listing 9.11: Program Matlaba demonstrujacy ˛ zastosowanie algorytmu Newtona do znalezienia wspólnych miejsc zerowych dwóch funkcji (9.29)(9.30) % equnonlin_ndim.m clear all; close all; it = 12; f1 = @(x1,x2) x1.^2 + 4*x2.^2 -5; f2 = @(x1,x2) 2*x1.^2 - 2*x1 -3*x2 -2.5; fp11 = @(x1,x2) 2*x1; fp12 = @(x1,x2) 8*x2; fp21 = @(x1,x2) 4*x1-2; fp22 = @(x1,x2) -3; % definicja funkcji 1 % definicja funkcji 2 % definicja pochodnej f1 wzgl. x1 % definicja pochodnej f1 wzgl. x2 % definicja pochodnej f2 wzgl. x1 % definicja pochodnej f2 wzgl. x2 figure; x1=-10:0.1:10; x2=-10:0.1:10; subplot(121); mesh( x1, x2, feval(f1,x1’,x2) ); title(’f1(x1,x2)’); subplot(122); mesh( x1, x2, feval(f2,x1’,x2) ); title(’f2(x1,x2)’); pause x1=0.8; x2=0.2; % punkt startowy [x1=0.8; x2=0.2] zk = [x1; x2]; % pierwsza estymata miejsc zerowych Kiter = 25; zhist = zeros(2,Kiter); % liczba iteracji, historia estymat zer for k = 1 : Kiter k fk = [ feval(f1,zk(1),zk(2)); feval(f2,zk(1),zk(2)) ], Jk = [ feval(fp11,zk(1),zk(2)), feval(fp12,zk(1),zk(2)); ... feval(fp21,zk(1),zk(2)), feval(fp22,zk(1),zk(2)) ], d = -Jk\fk, % -Jk\fk ALBO -inv(Jk)*fk zk = zk + d, % modyfikacja estymaty miejsc zerowych zhist(:,k) = zk; % zapamietaj % pause end zk, % pokaz wynik zero_f1 = feval(f1,zk(1),zk(2)), % sprawdz zerowanie sie funkcji 1 zero_f2 = feval(f2,zk(1),zk(2)), % sprawdz zerowanie sie funkcji 2 figure; plot(1:Kiter,zhist(1,:),’bo-’,1:Kiter,zhist(2,:),’r*-’ ); grid; xlabel(’numer iteracji’); title(’z1(iter), z2(iter)’); Literatura 199 9.9 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. 1. Miejsce zerowe (pierwiastek) funkcji nieliniowej, tworzacej ˛ równanie nieliniowe, możemy wyznaczyć w nast˛epujacy ˛ sposób: • otoczajac ˛ zero i iteracyjnie zaw˛eżajac ˛ przedział jego wyst˛epowania z użyciem metody: a. bisekcji połowienia przedziału poszukiwań, b. regula-falsi interpolacji liniowej; • iteracyjnie wyznaczajac ˛ zero wielomianu interpolujacego/ekstrapoluj ˛ acego ˛ funkcj˛e nieliniowa˛ wokół bieżacego ˛ punktu z użyciem metody: a. siecznych - ekstrapolacji liniowej, b. Newtona-Raphsona (ekstrapolacja linia˛ styczna,˛ wersja wielowymiarowa), c. ekstrapolacji/interpolacji kwadratowej (algorytm Mullera) i sześciennej. 2. W szczególnym przypadku, kiedy wyznaczamy miejsca zerowe wielomianu, problem można opisać i rozwiazać ˛ używajac ˛ wartości własnych macierzy stowarzyszonej z danym wielomianem. 3. Problem poszukiwania miejsc zerowych można wyrazić jako problem minimalizacji, która b˛edzie tematem naszego nast˛epnego wykładu/laboratorium. Literatura 1. C. Moler: “Zeros and Roots”, in Numerical Computing with Matlab, on-line: https:// www. mathworks.com/ moler/ chapters.html Rozdział 10 Optymalizacja, czyli szukanie minimum funkcji Streszczenie Zadanie optymalizacji - szukanie minimum funkcji o zadanym równaniu albo minimalizacja wybranego kryterium bł˛edu dopasowania wybranej funkcji do danych eksperymentalnych; podstawowe definicje matematyczne: gradient, hesjan, jakobian, klasy zadań optymalizacji: jednej/wielu funkcji, liniowych/nieliniowych, bez albo z ograniczeniami, o argumentach rzeczywistych lub binarnych; metoda złotego podziału z otaczaniem bez użycia pochodnej, metody wykorzystujace ˛ pochodne: Newtona, quasi-Newtona, Gaussa-Newtona, Lavenberga-Marquardta. 10.1 Wprowadzenie W tym rozdziale b˛eda˛ omawiane kolejno nast˛epujace ˛ zagadnienia/poj˛ecia: • • • • • • • cel optymalizacji: szukanie minimum zadanej funkcji, proste metody nie używajace ˛ pochodnych, metody iteracyjne używajace ˛ pochodnych, metody minimalizacji sumy kwadratów, minimalizacja z ograniczeniami, minimalizacja globalna, standardowe zadania optymalizacji (liniowa, kwadratowa, dyskretna), Celem optymalizacji jest znalezienie najlepszego rozwiazania, ˛ tzn. miminum (np. kosztów) albo maksimum (np. zysków) jakiejś funkcji. W optymalizacji sa˛ używane nast˛epujace ˛ poj˛ecia, graficznie zilustrowane na rysunkach 10.1 oraz 10.2: • minimum lokalne i globalne: f ′ (x) = 0, f ′′ (x) > 0; my zazwyczaj szukamy minimum globalnego funkcji, natomiast podczas jego iteracyjnego poszukiwania możemy “utknać” ˛ w minimum lokalnym, • maksimum lokalne i globalne: f ′ (x) = 0, f ′′ (x) < 0; zwykle szukamy maksimum globalnego, ale poprzez zmian˛e znaku funkcji możemy problem wyznaczenia maksimum sprowadzić do problemu znalezienia minimum. • miejsce zerowe: f (x) = 0. 201 202 10 Optymalizacja, czyli szukanie minimum funkcji Rysunek 10.1: Graficzne wytłumaczenie podstawowych poj˛eć używanych w optymalizacji Rysunek 10.2: Zamiana zadania maksymalizacji na minimalizacj˛e poprzez zmian˛e znaku funkcji Na rysunku 10.3 przedstawiono, tylko w celach pogladowych, ˛ kształt funkcji Rosenbrocka, czyli tzw. funkcji “bananowej”: f (x1 , x2 ) = 100 x1 − x22 2 + (1 − x1 )2 , (10.1) która jest cz˛esto wykorzystywana do testowania i porównywania szybkości zbieżności algorytmów otymalizacyjnych (szybkości przejścia od wybranego punktu startowego do minimum funkcji). Z kolei na rysunku 10.4 zaznaczono czerwonymi kropkami kolejne wartości funkcji, wybrane przez różne algorytmy optymalizacyne (steepestdescent, simplex, quasi-Newton, non-linear least squares), podczas poda˛żania w kierunku minimum funkcji: im mniej kropek tym lepiej. Jak widać algorytm steepestdescent w ogóle nie znalazł minimum. 10.1 Wprowadzenie 203 Rysunek 10.3: Przykład funkcji, której minimum szukamy Rysunek 10.4: Przykłady pracy wybranych algorytmów minimalizacji: przejście od punktu Start do punktu Solution, kolejne kroki sa˛ oznaczone czerwonymi punktami. W tabeli 10.1 przedstawiono porównanie różnych metod optymalizacji pod wzgl˛edem liczby wywołań funkcji oraz liczby iteracji, potrzebnych do znalezienia minimum funkcji testowej Rosenbrocka. Podsumowujac ˛ i uogólniajac ˛ przedstawione wyniki możemy stwierdzić, że różne metody optymalizacji charakteryzuja˛ si˛e różna: ˛ 1. złożonościa˛ obliczeniowa˛ (pojedynczego kroku i sumy wszystkich kroków), 2. szybkościa˛ zbieżności (liczba˛ potrzebnych kroków), 3. dokładnościa˛ wyznaczenia minimum. 204 10 Optymalizacja, czyli szukanie minimum funkcji Tabela 10.1: Porównanie różnych metod znajdowania minimum funkcji “bananowej” Rosenbrocka - zaimplementowane w Matlabie Metoda Funkcja Liczba wywo- Liczba łań funkcji iteracji algorytmu Steepest-Descent Simplex Quasi-Newton Non-linear Least-Squares (NLS) Analytic Gradient Analytic Gradient+Hessian Nonlinear LS + Analytic Jacobian fminunc() fminsearch() fminunc() lsqnonlin() fminunc() fminunc() lsqnonlin() 600 (error) 210 150 87 32 32 29 45 114 34 28 31 31 28 Problem 10.1 ((L)* Użycie procedur Matlaba do znalezienia minimum funkcji Rosenbrocka). Zapoznaj si˛e z programem demonstracyjnym BananaFunctionMinExample.mlx, dostarczanym przez Matlaba wraz z Optimization Toolbox, albo z programem optim_rosenbrock_all.m, czyli jego prostsza˛ wersja˛ bez opisu matematycznego. Jest to przykład poszukiwania minimum funkcji “bananowej” Rosenbrocka (10.1). Sprawdź czy liczby wywołań funkcji i iteracji, podane w tabeli 10.1, sa poprawne. Uruchom program dla kilku innych punktów startowych oraz dopisz otrzymane wyniki do tabeli. Czy wszystkie funkcje cały czas zachowuja˛ si˛e podobnie (tzn. czy “kolejność zawodników na mecie” jest ciagle ˛ taka sama)? Zmień wartości parametrów analizowanej funkcji na troch˛e inne (w funkcji głównej i w funkcjach pochodnych). Problem 10.2 (*(*)(*) Użycie procedur Matlaba do znalezienia minimum funkcji wybranej przez Ciebie osobiście). Zmodyfikuj program BananaFunctionMinExample.mlx tak, aby było możliwe znalezienie z jego pomoca˛ arumentów minimum jednej z funkcji testowych 2D, podanych na stronie https:// en.wikipedia.org/ wiki/ Test_functions_for_optimization. Wybierz jedna,˛ w miar˛e prosta,˛ gładka˛ funkcj˛e (*) oraz jedna˛ trudna,˛ która ma: 1) kilka minimów (*), 2) jedno ostro minimum (*). 10.2 Gradient, hesjan, jakobian - definicja i użycie Podczas poszukiwania minimum algorytmy optymalizacyjne korzystaja˛ z wartości funkcji oraz, opcjonalnie, z jej pochodnych: pierwszych, drugich, kierunkowych. Aby zrozumieć idee poszczególnych algorytmów, musimy przypomnieć sobie definicj˛e podstawowych poj˛eć matematycznych z nimi zwiazanych. ˛ Definicje te zostały zebrane w tabeli 10.2 oraz przykładowo zastosowane do funkcji “bananowej” Rosenbrocka, patrz programy: • BananaFunctionMinExample.mlx, • optim_rosenbrock_all.m. 10.2 Gradient, hesjan, jakobian - definicja i użycie 205 Tabela 10.2: Definicje wybranych operacji matematycznych oraz przykład ich zastosowania dla funkcji “bananowej” Rosenbrocka Funkcja matematyczna Definicja Przykład Prosta f (x1 , x2 , ..., xN ) ∂f 100 x2 − x12 Jej gradient .1 ∇f = .. ∂x ∂ x1 ∂ x1 .. . Jej hesjan Hf = Jakobian kilku funkcji ∂∂ fx1N ∂ x1 ∂x ··· .1 . J f = .. . . ∂ fM ∂x ··· ∂f 1 + (1 − x1 )2 −400 x2 − x12 x1 − 2 (1 − x1 ) 2 200 x2 − x1 ∂f ∂ x∂N f 2 ··· .. . ··· ∂ f1 ∂ xN ∂f ∂ x1 ∂ xN .. . 1200x12 − 400x2 + 2, −400x1 −400x1 , 200 ∂f ∂ xN ∂ xN ∇Tf1 .. . . = .. ∂ fM ∇TfM T −400 x2 − x12 x1 − 2 (1 − x1 ) 2 200 x2 − x1 ∂ xN Podczas optymalizacji typu nonlinear least-squares szukamy minimum sumy kwadratów kilku znanych funkcji nieliniowych. Ponieważ funkcja “bananowa” (10.1) może być interpretowana jako suma kwadratów dwóch funkcji: f (x1 , x2 ) = f12 (x1 , x2 ) + f22 (x1 , x2 ) , (10.2) f1 (x1 , x2 ) = 10(x2 − x12 ), (10.3) f2 (x1 , x2 ) = 1 − x1 , (10.4) gdzie dlatego, w celach edukacyjnych, zainteresujmy si˛e także ich Jakobianem. Jest on dany nast˛epujacym ˛ wzorem: " ∂ f1 (x1 ,x2 ) f1 (x1 , x2 ) = ∂ f2∂(xx11,x2 ) J [f(x)] = J f2 (x1 , x2 ) ∂ x1 ∂ f1 (x1 ,x2 ) ∂ x2 ∂ f2 (x1 ,x2 ) ∂ x2 # = −20x1 , 10 . −1, 0 (10.5) W poniższym programie 10.1 pokazano, na przykładzie dwu-argumentowej funkcji “bananowej” f (x1 , x2 ) (10.1), jak w j˛ezyku Matlab można zdefiniować dowolna˛ funkcj˛e wieloargumentowa˛ f (x1 , x2 , ..., xN ) oraz jej gradient i hesjan. Zademonstrowano także jak można zdefiniować jakobian dwóch funkcji, na przykładzie funkcji składowych f1 (x1 , x2 ) (10.3) oraz f2 (x1 , x2 ) (10.4) funkcji “bananowej”. Program kończy pogladowe ˛ wywołanie funkcji fminsearch(), wykorzystujac ˛ a˛ metod˛e simplex do znalezienia minimum. Listing 10.1: Definicja funkcji bananowej oraz jej gradientu/hesjanu i jakobianu jej składowych w Matlabie % optim_rosenbrock_defs.m fun = @(x)(100*(x(2) - x(1)^2)^2 + (1 - x(1))^2); x0 = [-1.9,2]; % funkcja bananowa % argumenty jej minimum grad = @(x)[-400*(x(2) - x(1)^2)*x(1) - 2*(1 - x(1)); % # jej gradient 200*(x(2) - x(1)^2)]; %# fungrad = @(x)deal(fun(x),grad(x)); % fun + grad 206 10 Optymalizacja, czyli szukanie minimum funkcji hess = @(x)[1200*x(1)^2 - 400*x(2) + 2, -400*x(1); -400*x(1), 200]; fungradhess = @(x)deal(fun(x),grad(x),hess(x)); % # jej hesjan %# % fun + grad + hes vfun = @(x)[10*(x(2)-x(1)^2), 1-x(1)]; % f1(x1,x2) = 10*(x2 - x1^2), f2(x1,x2)=1-x1 jac = @(x)[-20*x(1),10; % banan = f(x1,x2) = f1^2 + f2^2; -1, 0]; % jacobian [f1; f2] vfunjac = @(x)deal(vfun(x),jac(x)); options = optimset(’OutputFcn’,@bananaout,’Display’,’off’); [x,fval,eflag,output] = fminsearch(fun,x0,options); title(’Rosenbrock solution via fminsearch() Simplex’); Problem 10.3 (** Użycie gradientu, hesjanu i jakobianu podczas szukania minimum funkcji). Skorzystaj z programu demonstracyjnego BananaFunctionMinExample.mlx (albo z optim_rosenbrock_all.m), dostarczanego przez Matlaba wraz z Optimization Toolbox, oraz dodaj do kodu programu 10.1 dwa inne algorytmy optymalizacyjne: jeden korzystajacy ˛ z gradientu funkcji, a drugi z jej hesjanu. Nast˛epnie zmień funkcj˛e testowa˛ z “bananowej” na inna,˛ ale także typowa.˛ Np. wybrana˛ ze strony https:// en.wikipedia.org/ wiki/ Test_functions_for_optimization. 10.3 Przykłady prostych zadań optymalizacji do rozwiazania ˛ Poniżej podano przykłady prostych zadań optymalizacji do samodzielnego rozwiaza˛ nia podczas laboratorium (jedno do wyboru). • “Wybieg dla kur/królików”: szukamy prostokata ˛ o najwi˛ekszym polu przy zadanej długości jego boków (określonej przez długość kupionej siatki), • ”Puszka Polo-Koli”: szukamy wymiarów aluminiowej puszki (dwa okragłe ˛ denka i prostokatny ˛ bok) o obj˛etości 0.3 litra, kosztujacej ˛ najmniej, czyli zużywajacej ˛ najmniej materiału, przykładowo dla identycznej albo różnej ceny denka i ścianki bocznej (np. materiał denka jest dwarazy droższy), • ”Strzał z armaty”: szukamy optymalnego kata ˛ strzału, zapewniajacego ˛ maksymalny zasi˛eg. Problem 10.4 (** Rozgrzewka). Korzystajac ˛ z wiedzy dotyczacej optymalizacji, zdobytej do tej pory, rozwia˛ż jedno z powyższych zadań, korzystajac ˛ z dost˛epnych funkcji Matlaba. W przypadku “strzału z armaty” użyj równań (9.1)(9.1), podanych w rozdziale 9. 10.4 Rodzaje zadań optymalizacyjnych 10.4.1 Definicja optymalizacji Teraz, po powyższym krótkim wprowadzeniu, jeszcze raz scharakteryzujemy zadanie optymalizacji, bardziej formalnie i precyzyjniej: 10.4 Rodzaje zadań optymalizacyjnych 207 xdown ≦ x ≦ xup (10.6) • optymalizacja to poszukiwanie optymalnego rozwiazania ˛ technicznego; • poszukiwanie wartości argumentów x# funkcji kosztu f (x) (np. ceny, czasu, złożoności, bł˛edu), określajacych ˛ jej minimum: f (x# ) = min; • zadanie maksymalizacji po zanegowaniu staje si˛e zadaniem minimalizacji; • zadanie minimalizacji przeprowadza si˛e: — w zbiorze wszystkich możliwych wartości wybranych argumentów funkcji, — w zbiorze ograniczonym przez warunki dodatkowe; • rodzaje ograniczeń: — przedziałowe: xdown ≦ x ≦ xup , — równościowe: gi (x) = 0, — nierównościowe: gi (x) ≦ 0. Ograniczenia wprowadza si˛e do procesu optymalizacji na dwa sposoby, z użyciem: • funkcji kary (dawniej) - poprzez zwi˛ekszanie wartości kryterium po przekroczeniu ograniczeń, • mnożników Lagrange’a (obecnie) - poprzez minimalizowanie funkcji kosztu uzupełnionej o dodatkowy składnik, zwiazany ˛ z ograniczeniami: m L(x, λ ) = f (x) + ∑ λi gi (x), (10.7) i=1 • w Matabie: fmincon(). 10.4.2 Minimum globalne funkcji wielu zmiennych • Wartości argumentów na siatce prostokatnej ˛ albo nierównomiernej: szukamy minimum dla zbioru punktów. • Wartości argumentów na siatce losowej, obliczenie wartości funkcji, potem: — znalezienie minimum lokalnego wokół punktu o namniejszej wartości, — znalezienie minimów lokalnych wokół każdego punktu siatki i wybór mimimum z minimów. • Zaawansowane metody losowe, np. Simulated Annealing: — dodanie czynnika losowego (zaburzenia) do metod mimimalizacji lokalnej, możliwość przeskoku do minimum obok, — na poczatku ˛ losowość duża - “bładzenie"globalne, ˛ — pod koniec losowość mała - “bładzenie” ˛ lokalne. 10.4.3 Programowanie liniowe, kwadratowe, nieliniowe i dyskretne Poniżej zostały wymienione typowe klasy zadań optymalizacji. • Programowanie liniowe (LP Linear Programming): — minimalizowane kryterium i ograniczenia sa˛ liniowe wzgl˛edem argumentów funkcji kosztu: f (x) = cT x, Ax ≦ b, x ≧ 0; — przykład: metoda Simplex, w Matlabie linprog(), 208 10 Optymalizacja, czyli szukanie minimum funkcji — rozwiazanie ˛ to przeci˛ecie hiperpłaszczyzn. • Programowanie kwadratowe (QP Quadratic Programming): — minimalizowane kryterium jest kwadratowe, natomiast ograniczenia - liniowe: f (x) = xT Qx + cT x, Ax ≦ b, Ex = d, — w Matlabie quadprog(). • Programowanie nieliniowe (Nonlinear Programming): – iteracyjne szukanie minimum: wykorzystanie wartości funkcji f (xk ) w wybranych punktach xk ; – minimalizacja lokalna: szukamy pojedynczego minimum w ”okolicy” xk , jeśli możemy (brak nieciagłości) ˛ wykorzystujemy także wartości pochodnych funkcji; – minimalizacja globalna: funkcja ma wiele minimów lokalnych, dlatego szukamy ”minimum z minimów”: 1. wielokrotnie startujemy z różnych punktów, 2. odstrajamy si˛e od znalezionych minimów w nadziei na znalezienie lepszego rozwiazania. ˛ • Programowanie dyskretne (Binary programming): — — — — argumenty funkcji przyjmuja˛ tylko całkowite wartości, popularny algorytm Dijktry, przykład: najkrótsza droga w grafie, np. nawigacja samochodowa, przykład: problem komiwojażera - odzwiedzenie K miast, tylko jeden raz każde z nich, najkrótsza droga. 10.5 Szukanie minimum funkcji jednoargumentowej Proste metody stosowane w tym przypadku sa˛ analogia˛ do szukania miejsca zerowego funkcji metoda˛ bisekcji: otaczamy i zaw˛eżamy przedział poszukiwań minimum - patrz rysunek 10.5, ilustrujacy ˛ metod˛e złotego podziału oraz podziału Fibonacciego. 10.5 Szukanie minimum funkcji jednoargumentowej 209 Rysunek 10.5: (po lewej) Szukanie minimum metoda˛ złotego√podziału albo podziału Fibonacciego, (po prawej) wyprowadzenie stałej k = 1+2√5 = 5−1 2 = 0.618... złotego podziału W przypadku poszukiwania minimum funkcji: • znajac ˛ wartości funkcji f (xL ) oraz f (xR ) dla punktów xL oraz xR , leżacych ˛ wewnatrz ˛ przedziału [a, b], podejmujemy decyzj˛e gdzie kontynuować poszukiwania: [a, xR ] albo [xL , b] (decyduje nachylenie siecznej), • współczynnik podziału “k” jest zmienny w różnych metodach: √ 5−1 = 0.618, h 2 i Fn podział Fibonacciego: k = Fn+1 ˛ Fibonacciego liczb: , ..., 58 , 53 , 23 , 12 , gdzie ciag – podział złoty: k = – 2√ 1+ 5 = F0 = F1 = 1, Fn+1 = Fn + Fn−1 , • zmiejszanie si˛e bł˛edu: — podział złoty: errn = 0.618n ∗ (b − a), — podział Fibonacciego: errn ≦ Fb−a , gdzie przyj˛ete Fn+1 zależy od poczatko˛ n+1 wej wartości b − a oraz wymaganego errmax: Fn+1 ≧ b−a maxerr . W programie 10.2 zastosowano obie opisane powyżej metody podziału, złotego i Fibonacciego, do obliczenia czasu, po którym osiaga si˛e maksymalna˛ wysokość skoku na bangee (szukamy minimum funkcji zanegowanej). Analizowana funkcja jest w tym przypadku określona wzorem: mg i h c m mg f (t) = − z0 + v0 + 1 − e− m t − t , (10.8) c c c gdzie: z0 - wysokość poczatkowa ˛ w metrach, m - masa w kilogramach, c - współczynnik oporu liniowego kg/s, v0 - pr˛edkość poczakowa ˛ w m/s, g - przyspieszenie ziemskie m . s2 Listing 10.2: Program Matlaba do znajdowania minimum funkcji metoda˛ złotego podziału oraz metoda˛ podziału Fibonacciego % optim_golden_fibonacci.m clear all; close all; % Bungee 210 10 Optymalizacja, czyli szukanie minimum funkcji z0 = 100; m = 80; c = 15; v0 = 55; g = 9.81; f = @(t) -( z0 + m/c*(v0+(m*g)/c)*(1-exp(-(c/m)*t))-((m*g)/c)*t ); t0 = (m/c)*log(1+(c*v0)/(m*g)), % Golden search a=1; b=7; k = 2/(1+sqrt(5)); % = (sqrt(5)-1)/2; xL = b-k*(b-a); xR = a+k*(b-a); iter = 0; while( (b-a)>1e-6 ) if( f(xL)<f(xR) ) b = xR; xR = xL; xL = b-k*(b-a); else a = xL; xL = xR; xR = a+k*(b-a); end iter = iter + 1; end disp(’GOLDEN’); iter, xopt = (a+b)/2 % Fibonacci search a=1; b=7; tol = 10^(-5); F = [ 0, 1 ]; n=2; while( F(n) <= (b-a)/tol ) n = n+1; F(n) = F(n-1)+F(n-2); end (b-a)/tol, F(n), imax = n, pause k = (1-F(imax-2)/F(imax)); % pause xL = b - k*(b-a); xR = a + k*(b-a); i = imax-1; while( i > 3 ) k = (1-F(i-2)/F(i)), pause if( f(xL)<f(xR) ) b = xR; xR = xL; xL = b-k*(b-a); else a = xL; xL = xR; xR = a+k*(b-a); end i = i - 1; end disp(’FIBONACCI’); t0, iter, xopt = (a+b)/2 Problem 10.5 ((L)* Strzał z armaty). Zmodyfikuj program 10.2 tak, aby znajdował on maksymalna˛ wysokość pocisku, wystrzelonego z armaty. Skorzystaj z równań (9.1)(9.1). Metody interpolacyjne: iteracyjnie interpolujemy funkcj˛e “wchodzac” ˛ w obszar malejacych ˛ wartości. Poszukiwanie kwadratowe (quadratic search) quadsearch() • dysponujemy wartościami funkcji w trzech punktach: f (x1 ), f (x2 ), f (x3 ), • budujemy wielomian interpolujacy: ˛ p(x) = ax2 + bx + c, b • znajdujemy położenie jego minimum: xmin = − 2a , czyli: x4 = x2 − 1 (x2 − x1 )2 [ f (x2 ) − f (x3 )] − (x2 − x3 )2 [ f (x2 ) − f (x1 )] 2 (x2 − x1 )[ f (x2 ) − f (x3 )] − (x2 − x3 )2 [ f (x2 ) − f (x1 )] 10.5 Szukanie minimum funkcji jednoargumentowej 211 • odrzucamy skrajny (“nawyższy”) punkt przedziału i powtarzamy iteracj˛e. Listing 10.3: Funkcja Matlaba implementujaca ˛ metod˛e poszukiwania kwadratowego function [x,fx]=quadsearch(f,x1,x2,x3,tol,maxiter,ifigs,x) iter = maxiter; while( iter > 0 ) % iter fx1 = feval(f,x1); fx2 = feval(f,x2); fx3 = feval(f,x3); x4 = x2 - ((x2-x1)^2*(fx2-fx3)-(x2-x3)^2*(fx2-fx1)) / ... ((x2-x1) *(fx2-fx3)-(x2-x3) *(fx2-fx1)); fx4 = feval(f,x4); if(ifigs==1) plot(x,feval(f,x),’b-’,x1,fx1,’b*’,x2,fx2,’ro’,x3,fx3,’ks’,x4,fx4,’gp’); grid; pause end if( (x4>x2) & (x4<x3) ) x1 = x2; x2 = x4; elseif ( (x4>x1) & (x4<x2) ) x3 = x2; x2 = x4;; elseif ( x4<x1 ) x3=x2; x2=x1; x1=x4; elseif ( (x4>x3) ) x1=x2; x2=x3; x3=x4; else end if ( abs(x1-x2) < tol ) x2 = (x1+x3)/2; elseif ( abs(x2-x3) < tol ) x2 = (x2+x3)/2; end iter = iter-1; end x=x4; fx=feval(f,x4); Problem 10.6 (* Poszukiwanie kwadratowe). Przeanalizuj kod funkcji quadsearch(). Zastosuj ja˛ do znalezienia maksymalnej wyskości skoku na bungee, tzn. dodaj jej wywołanie do programu 10.2. Poszukiwanie sześcienne (cubic search): stosowane kiedy jest dost˛epna pochodna funkcji - używamy wówczas wartości funkcji i jej pochodnych w dwóch punktach f (x1 ), f (x2 ), f ′ (x1 ), f ′ (x2 ) do znalezienia współczynników wielomianu: p(x) = ax3 + bx2 + cx + d. O kierunku dalszych poszukiwań decyduje pochodna w nowym punkcie. Funkcja Matlaba fminbnd() - to połaczenie ˛ metody złotego podziału oraz interpolacji kwadratowej. Metody wielowymiarowe - to iteracyjne poszukiwanie minumum wzdług wybranego nowego kierunku. 212 10 Optymalizacja, czyli szukanie minimum funkcji 10.6 Przykład złożonej optymalizacji jednoargumentowej Profil skoczni narciarskiej zapewniajacej ˛ najkrótszy czas przejazdu. Rozwiazanie ˛ sub-optymalne: szukamy wartości a paraboli: f (x) = (ax − 1)(x − 1) = ax2 − (a + 1)x + 1. % optim_skocznia.m - przyklad profilu skoczni narciarskiej x = 0 : 0.001 : 1; figure; for a = 1 : 0.5 : 5 f = a*x.ˆ2-(a+1)*x+1; plot(x,f); hold on; end grid; title(’a=0:0.5:5’); xlabel(’x’); ylabel(’f(x)’); Rysunek 10.6 Profil skoczni, opisanej parabola˛ f (x) = ax2 −(a+1)x+1, dla różnych wartości parametru a a = 0 : 0.5 : 5 1 f(x) 0.5 0 -0.5 -1 0 0.2 0.4 0.6 0.8 1 x Czas przejazdu t(a) jest wyprowadzany z zasady zachownia energii (kinetyczna <-> potencjalna, m-masa, g-przyspieszenie ziemskie, v - pr˛edkość): mv2 = mg(1 − f (x)) 2 s Z 1p Z 1 1 + f ′ (x)2 1 + f ′ (x)2 t(a) = dx = dx v 2g(1 − f (x)) 0 0 Obliczamy całk˛e numerycznie dla różnych wartości a: kolejna testowana wartość a jest wybrana zgodnie ze schematem minimalizacji. Problem 10.7 (** Odskocznia od nudy). Napisz program rozwiazuj ˛ acy ˛ opisany powyzej problem. Zastosuj dowolna˛ metod˛e. 10.7 Minimalizacja wieloargumentowa bez pochodnych Metoda Simplex (Nelder-Mead): w Matlabie fminsearch() 10.8 Metody gradientowe - użycie pochodnych 213 Rysunek 10.7: Zasada działania metody Simplex • Simplex to naprostsza, N + 1-punktowa figura geometryczna w przestrzeni Nwymiarowej, np. trzypuntowa na płaszczyźnie xy. • W każdym punkcie obliczamy wartość f (x). • Nast˛epnie odbijamy symetrycznie argument punktu najwyżej położonego wzgl˛edem naprzeciwległej ściany simpleksu, czyli prostej w przypadku 2D. • Możemy dokonać operacji skurczenia albo rozszerzenia wynikowego simpleksu. • Powtarzajac ˛ t˛e oparacj˛e, poruszamy si˛e w kierunku minimum. • Kończymy, gdy simpleks osiagnie ˛ wartość uznana˛ za graniczna.˛ 10.8 Metody gradientowe - użycie pochodnych Metoda najwi˛ekszego spadku (steepest descent): kolejne przybliżenie minimum jest w kierunku przeciwnym do gradientu funkcji ∇ f (x): d = −∇ f (x) → xk+1 = xk + α · d W Matlabie: metoda fminunc() Kolejność obliczeń dla mimimalizacji wielowymiarowej: • wyznaczenie kierunku poszukiwań, • szukanie minimum w tym kierunku. Metoda kierunków/gradientów sprz˛eżonych: metody Fletchera-Reevesa i PolakaRibiere’a, mniej popularne, ale o podobnej szybkości zbieżności. Problem 10.8 (** Gradient analityczny). Na poczatku ˛ programu10.4 napisano funkcje z(t), z1p(t), z2p(t), opisujace ˛ skok na bungee: wysokość w funkcji czasu oraz pierwsza i druga pochodna funkcji wysokości. Dokończ ten program tak, aby wyznaczył on chwil˛e osiagni˛ ˛ ecia przez skoczka maksymalnej wysokości metoda˛ gradientu analitycznego. Listing 10.4: Program Matlaba do znajdowania minimum funkcji metoda gradientu analitycznego oraz metoda˛ Newtona na przykładzie skoku na bungee % optim_analyticgrad1.m clear all; close all; 214 10 Optymalizacja, czyli szukanie minimum funkcji % Bungee jump % z(t) - funkcja wysokosci % z1p(t), z2p(t) - jej pierwsza i druga pochodna z0 = 100; m = 80; c = 15; v0 = 55; g = 9.81; z = @(t) ( z0 + m/c * (v0+(m*g)/c) * (1-exp(-(c/m)*t)) - ((m*g)/c)*t ); z1p = @(t) ( v0*exp(-(c/m)*t)-((m*g)/c)*(1-exp(-(c/m)*t)) ); z2p = @(t) ( (-(c/m)*v0-g)*exp(-(c/m)*t) ); t0 = (m/c)*log(1+(c*v0)/(m*g)); % Znajdz sam maksimum funkcji z(t) ... Problem 10.9 ((L)* Pierwszy przykład użycia metod gradientowych w 2D). Ponownie b˛edziemy szukać minimum funkcji bananowej z = f (x, y) = (x − 1)2 + 100y2 , majacej: ˛ • minimum w punkcie f(1,0)=0, • znane pochodne czastkowe ˛ wzgl˛edem x, y. Tym razem użyjemy funkcji Matlaba fminunc() oraz nie skorzystamy i skorzystamy ze znajomości pochodnych: patrz program 10.5. Wybierz inna˛ funkcj˛e 2D ze strony https:// en.wikipedia.org/ wiki/ Test_functions_for_optimization oraz znajdź jej mimimum z użyciem pochodnych. Listing 10.5: Przykład szukania minimum funkcji bananowej z użyciem gradientu % optim_analyticgrad2.m clear all; close all; % minimalizacja bez gradientu [x,fx,info,output] = fminunc(’fxy’,[1 1]), pause % function count=24 % minimalizacja z gradientem opt = optimset(’GradObj’,’on’); [x,fx,info,output] = fminunc(’fxy’,[1 1],opt), pause % function count=9 function [f,fp]=fxy(x) f = (x(1)-1).^2 + 100*x(2).^2; fp = [ 2*(x(1)-1); 200*x(2) ]; end Problem 10.10 (** Drugi przykład użycia metod gradientowych w 2D). Znajdź minimum funkcji: z = f (x1 , x2 ) = 2 + x1 − x2 + 2x12 + 2x1 x2 + x22 , pokazanej na rysunku 10.8. (10.9) 10.9 Metody różniczkowe drugiego rz˛edu 215 Rysunek 10.8: Kształt funkcji f (x1 , x2 ), której minimum szukamy w zadaniu 10.10 10.9 Metody różniczkowe drugiego rz˛edu • W metodzie Newtona-Raphsona, podczas szukania miejsca zerowego funkcji, mieliśmy: xk+1 = xk − ff′(x) (x) , • W metodzie Newtona (minimalizacja), podczas szukania miejsca zerowego po′ chodnej funkcji, mamy: xk+1 = xk − ff′′(x) (x) , • W przypadku wieloargumentowym: xk+1 = xk + d, gdzie d jest obliczane z równania Hd = −∇ (H - macierz hesjanu, czyli drugich pochodnych czastkowych ˛ w bieżacym ˛ punkcie, ∇ - wektor gradientu w bieżacym ˛ punkcie); • W metodzie quasi-Newtona wykonuje si˛e iteracyjna˛ aktualizacj˛e H, np. algorytmem BFGS (fminunc(),fmincon()): Hk+1 = Hk + qk qTk Hk T sTk sk Hk − , qTk sk sTk Hk sk sk = xk+1 − xk , qk = ∇f(xk+1 ) − ∇f(xk ) Problem 10.11 (** Metoda Newtona). Na poczatku ˛ programu 10.4 napisano funkcje z(t), z1p(t), z2p(t), opisujace ˛ skok na bungee: wysokość w funkcji czasu oraz pierwsza i druga pochodna funkcji wysokości. Dokończ ten program tak, aby wyznaczył on chwil˛e osiagni˛ ˛ ecia przez skoczka maksymalnej wysokości metoda˛ Newtona, czyli z wykorzystaniem znajomości pierwszej i drugiej pochodnej funkcji wysokości. Problem 10.12 (*** Joker). Zastosuj dowolna˛ metod˛e do znalezienia minimum i maksimum funkcji 2D: x2 + y2 , 20 przedstawionej na rysunku 10.9 oraz wygenerowanej w programie 10.6. z = f (x, y) = x · e−x 2 −y2 + (10.10) 216 10 Optymalizacja, czyli szukanie minimum funkcji Rysunek 10.9: Funkcja 2D, której minimum i maksimum należy znaleźć Listing 10.6: Program generujacy ˛ funkcj˛e której minimum i maksimum należy znaleźć % optim_surf.m clear all; close all; f = @(x,y) x.*exp(-x.^2-y.^2)+(x.^2+y.^2)/20; figure; fsurf(f,[-2,2],’ShowContours’,’on’); xlabel(’x’); ylabel(’y’); title(’z=f(x,y)’); 10.10 Metody różniczkowe drugiego rz˛edu dla nieliniowej najmniejszej sumy kwadratów (NLS) W metodzie NLS (Nonlinear Least Squares) dysponujemy zbiorem kilku funkcji wieloargumentowych f1 (x), f2 (x), ..., gdzie x = [x1 , x2 , ...]. W syntetycznym zapisie: f(x). Chcemy znaleźć taki wektor wartości x, dla którego suma kwadratów wszystkich funkcji przyjmie wartość minimalna˛ (minimalizowane kryterium): f (x) = ∑ fi2 (x) = f(x)T f(x). (10.11) i Co robimy? • Liczymy wektor gradientu ∇ f (x) oraz macierz hesjanu H f (x) minimalizowanej funkcji f (x) (poniżej: J - jakobian zbioru funkcji f(x): pierwsze pochodne czast˛ kowe wszystkich funkcji, H fi - hesjan i-tej funkcji fi (x): drugie pochodne kierunkowe tej funkcji): ∇ f (x) = 2J(x)T f(x) H f (x) = 2J(x)T J(x) + Q(x), (10.12) Q(x) = ∑ fi (x)H fi (x), i (10.13) 10.10 Metody różniczkowe drugiego rz˛edu dla nieliniowej najmniejszej sumy kwadratów (NLS)217 • Nowy kierunek d poszukiwań minimum funkcji (10.11) otrzymujemy rozwiazu˛ jac ˛ równanie: H f (x)d = −∇ f (x). (10.14) • Kiedy pomijamy Q, otrzymujemy metod˛e Gaussa-Newtona, w której równanie (10.14) upraszcza si˛e do nast˛epujacej ˛ postaci (po podstawieniu definicji na gradient ∇ f (x) (10.12) i hesjan H f (x) (10.13)): J(x)d = −f(x). (10.15) • Kiedy Q w równaniu (10.13) na hesjan nie można pominać, ˛ to stosuje si˛e metod˛e Lavenberga-Marquardta, lsqnonlin(), w której nie korzysta si˛e w ogóle z hesjanu tylko z metody najwi˛ekszego spadku (dla dużej wartości α): [J(x)T J(x) + αI]d = −J(x)T f(x). (10.16) gdzie: — α = 0 - kierunek d Gaussa-Newtona, — α >> 0 - o kierunku d decyduje składnik gradientu I (po prawej), a nie hesjanu J(x)T J(x) (po lewej). WAŻNE! Metody optymalizacji nieliniowej sumy kwadratów bardzo cz˛esto wykorzystuje si˛e do znajdowania wartości parametrów funkcji, która˛ chce si˛e dopasować do danych eksperymentalnych. Przykład takiego dopasowania jest przedstawiony na rysunku 10.10. Pokazywany przypadek jest rozpatrywany w problemie 10.13. 218 10 Optymalizacja, czyli szukanie minimum funkcji y=f(x) 6 5 4 lambda = 11.1103 1.5162 c = 2.8842 2.9629 blad = 0.085417 3 2 1 0 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 y Rysunek 10.10: Przykład dopasowywania wartości parametrów funkcji do dodanych eksperymentalnych - patrz problem 10.13 Problem 10.13 (** Dopasowywanie parametrów funkcji do danych eksperymentalych). Załóżmy, że dysponujemy zebranym eksperymentalnie zbiorem wielu par punktów eksperymentalnych (xn , yn ), n = 1...N, oraz że wiemy, iż “w teorii” y powinien zależeć od x w nast˛epujacy ˛ sposób: y = f (x) = c1 · e−λ1 x + c2 · e−λ2 x . (10.17) W programie 10.7 wyznaczono wartości parametrów c1 , c2 , λ1 , λ2 , dla których bład ˛ średniokwadratowy niedopasowania funkcji do danych: s 1 N (10.18) ε= ∑ (yn − f (xn ))2 N n=1 osiaga ˛ minimum. Na rysunku 10.10 pokazano wynik końcowy dopasowania funkcji do danych. Zapoznaj si˛e z programem. Uruchom go, obejrzyj rysunki. A teraz “przez analogi˛e” ... wygeneruj N próbek zaszumionej, tłumionej sinusoidy: y = f (x) + szum = Ae−dx sin(Ω x) + szum, x = 0, 1, ..., N − 1. (10.19) W tym celu wykorzystaj poniższy kod Matlaba (program optim_dampedsin.m): N=100; x=0:N-1; A=1; d=0.01; omega=pi/10; y = A*exp(-d*x).*sin(omega*x) + 0.025*randn(1,N); plot(x,y); Nast˛epnie tak zmodyfikuj program 10.7, aby znalazł on przybliżone wartości A,d,omega na podstawie zbioru punktów “eksperymentalnych” (xn , yn ). 10.10 Metody różniczkowe drugiego rz˛edu dla nieliniowej najmniejszej sumy kwadratów (NLS)219 Listing 10.7: Przykład szukania minimum sumy kwadratów bł˛edu niedopasowania funkcji do danych pomiarowych % optim_nonlin_ls.m % dopasowanie parametrow znanej funkcji do danych eksperymentalnych clear all; close all; global dane % zmienna globalna - tzn. widziana z innych *.m zbiorow dane = ... % pary punktow (x,y), otrzymane doswiadczalnie [ 0.0000 5.8955 % np. podczas laboratorium z fizyki 0.1000 3.5639 % pierwsza kolumna argument x 0.2000 2.5173 % druga kolumna wartosc y ... 1.8000 0.2211 1.9000 0.1704 2.0000 0.2636 ]; x = dane(:,1); y = dane(:,2); % pobranie wektora argumentow x i wartosci y plot(x,y,’ro’) % wykres y w funkcji x, czerwone "o" title(’Dane doswiadczalne’); grid; pause; clc % % % % % % % % Dane zjawisko opisuje teoretyczna zaleznosc: y = f( x ) = c(1) * exp(-lambda(1)*x) + c(2) * exp(-lambda(2)*x) Powyzsza funkcja ma dwa parametry liniowe: c(1) i c(2) oraz dwa parametry nieliniowe: lambda(1) i lambda(2). Chcemy wyznaczyc takie wartosci tych parametrow, aby funkcja y=f(x) byla najlepiej dopasowana do punktow eksperymentalnych (x,y). params = [ 3.5, 2.5, 12, 1 ]; % punkt startowy [ c(1), c(2), lam(1), lam(2) ] % c(1) = 2.998787301736222, c(2)=2.896688863655001 % labda(1) = 10.606681005172833, lambda(2) = 1.404754349489554 toler = 0.1; % wymagany blad opt = optimset( ’TolX’, toler ); blad = fminsearch(’fun_fit’, params, opt ); c(1:2) = blad(1:2), lambda(1:2) = blad(3:4), % procedura minimalizacyjna % naciskaj enter % wynikowe c(1) i (2) % wynikowe lambda(1) i (2) fy = c(1)*exp(-lambda(1)*x) + c(2)*exp(-lambda(2)*x), blad = std(fy-y), % wartosc funkcji % wartosc bledu % ############################# function blad = fun_fit(params) % ############################# global dane x = dane(:,1); y = dane(:,2); c(1:2) = params(1:2); lambda(1:2) = params(3:4); % podstaw dane do zmiennych lokalnych % szukane c(1) i c(2) % wynikowe lambda(1) i lambda(2) fy = c(1)*exp(-lambda(1)*x) + c(2)*exp(-lambda(2)*x); % aktualna wartosc blad = std(fy-y); % jak wartosci funkcji rozni sie od danych eksperymentalnych % dla obecnych parametrow lambda i c % Pokaz postep w dopasowaniu parametrow funkcji do danych eksperymentalnych plot(x,fy,x,y,’o’); xlabel(’x’); ylabel(’y’); title(’y=f(x)’); grid; xt = max(x)/2; yt = max(y)/2; text(xt,1.2*yt,[’lambda = ’ num2str( lambda(1) ) ’ ’ num2str( lambda(2) )]) text(xt,1.1*yt,[’c = ’ num2str( c(1) ) ’ ’ num2str( c(2) )]) 220 text(xt,1.0*yt,[’blad pause 10 Optymalizacja, czyli szukanie minimum funkcji = ’ num2str( blad )]) end 10.11 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. • Optymalizacja to poszukiwanie minimum funkcji. • Minimalizacja jednowymiarowa (jednoargumentowa) jest podobna do poszukiwania miejsca zerowego funkcji (metody golden-section, quadraticinterpolation). • Minimalizacja wielowymiarowa - to jednowymiarowa w wybranym, zmiennym kierunku. • Minimalizacja wielowymiarowa - korzysta z pochodnych (jakobian) i drugich pochodnych czastkowych ˛ (hesjan) analizowanej funkcji. • Minimalizacja sumy kwadratów - to prostsze obliczenia. • Minimalizacja globalna - problem unikni˛ecia minimów lokalnych. • Minimalizacji funkcji dyskretnych - specjalne algorytmy ewolucyjne/genetyczne. Literatura 1. MathWorks, Optimization Toolbox Examples,on-line: https:// www.mathworks.com/ help/ optim/ examples.html. 2. MathWorks, Optimization Toolbox User Guide,on-line: https:// www.mathworks.com/ help/ optim/ (pobieranie: prawy górny róg). Rozdział 11 ODE - Rozwiazywanie ˛ równań różniczkowych zwyczajnych Streszczenie Przykłady numerycznego rozwiazywania ˛ wybranych równań różniczkowych zwyczajnych w Matlabie: równania van der Pola oraz równania układu RLC; idea rozwiazywania ˛ równań różniczkowych zwyczajnych poprzez całkowanie pochodnych, klasyfikacja metod: metody ekstrapolacyjne i interopolacyjne, algorytmy: Rungego-Kutty, Adamsa-Bashfortha, Adamsa-Moulona i Geara. 11.1 Wprowadzenie Równania różniczkowe sa˛ bardzo ważne ponieważ opisuja˛ dynamik˛e zjawisk fizycznych, zachodzacych ˛ w otaczajacym ˛ nas świecie, jego obiektów i systemów. Rozwia˛ zujac ˛ równanie algebraiczne, np. ax2 + bx + c = 0, (11.1) szukamy wartości x, dla których równanie jest prawdziwe (spełnione). W naszym √ −b± b2 −4ac , gdzie a, b, c sa˛ znanymi współczynprzykładzie sa˛ to wartości x1,2 = 2a nikami równania (skalarami). Natomiast rozwiazuj ˛ ac ˛ równanie różniczkowe zwyczajne, np. d2 x(t) dx(t) +b + cx(t) = u(t), (11.2) dt 2 dt szukamy takiej funkcji x(t), dla której równanie jest prawdziwe dla dowolnej wartości argumentu t, najcz˛eściej czasu. u(t) to zadana, znana funkcja pobudzajaca. ˛ Jeśli a, b, c sa˛ wartościami stałymi, to równanie różniczkowe zwyczajne (11.2) jest liniowe. Natomiast jeśli chociaż jeden z tych współczynników zależy od x(t) lub jakiejś innej funkcji - to nieliniowe. Przykładem liniowego równania różniczkowego zwyczajnego drugiego rz˛edu jest równanie oscylatora tłumionego, np. mechanicznego (czujnik drgań sejsmicznych - masa wiszaca ˛ na spr˛eżynie z dodanym tłumikiem) i elektrycznego (szeregowe połaczenie ˛ elementów R,L,C): a d2 x(t) dx(t) + 2ξ ω0 + ω02 x(t) = Kω02 u(t), (11.3) 2 dt dt które ma dla t ≧ 0 nast˛epujace ˛ rozwiazanie ˛ dla pobudzenia impulsowego u(t) = δ (t): ω0 −ξ ω0 t e sin(ω0 ηt), η dla ξ < 1 : x(t) = K dla ξ = 1 : x(t) = Kω02te−ω0 t , (11.4) (11.5) oraz dla pobudzenia skokiem jednostkowym u(t) = 1(t): dla ξ < 1 : dla ξ = 1 : 1 x(t) = K 1 − e−ξ ω0 t sin(ω0 ηt + asin(η)) , η x(t) = K 1 − (1 + ω0t)e−ω0 t , (11.6) (11.7) 221 222 11 ODE - Rozwiazywanie ˛ równań różniczkowych zwyczajnych gdzie ω0 to cz˛estotliwość radialna drgań własnych nietłumionych oscylatora (ω0 = p 2π f0 , f0 - cz˛estotliwość w hercach), ξ to jego tłumienie, natomiast η = 1 − ξ 2 . Przykład - masa wiszaca ˛ na spr˛eżynie wraz z tłumikiem. W tym przypadku równanie (11.3) otrzymuje si˛e w wyniku nast˛epujacego ˛ warunku równości działajacych ˛ sił — suma: 2 d x(t) 1. siły bezwładności Fb = m · a = m dv(t) ˛ ma mas˛e m (a dt = m dt 2 , działajacej przyspieszenie, v(t) - pr˛edkość, x(t) - położenie), 2. siły tłumiacej ˛ Ft = B dx(t) dt , 3. siły reakcji spr˛eżyny Fs = ks x(t), musi być równa sile wymuszajacej ˛ u(t) = F: d2 x(t) dx(t) +B + ks x(t) = u(t). dt 2 dt W zwiazku ˛ z tym w równaniu (11.3) należy podstawić: r 1 B ks K = , ω0 = , ξ= p . ks m 2 ks /m m (11.8) (11.9) Problem 11.1 (* Rozwiazanie ˛ równania różniczkowego pierwszego rz˛edu układu całkujacego). ˛ Sprawdź analitycznie i numerycznie czy równanie różniczkowe postaci: dx(t) + x(t) = u(t), (11.10) dt opisujace ˛ m.in. szeregowe połaczenie ˛ rezystancji i pojemności, ma nast˛epujace ˛ rozwiazania ˛ (dla t ≧ 0) dla dwóch różnych typów pobudzeń u(t): T 1 1. u(t) = δ (t) → x(t) = T1 e− T t , 2. u(t) = 1(t) → x(t) = 1 − T1 e− T t . 1 Problem 11.2 (** Sprawdzenie wzorów na rozwiazanie ˛ równania różniczkowego oscylatora tłumionego). Narysuj funkcje (11.4), (11.5), (11.6) oraz (11.7). Sprawdź analitycznie czy sa˛ one rzeczywiście rozwiazaniem ˛ równania różniczkowego (11.3) - tzn. oblicz pochodne tych funkcji, podstaw je do równania i sprawdź czy jest ono spełnione. Dokonaj także sprawdzenia numerycznego - dysponujac ˛ wzorami na pochodne, podstaw do nich t i sprawdź czy wartości po lewej i prawej stronie równania różniczkowego (11.3) sa˛ takie same. 11.2 Ogólna idea rozwiazywania ˛ równań różniczkowych Teraz, po krótkim wprowadzeniu, zaczniemy od teorii (czyli z “wysokiego C”), ale mamy nadziej˛e, że przykład przedstawiony poniżej przedstawi rozpatrywane zagad- 11.2 Ogólna idea rozwiazywania ˛ równań różniczkowych 223 nienie w znacznie przyst˛epniejszy sposób. W przypadku problemów ze zrozumieniem, należy od razu przejść do przykładu, a potem ewentualnie wrócić do opisu teoretycznego. Równania różniczkowe zwyczajne wyższych rz˛edów, liniowe lub nieliniowe. Po przyj˛eciu oznaczenia x1 (t) = x(t), równanie różniczkowe (11.2): d2 x(t) dx(t) +b + cx(t) = u(t), dt 2 dt można zapisać w postaci układu równań różniczkowych pierwszego rz˛edu: ( dx1 (t) dt = x2 (t), dx2 (t) 1 dt = a [−bx2 (t) − cx1 (t) − u(t).] a (11.11) (11.12) które należy rozwiazać ˛ ze wzgl˛edu na zmienne x1 (t) oraz x2 (t). Powyższy układ równań można ogólnie zapisać w postaci wektorowej w nast˛epujacy ˛ sposób: dx(t) = f (t, x(t), ) (11.13) dt a nast˛epnie rozwiazać ˛ ze wzgl˛edu na wektor zmiennych stanu x(t) = [x1 (t), x2 (t), ..., xn (t)]. W równaniu (11.13) fi (t, x(t)), i = 1, 2, ..., n, oznacza zbiór n funkcji, ogólnie nieliniowych, określajacych ˛ wartości pochodnych zmiennych stanu xk (t) w chwili t (patrz (11.12)). Przyjmuje si˛e, że t zmienia si˛e od t0 do tmax . Rozwiazanie ˛ równania (11.13) ze wzgl˛edu na x(t) sprowadza si˛e do obliczenia poniższej całki: Z t x(t) = t0 f ( x(t),t ) dt + x t0+ . (11.14) A całkować numerycznie już umiemy. x t0+ to wartości poczatkowe ˛ wszystkim elementów wektora x(t) w chwili poczatkowej ˛ t0 . W postaci dyskretnej pochodna˛ można zapisać jak w poniższym równaniu po lewej stronie, zaś całkować jak w równaniu po prawej stronie (h oznacza krok w czasie): dx xk+1 − xk = = f(xk ) → xk+1 = xk + h · f(xk ). (11.15) dt h Równania różniczkowe liniowe o stałych współczynnikach przy wszystkich pochodnych różnych rz˛edów. W tym prostszym przypadku równanie (11.13) upraszcza si˛e do nast˛epujacej ˛ postaci: d x(t) = Ax(t) + Bu(t) (11.16) dt gdzie An×n i Bn×m to macierze o podanych wymiarach (n - liczba zmiennych stanu/równań, m - liczba funkcji/sygnałów pobudzajacych). ˛ Ogólne rozwiazanie ˛ równania (11.16) ma postać: x(t) = eAt x(0) + Z t eA(t−τ) Bu(τ)dτ. (11.17) 0 Nie stosuje si˛e go jednak w praktyce obliczeniowej z powodu dużej złożoności: preferuje si˛e algorytmy szybkiego całkowania równania zmiennych stanu (11.16). 224 11 ODE - Rozwiazywanie ˛ równań różniczkowych zwyczajnych 11.3 Przykład rozwiazywania ˛ równań różniczkowych w Matlabie Obecnie zostanie przedstawiony prosty przykład, ilustrujacy ˛ przedstawiona˛ powyżej metod˛e, zapożyczony z [2]. Powinien on odczarować zawiłości zapisu matematycznego i pomóc nam zrozumieć sposób rozwiazywania ˛ równań różniczkowych. Jest to lektura OBOWIAZKOWA ˛ dla wszystkich! Przykład. Równanie van der Pola jest nast˛epujace: ˛ dx(t) d 2 x(t) − µ 1 − x(t)2 + x(t) = 0 2 dt dt Po wprowadzeniu nast˛epujacych ˛ zmiennych i oznaczeń: (11.18) x1 (t) = x(t), (11.19) dx1 (t) x2 (t) = , dt (11.20) można je zapisać w nast˛epujacej ˛ postaci jako układ dwóch równań różniczkowych pierwszego rz˛edu, który należy rozwiazać ˛ ze wzgl˛edu na x1 (t) oraz x2 (t): dx1 (t) = x2 (t), dt dx2 (t) = µ 1 − x12 (t) x2 (t) − x1 (t) dt (11.21) (11.22) Drugie równanie (11.22) to inaczej zapisane równanie (11.18). Układ równań (11.21)(11.22) to szczególny przypadek równania (11.12). Listing 11.1 zawiera kod funkcji Matlaba, kodujacy ˛ te równania, natomiast listing 11.2 pokazuje program główny, który korzysta z tej funkcji i rozwiazuje ˛ równanie van der Pola metoda˛ Runkego-Kutty 23. Na rysunku 11.1, po lewej stronie, jest pokazany obliczony przebieg czasowy dwóch funkcji: x1 (t) = x(t) oraz x2 (t) = dxdt1 (t) , natomiast po prawej stronie — jest przedstawiony wykres fazowy, b˛edacy ˛ rozwiazaniem ˛ równania różniczkowego, czyli zależność x2 (t) (pochodna funkcji) od x1 (t) (właściwa funkcja). 11.3 Przykład rozwiazywania ˛ równań różniczkowych w Matlabie x1(t) dla ODE23 2 3 225 Przestrzen fazowa x2(t)=fun( x1(t) ) dla ODE23 1 2 0 -1 1 0 5 10 15 20 t [s] x2(t) dla ODE23 4 x2(t) -2 0 -1 2 0 -2 -2 -4 0 5 10 15 20 t [s] -3 -3 -2 -1 0 1 2 3 x1(t) Rysunek 11.1: Obliczony numerycznie kształt dwóch funkcji x1 (t) = x(t) oraz x2 (t) = dx1 (t) edacych ˛ rozwiazaniem ˛ równania różniczkowego van der Pola (11.18) (po ledt , b˛ wej stronie) oraz x2 (t) jako funkcja x1 (t), czyli wynik w tzw. przestrzeni fazowej (po prawej stronie). Listing 11.1: Funkcja Matlaba dla równania van der Pola xprime = fun_diff(t,x) global mi % zmienna globalna xprime = [ x(2); ... mi*( 1-x(1)^2 ) * x(2) - x(1) ]; Listing 11.2: Program główny rozwiazuj ˛ acy ˛ równanie van der Pola % ode_vanderpol.m clear all; close all; global mi % zmienna globalna mi = 1; t0 = 0; tfinal = 20; tspan = [ t0 tfinal ]; x0 = [0; 0.25]; trace = 1; % definicja stalej (GLOBALNEJ) w rownaniu van der Pola % czas poczatkowy obserwacji % czas koncowy obserwacji % razem % zakladane wartosci poczatkowe zmiennych stanu [x1,x2] % wymagane sledzenie options = odeset(’RelTol’,1e-4,’AbsTol’,[1e-4 1e-4]); % wybor opcji [t,x] = ode23( ’fun_diff’, tspan, x0, options, trace); % rozwiazanie numeryczne figure subplot(211); plot(t,x(:,1)), xlabel(’t [s]’); title(’x1(t) dla ODE23’), grid, subplot(212); plot(t,x(:,2)), xlabel(’t [s]’); title(’x2(t) dla ODE23’), grid, pause figure; plot(x(:,1),x(:,2)); xlabel(’x1(t)’); ylabel(’x2(t)’); title(’Przestrzen fazowa x2(t)=fun( x1(t) ) dla ODE23’), grid, pause clc Problem 11.3 ((L)* Obserwacja rozwiaza ˛ ń równania van der Pola). Uruchom program 11.2 dla różnych wartości parametru µ (np. 1.5, 3, 5, 7) oraz różnych wartości poczatkowych ˛ x0, np. [0, 0.9]. 226 11 ODE - Rozwiazywanie ˛ równań różniczkowych zwyczajnych Problem 11.4 (* Alternatywy dla funkcji ode23()). Znajdź w Matlabie inne funkcje, których można użyć do rozwiazania ˛ równania van der Pola. Na przykład funkcj˛e ode45(). Zastosuj je i porównaj ich rozwiazania. ˛ Problem 11.5 (**(*) Rozwiazanie ˛ dowolnego równania różniczkowego). Spróbuj znaleźć rozwiazanie ˛ numeryczne wybranego przez siebie równania różniczkowego. Każdy student innego (***). Przykładowe równania możesz znaleźć w zadaniach do rozdziału ODE w ksia˛żce [2]. Jeśli chcesz pójść na skróty (**), to zacznij od tego równania [1]: dx(t) d 2 x(t) + (5x(t)) + (x(t) + 7) sin(ωt) = 0 2 dt dt Ustaw ω = 1 oraz x0=[6, 1.5]. (11.23) 11.4 Algorytmy rozwiazywania ˛ równań różniczkowych [6] 11.4.1 Wprowadzenie - ogólna klasyfikacja stosowanych metod W numerycznej metodzie Eulera pochodna˛ w równaniu (11.12) przybliża si˛e na dwa różne sposoby (tk = k · h, h - krok czasowy): 1. algorytm ekstrapolacyjny (jawny) - prosty, nie gwarantujacy ˛ zbieżności przy zbyt dużych wartościach kroku h: dx xk+1 − xk = = f(xk ) dt h → xk+1 = xk + h · f(xk ) (11.24) 2. algorytm interpolacyjny (niejawny) – złożony (układ predyktor-korektor), zawsze stabilny, wartość h decyduje tylko o dokładności rozwiazania: ˛ dx xk − xk−1 = = f(xk ) dt h → xk = xk−1 + h · f(xk ) (11.25) Na rysunku 11.2 pokazano interpretacj˛e graficzna˛ ekstrapolacyjnego oraz interpolacyjnego algorytmu Eulera. 11.4 Algorytmy rozwiazywania ˛ równań różniczkowych [6] 227 Rysunek 11.2: Ilustracja graficzna zasady działania ekstrapolacyjnego (po lewej) oraz interpolacyjnego (po prawej) algorytmu Eulera do całkowania numerycznego. W drugim przypadku, w ogólnym przypadku, jest konieczne obliczenie f (xk+1 ,tk+1 ) metoda˛ interpolacji. W tabeli 11.1 zebrano algorytmy całkowania numerycznego dost˛epne w Matlabie [6], stosowane do numerycznego rozwiazywania ˛ równań różniczkowych. Równanie różniczkowe jest nazywane sztywnym jeśli w jego rozwiazaniu ˛ wyst˛epuja˛ funkcje składowe fi (x) postaci e−(1/Ti )t (opadajace ˛ eksponenty), które znacznie różnia˛ si˛e stałymi czasowymi gaśni˛ecia Ti (o kilka rz˛edów wielkości, dokładnie powyżej kilku tysi˛ecy). Niech J oznacza kwadratowa˛ (n × n) macierz Jacobiego J = ∂∂ xfij , i, j = 1, 2, ..., n, zwiazan ˛ a˛ z równaniem (11.12) dx/dt = f(t, x). Sztywność równania różniczkowego (S) jest określona przez stosunek najwi˛ekszej (λmax ) do najmiejszej (λmin ) wartości własnej tej macierzy: S= λmax λmin (11.26) Tabela 11.1: Funkcje Matlaba implementujace ˛ różne algorytmy całkowania numerycznego [6] Nazwa funkcji Zaimpementowany algorytm Typ równania różniczk. ode15s ode23 ode45 ode23s ode23t ode23tb ode113 Klopfensteina Rungego-Kutty 2/3 (modyfikacja Bogacki-Shampine) Rungego-Kutty 4/5 (modyfikacja Dormand-Prince) Rosenbrocka (zmodyfikowany) trapezów trapezów + Geara (zmodyfikowany) Bashfortha-Adamsa-Moultona rz˛edu od 1 do 12 sztywne niesztywne niesztywne sztywne średnio sztywne sztywne niesztywne W listingu 11.3 przedstawiono kontynuacj˛e programu 11.2, w której jest wywoływana funkcja Matlaba, implementujaca ˛ równanie (11.24), jak i sama funkcja. Listing 11.3: Funkcja ODE implementujaca ˛ ekstrapolacyjna˛ metod˛e Eulera oraz jej wywołanie % kontynuacja programu ode_vanderpol.m % ..... % A teraz "nasze" implementacje % Euler [t,x] = odeEuler(’fun_diff’, tspan, x0, 10*length(T) ); % 10* wiecej punktow niz w ode45 figure; plot( T, X(:,1),’ro-’, t, x(:,1),’bx-’), title(’ode45 (o) i NASZ Euler (x)’); 228 11 ODE - Rozwiazywanie ˛ równań różniczkowych zwyczajnych legend(’ode45’,’NASZ Euler(t)’); grid; xlabel(’t [s]’); pause %############################################### function [t,x] = odeEuler( fun, tminmax, x0, M ) % fun = ’nazwa’ fukcji jako lancuch znakow, np. ’fun_diff’ dt = (tminmax(2)-tminmax(1))/M; % krok w czasie t = tminmax(1) + dt*(0:M); % punkty czasowe do calkowania x = zeros(length(x0),M+1); % inicjalizacja x(1:length(x0),1) = x0; % pierwsze podstawienie, war. poczatkowe for k = 1 : M % PETLA - calkowanie metoda prostokatow x(:,k+1) = x(:,k) + dt*feval( fun, t(k), x(:,k) ); % nowa wartosc calki end % t=t’; x=x.’; Problem 11.6 (*(**) Rozwiazanie ˛ równania różniczkowego pierwszego rz˛edu metoda˛ Eulera). Zastosuj metod˛e Eulera do rozwiazania ˛ jednego z poniższych równań: dx(t) = αe−λt x(t), dt dx(t) = 4e0.8t − 0.5x(t), dt λ −αt x(t) = x(0) exp (1 − e ) , (11.27) α 4 0.8t e − e−0.5t + 2e−0.5t dla x(0) = 2. x(t) = 1.3 (11.28) Sprawdź czy krzywa otrzymana numerycznie zgadza si˛e z rozwiazaniem ˛ analitycznym (drugi wzór w wierszu). Spróbuj sam wyprowadzić rozwiazanie ˛ analityczne, czyli oblicz całk˛e oznaczona˛ funkcji wyst˛epujacej ˛ po prawej stronie równania (**). Problem 11.7 (** Rozwiazanie ˛ innego równania różniczkowego metoda˛ Eulera). Zastosuj metod˛e Eulera do rozwiazania ˛ numerycznego równania różniczkowego wybranego przez siebie. Przykładowe równania możesz znaleźć w zadaniach do rozdziału ODE w ksia˛żce [2]. Alternatywnie skorzystaj z poniższego równania, wzi˛etego z [1] (ustaw ω = 1 oraz x0=[6, 1.5]): d 2 x(t) dx(t) + (5x(t)) + (x(t) + 7) sin(ωt) = 0. 2 dt dt (11.29) 11.4.2 Algorytmy Rungego-Kutty Algorytmy Rungego-Kutty (RK) wykorzystuja˛ do całkowania numerycznego dodatkowa˛ informacj˛e, zebrana˛ w pośrednich punktach próbych, leżacych ˛ pomi˛edzy zadanymi chwilami próbkowania tk funkcji. Rozwiazaniem ˛ (przyrostem wartości całki) jest wartość średnia ze wszystkich punktów próbnych. Wzory zostały wyprowadzone z użyciem przybliżenia funkcji w otoczeniu wybranego punktu za pomoca˛ rozwiniecia Taylora odpowiednio wysokiego rz˛edu [3]. Przykładowo, dla metody RK-4 czwartego rz˛edu mamy (jej kod Matlaba jest w przedstawiony w listingu 11.4): 11.4 Algorytmy rozwiazywania ˛ równań różniczkowych [6] 1 xk+1 = xk + (d1 + 2d2 + 2d3 + d4 ) 6 229 (11.30) gdzie: d1 = ∆t · f (xk ,tk ) ∆t d1 d2 = ∆t · f xk + ,tk + 2 2 d2 ∆t d3 = ∆t · f xk + ,tk + 2 2 d4 = ∆t · f (xk + d3 ,tk + ∆t) f (x,t) jest całkowana˛ funkcja˛ (u nas to funkcja pochodnej zmiennej stanu). Metody tej grupy sa˛ wykorzystywane najcz˛eściej. Sa˛ one samostartujace, ˛ ponieważ nie wykorzystuja˛ historii trajektorii zmiennych stanu. Na rysunku 11.3, po lewej stronie, zilustrowano graficznie zasad˛e pracy metody RK-4: użycie poprzedniej wartości zmiennej stanu i czterech wartości jej pochodnych w różnych punktach. Rysunek 11.3: Ilustracja graficzna zasady działania metody Rungego-Kutty 4 (po lewej) oraz innych metod (po prawej), opisanych w punkcie 11.4.3. Metoda RK-4 używa poprzedniej wartości zmiennej stanu i czterech wartości jej pochodnej. Listing 11.4: Funkcja ODE implementujaca ˛ metod˛e Rungego-Kutty 4 function [t,x] = odeRK4( fun, tminmax, x0, M ) dt = (tminmax(2)-tminmax(1))/M; % krok w czasie t = tminmax(1) + dt*(0:M); % punkty czasowe do calkowania x = zeros(length(x0),M+1); % inicjalizacja x(1:length(x0),1) = x0; % pierwsze podstawienie, war. poczatkowe for k = 1 : M % PETLA - obliczanie calki d1 = dt * feval( fun, t(k), x(:,k) ); % d2 = dt * feval( fun, t(k)+dt/2, x(:,k)+d1/2 ); % d3 = dt * feval( fun, t(k)+dt/2, x(:,k)+d2/2 ); % d4 = dt * feval( fun, t(k)+dt, x(:,k)+d3 ); % x(:,k+1) = x(:,k) + (d1 + 2*d2 + 2*d3 + d4) / 6; % nowa wartosc calki end t=t’; x=x.’; Problem 11.8 ((L)** Rozwiazanie ˛ innego równania różniczkowego metoda˛ Rungego Kutty 4). Zastosuj metod˛e Rungergo-Kutty 4 do rozwiazania ˛ numerycznego równania różniczkowego wybranego przez siebie. Patrz problemy 11.6 i 11.7. 230 11 ODE - Rozwiazywanie ˛ równań różniczkowych zwyczajnych 11.4.3 Inne algorytmy Wykorzystywana idea. Różne algorytmy w różny sposób wykorzystuja˛ informacj˛e o wartościach zmiennych stanu i ich pochodnych w poprzednio wyznaczonych punktach (patrz rysunek 11.3, po prawej stronie): Ni xk+1 = ∑ ai x(k+1)−i + ∆t i=1 Nj ∑ bj f xk+1− j ,tk+1− j (11.31) j=0 Dobór współczynników wynika z wielomianowej aproksymacji trajektorii stanu. Każda metoda daje dokładne wyniki, kiedy przyj˛ety wielomian jest zgodny z trajektoria.˛ Algorytmy opisane równaniem (11.31) nie sa˛ samostartujace ˛ ponieważ potrzebuja˛ poprzednich punktów trajektorii, a na poczatku ˛ nie sa˛ one znane. Z tego powodu pierwsze wartości stanu sa˛ wyznaczane metoda˛ samostartujac ˛ a,˛ np. Eulera albo RungegoKutty. Metody Adamsa-Bashfortha maja˛ charakter ekstrapolacyjny (nie maja˛ charakteru uwikłanego), ponieważ b0 = 0. Przykładowo metoda AB trzeciego rz˛edu jest opisana wzorem (przypomnimy: f () to funkcja pochodnej zmiennej stanu): ∆t (23 fk − 16 fk−1 + 5 fk−2 ). (11.32) 12 W listingu 11.5 jest przedstawiony kod funkcji tej metody. Punkty startowe obliczono za pomoca˛ algorytmu RK4. xk+1 = xk + Metody Adamsa-Moulona sa˛ interpolacyjne, ponieważ wykorzystuja˛ informacj˛e o pochodnej fk+1 w szacowanym punkcie stanu xk+1 — z tego powodu musza˛ ja˛ obliczyć rozwiazuj ˛ ac ˛ równania uwikłane. Przykładowo dla metody rz˛edu trzeciego mamy: ∆t (5 fk+1 + 8 fk − fk−1 ). (11.33) 12 Metoda Geara (BDF - Backward Differentiation Formula), szybka i stabilna, jest polecana do rozwiazywania ˛ układów równań różniczkowych sztywnych (źle uwarunkowanych). Jej algorytm korzysta z poprzednich wartości zmiennych stanu, ale jest uwikłany, ponieważ używa także wartości pochodnej stanu w szacowanym punkcie fk+1 : xk+1 = xk + xk+1 = xk + 1 (48xk − 36xk−1 + 16xk−2 − 3xk−2 + ∆t · fk+1 ). 25 (11.34) Listing 11.5: Funkcja ODE implementujaca ˛ metod˛e Adamsa-Bashfortha z punktami startowymi wyznaczonymi metoda˛ RK4 function [t,x] = odeAB( fun, tminmax, x0, M ) dt = (tminmax(2)-tminmax(1))/M; % krok w czasie t = tminmax(1) + dt*(0:M); % punkty czasowe do calkowania x = zeros(length(x0),M+1); % inicjalizacja x(1:length(x0),1) = x0; % pierwsze podstawienie, war. poczatkowe for k = 1 : 2 % INICJALIZACJA - RK4 d1 = dt * feval( fun, t(k), x(:,k) ); % d2 = dt * feval( fun, t(k)+dt/2, x(:,k)+d1/2 ); % d3 = dt * feval( fun, t(k)+dt/2, x(:,k)+d2/2 ); % d4 = dt * feval( fun, t(k)+dt, x(:,k)+d3 ); % x(:,k+1) = x(:,k) + (d1 + 2*d2 + 2*d3 + d4) / 6; % nowa wartosc calki end for k = 3 : M % PETLA - obliczanie calki fk = feval( fun, t(k ), x(:,k ) ); % fkm1 = feval( fun, t(k-1), x(:,k-1) ); % 11.5 Układ RLC 231 fkm2 = feval( fun, t(k-2), x(:,k-2) ); % x(:,k+1) = x(:,k) + dt/12*( 23*fk - 16*fkm1 + 5*fkm2); % nowa wartosc calki end t=t’; x=x.’; Problem 11.9 (** Rozwiazanie ˛ innego równania różniczkowego metoda˛ AdamsaBashfortha). Zastosuj metod˛e Adamsa-Bashfortha do rozwiazania ˛ numerycznego równania różniczkowego wybranego przez siebie. Patrz problemy 11.6 i 11.7. 11.5 Układ RLC 11.5.1 Analiza matematyczna układu RLC Obecnie dokonamy analizy szeregowego obwodu RLC - czy szeregowego połacze˛ nia rezystacji (rezystora) R, indukcyjności (cewki) L oraz pojemności (kondensatora) C – zaprezentowanego na rysunku 11.4. Przyłożone źródło napi˛ecia u(t) powoduje przepływ pradu ˛ i(t) w obwodzie, który generuje napi˛ecia uR (t), uL (t) i uC (t) na elementach R, L,C, proporcjonalne do: • pradu dla oporności R, • pochodnej pradu ˛ dla indukcyjności L, • całki ograniczonej z pradu ˛ w przedziale czasu od 0 do t dla pojemności C. Rysunek 11.4: Połaczenie ˛ elementów R, L,C, czyli rezystacji, indukcyjności i pojemności, w szeregowym układzie RLC Z oczkowego prawa Kirchhoffa wynika, że napi˛ecie źrodła napi˛eciowego (baterii, akumulatora), równe sumie napi˛eć na elementach RLC, jest napi˛eciem wejściowym obwodu uin (t), natomiast napi˛ecie uC (t) na pojemności jest napi˛eciem wyjściowym uout (t): di(t) 1 uin (t) = uR (t) + uL (t) + uC (t) = R · i(t) + L + dt C Zt i(t)dt (11.35) 0 uout (t) = uC (t) = 1 C Zt i(t)dt (11.36) 0 Po obliczeniu transformacji Laplace’a obu stron równania (11.35)(11.36) oraz po uwzgl˛ednieniu wyniku tej transformacji dla pochodnej i całki funkcji, otrzymujemy: 232 11 ODE - Rozwiazywanie ˛ równań różniczkowych zwyczajnych 1 1 Uin (s) = R · I(s) + sL · I(s) + · I(s) = R + sL + · I(s), Cs Cs 1 Uout (s) = UC (s) = · I(s). Cs (11.37) (11.38) Transmitancja H(s) analizowanego układu RLC jest wynikiem dzielenia równania (11.38) przez (11.37): H(s) = 1 Uout (s) 1 Cs . = = 1 Uin (s) 1 + RC · s + LC · s2 R + Ls + Cs (11.39) Po podstawieniu s = jω = j2π f , gdzie f oznacza cz˛estotliwość w hercach, transmitancja H(s) zamienia si˛e w odpowiedź cz˛estotliwościowa˛ H(ω) obwodu RLC: H(ω) = 1 Uout (ω) = = Uin (ω) 1 + RC · ( jω ) + LC · ( jω )2 1 LC 1 LC + RL ( jω ) + ( jω )2 (11.40) Równanie (11.40) mówi nam co obwód zrobi z sinusoidalnym sygnałem wejściowym o cz˛estotliwości katowej ˛ ω: jak zmieni jego amplitud˛e oraz o ile opóźni (przesunie kat ˛ poczatkowy ˛ sinusoidy wyjściowej w stosunku do wejściowej). Możemy uzmiennić wartość ω w (11.40), obliczyć H(ω) dla interesujacego ˛ nas przedziału cz˛estotliwości oraz sporzadzić ˛ rysunek. Po wprowadzeniu nast˛epujacych ˛ nowych zmiennych: √ ω0 = 1/ LC, ξ = (R/L)/(2ω0 ), ω0 A= p , 1−ξ2 d = ξ ω0 , ω1 = ω0 p 1−ξ2 (11.41) gdzie: • ω0 - cz˛estotliwość katowa ˛ oscylacji nietłumionych obwodu, • ξ - tłumienie obwodu, • A, d, ω1 - amplituda, tłumienie oraz cz˛estotliwość katowa ˛ odpowiedzi impulsowej obwodu o tłumieniu ξ , możemy zapisać równanie. (11.41) w zmienionej postaci: H(ω) = ω02 2 ω0 + 2ξ ω0 ( jω) + ( jω)2 = Aω1 (d + jω)2 + ω12 . (11.42) Układ RLC o ch-ce cz˛estotliwościowej (11.42) ma nast˛epujac ˛ a˛ odpowiedź na wejściowy impuls Diraca: −d·t Ae sin ω1t for t ≧ 0, h(t) = . (11.43) 0 for t < 0, Na rysunku 11.5 jest przedstawiona charakterystyka cz˛estotliwościowa (11.42) oraz czasowa odpowiedź impulsowa (11.43) układu RLC z rysunku 11.4, majacego ˛ nietłumiona˛ cz˛estotliwość katow ˛ a˛ drgań rezonansowych równa˛ ω0 = 1 oraz tłumienie równe ξ = 0.1, 0.3, 0.5. 11.5 Układ RLC 233 Rysunek 11.5: Charakterystka cz˛estotliwościowa H(ω) (11.42) oraz odpowiedź impulsowa h(t) (11.43) układu RLC z rysunku 11.4, majacego ˛ transmitancj˛e (funkcj˛e przejścia) (11.39) oraz nast˛epujace ˛ wartości parametrów: 1) cz˛estotliwość drgań rezonansowych nietłumionych ω0 = 1, 2) tłumienie ξ = 0.1, 0.3, 0.5. Od góry do dołu, od lewej do prawej: 1) moduł charakterystyki cz˛estotliwościowej (wzmocnienie/tłumienie w funkcji cz˛estotliwości), 2) kat ˛ charakterystyki cz˛estotliwościowej (przesuni˛ecie katowe ˛ sygnału wyjściowego w stosunku do wejściowego w funkcji cz˛estotliwości), 3) odpowiedź na pobudzenie impulsem Diraca, 4) odpowiedź na pobudzenie skokiem jednostkowym 0 → 1 Jak filtr RLC “potraktuje” wejściowy sygnał sinusoidalny o dowolnej cz˛estotliwości, np. f0 = 10? Wejście: x(t) = sin(2π · f0 · t) = sin(2π · 10 · t) Wyjście: y(t) = |H( f0 )| · sin (2π · f0 · t + ∠(H( f0 ))) = A · sin (2π · 10 · t + ϕ) Sygnał sinusoidalny, wychodzacy ˛ z układu, b˛edzie miał amplitud˛e równa˛ A = |H( f0 )| oraz przesuni˛ecie katowe ˛ ϕ = ∠(H( f0 )). Wartość |H( f0 )| należy odczytać z charakterystyki amplitudowej układu , natomiast ∠(H( f0 )) - z charakterystyki katowej. ˛ 11.5.2 Typowa symulacja układu RLC w Matlabie Znajac ˛ wartości współczynników b oraz a wielomianów zmiennej s transmitancji (11.39) układu RLC, odpowiednio licznika i mianownika, możemy w prosty sposób wyznaczyć dla niego w Matlabie odpowiedź impulsowa˛ (h=impulse(b,a)), skokowa˛ (u=step(b,a)) oraz odpowiedź na dowolne pobudzenie p (lsim(b,a,p,t);) z użyciem funkcji z biblioteki Matlab Control Toolbox. Przykład takiej analizy jest 234 11 ODE - Rozwiazywanie ˛ równań różniczkowych zwyczajnych przedstawiony w programie 11.6. We wszystkich wyżej wymienionych funkcjach jest rozwiazywane ˛ równanie różniczkowo-całkowe opisujace ˛ układ RLC. Listing 11.6: Klasyczna analiza układu RLC z wykorzystaniem funkcji Matlaba dedykowanych dla układów LTI ode_rlc.m clear all; close all; global R L C E f0 R L C E = 2; = 5*10^(-6); = 1*10^(-6); = 1; f0 = 1e+6; % rezystor [ Ohm ] % cewka indukcyjna [ H ] % kondensator [F] % parametry pobudzenia: napiecie [V], cz estotliwosc [Hz] if(0) % ZAPIS #1 b = [1/C]; % od najwyzszego rzedu: b0 a = [L R 1/C]; % od najwyzszego rzedu: a2*s^2+a1*s+a0 else % ZAPIS #2 b = [1]; % od najwyzszego rzedu: b0 a = [L*C R*C 1]; % od najwyzszego rzedu: a2*s^2+a1*s+a0 end ksi = (R/(2*L))*sqrt(L*C), f0 = (1/sqrt(L*C))/(2*pi), w0 = 2*pi*f0; f1 = (f0*sqrt(1-ksi^2)), w1 = 2*pi*f1; % stala tlumienia % czestotliwosc/pulsacja drgan nietlumionych % czestotliwosc/pulsacja drgan tlumionych % Ch-ka czestotliwosciowa - wartosc ilorazu dwoch wielomianow transmitancji f = 0 : 1e+3 : 1e+6; % interesujacy nas zakres czestotliwosci s = j*2*pi*f; % zmienna "s" transformacji Laplace’a H = polyval(b,s)./polyval(a,s); % alternatywa: H = freqs(b,a,2*pi*f); figure(1); semilogx(f,20*log10(abs(H))); xlabel(’f [Hz]’); title(’|H(f)| [dB]’); grid on; pause figure(2); semilogx(f,unwrap(angle(H))); xlabel(’f [Hz]’); title(’faza(H(f)) [rad]’); grid on; pause % Sumulacja: funkcje impulse(), step(), lsim() dt = 10^(-5)/1000; t = 0 : dt : 2.5*10^(-5); u = E*ones(1,length(t)); % u = E*sin(2^pi*f0*t); figure(3); impulse( b, a ); grid; pause figure(4); step( b, a ); grid; pause figure(5); lsim( b, a, u, t); grid; pause % krok w czasie, czas % # dowolne pobudzenie %# % odpowiedz impulsowa % odpowiedz skokowa % odpowiedz na dowolne pobudzenie Problem 11.10 ((L)*(*) Układ RLC). W programie 11.6 sa˛ obliczone i pokazane standardowe charakterystki czasowe i cz˛estotliwościowe układu RLC. Wartości układu przyj˛eto arbitralnie. Zapoznaj si˛e z programem, uruchom go, obejrzyj rysunki. Oblicz cz˛estotliwości katowe/radialne ˛ ω0 i ω1 (drgań nietłumionych i tłumionych), wartość tłumienia obwodu ξ oraz wartość tłumienia d jego odpowiedzi impulsowej. Tak zmień wartości RLC żeby otrzymać mniejsze i wi˛eksze tłumienie obwodu ξ . Narysuj rysunki podone do 11.5 (*). Na koniec tak ustaw wartości {R, L,C}, aby otrzymać filtr dolnoprzepustowy o 3-decybelowej cz˛estotliwości odci˛ecia równej ω3dB = 1 rad/s (**). 11.5 Układ RLC 235 Problem 11.11 (** Układ RC). Zmodyfikuj równania i kod programu 11.6 tak, aby obliczał i pokazywwał on standardowe charakterystki czasowe i cz˛estotliwościowe obwodu RC, a nie obwodu RLC (usuń indukcyjność). Czy dalej b˛edzie to układ rezonansowy z oscylacyjna˛ odpowiedzia˛ impulsowa? ˛ 11.5.3 Nasza symulacja układu RLC - rozwiazanie ˛ układu równań różniczkowych Równania (11.35)(11.36) możemy zapisać w nast˛epujacej ˛ postaci: 1 duC (t) = i(t), dt C di(t) L = e(t) − Ri(t) − uC (t), dt (11.44) (11.45) gdzie e(t) oznacza teraz uin (t). Podzielmy drugie równanie przez L: duC (t) 1 = i(t), dt C di(t) 1 = [e(t) − Ri(t) − uC (t)] . dt L (11.46) (11.47) Po wprowadzeniu oznaczeń: x1 (t) = uC (t), (11.48) x2 (t) = i(t), (11.49) (11.50) możemy powyższy układ równań zapisać jako (ẋ - oznacza pochodna˛ x po czasie): " duC (t) dt di(t) dt # = 1 L 1 C i(t) [e(t) − Ri(t) − uC (t)] , 1 ẋ1 C x2 = 1 ẋ2 L [e(t) − Rx2 − x1 ] (11.51) W Matlabie otrzymujemy nast˛epujacy ˛ program symulacyjny, b˛edacy ˛ kontunuacja˛ programu 11.6. Podobnie jak w programie 11.2 wykorzystano w nim do całkowania numerycznego wbudowana˛ funkcj˛e Matlaba ode45(), ale nic nie stoi na przeszkodzie, aby użyć "naszych"funkcji odeEuler(), odeRK4(), odeAB(). Zaprogramowano dwie funkcje pobudzajace ˛ e(t) = u(t) układ RLC, jest to skok jednostkowy o amplitudzie E albo sinusoida E sin(2π f0t). Listing 11.7: Analiza układu RLC z wykorzystaniem funkcji Matlaba do rozwiazywa˛ nia równań różniczkowych % kontynuacja programu ode_rlc.m ... % ODE Runge-Kutta 45 - funkcja Matlaba tspan = [ t(1) t(end) ]; % czas symulacji: od-do x0 = [ 0; 0 ]; % warunki poczatkowe: [uC(t(1)), i(t(1))] 236 11 ODE - Rozwiazywanie ˛ równań różniczkowych zwyczajnych fun = @(t,x) ( [ 1/C*x(2); ... % pobudzenie: 1/L * (E - R*x(2) - x(1)) ] ); % skok jednostkowy % 1/L * (E*sin(2*pi*f0*t) - R*x(2) - x(1)) ] ); % sinus [T,X] = ode45( fun, tspan, x0 ); % [T,X] = ode45( ’fun_rlc’, tspan, x0 ); figure; plot( T, X(:,1),’r.-’, T, X(:,2),’b.-’), title(’ODE45: uC(t) i i(t)’); legend(’uC(t)’,’i(t)’); grid; xlabel(’t [s]’), pause %############################# function yprime = fun_rlc(t,x) global R L C E f0 yprime = [ 1/C*x(2); ... 1/L * (E - R*x(2) - x(1)) ]; % 1/L * (sin(2*pi*f0*t) - R*x(2) - x(1)) ]; Równanie (11.51) możemy także zapisać jako: 0 ẋ1 0 C1 x1 = + 1 e(t), ẋ2 − L1 − RL x2 L ẋ1 x = A 1 + Bu(t), ẋ2 x2 (11.52) i zmodyfikować uprzednio napisana˛ funkcj˛e odeRK4() do postaci, wykorzystujacej ˛ macierze A, B. Przedstawiono to w poniższym programie - kontynuacji 11.6, zwierajacym ˛ także sama˛ funkcj˛e. Listing 11.8: Analiza układu RLC z wykorzystaniem własnej funkcji implementujacej ˛ metod˛e RK4 % kontynuacja programu ode_rlc.m ... % NASZA FUNKCJA ODE Runge-Kutta 4 z macierzami A, B dla rownania liniowego A = [ 0, 1/C ; % A i B to macierze zmiennych stanu -1/L, -R/L ]; % B=[ 0 ; % 1/L ]; % x0 = [ 0; 0]; % warunki poczatkowe: [uC(1), i(1)] u = E*ones(1, length(t)); % pobudzenie #1: skok jednostkowy % u = E*sin(2*pi*f0*t); % pobudzenie #2: sinusoidalne dt = 10^(-5)/1000; t = 0 : dt : 2.5*10^(-5); % krok w czasie, czas [t,x] = odeRK4AB( A, B, u, t, x0); figure; plot( t, x(:,1),’r.-’, t, x(:,2),’b.-’), title(’odeRK4A: uC(t) i i(t)’); legend(’uC(t)’,’i(t)’); grid; xlabel(’t [s]’), pause %########################################### function [t,x] = odeRK4AB( A, B, u, tv, x0 ) % NASZA FUNKCJA dt = tv(2)-tv(1); % punkty rownoodlegle K = length(x0); M = length( tv ); % liczba zmiennych, liczba punktow xv = zeros( K, M ); % inicjalizacja x = x0; xv( 1:K, 1 ) = x0; % pierwsze podstawienie, war. poczatkowe for k = 1 : M-1 % # PETLA D1 = dt*( A*x + B*u(k) ); %# D2 = dt*( A*(x+D1/2) + B*u(k) ); %# D3 = dt*( A*(x+D2/2) + B*u(k) ); %# D4 = dt*( A*(x+D3) + B*u(k) ); %# x = x + ( D1 + 2*D2 + 2*D3 + D4 )/6; % # nowa wartosc calki oznaczonej xv(1:K,k+1) = x; % # zapamietaj end t=tv’; x=xv.’; Literatura 237 Problem 11.12 (** Układ RC). Tak zmodyfikuj równania i kod programów 11.7 oraz 11.8, aby obliczały i pokazywały one rozwiazanie ˛ równania różniczkowego, opisuja˛ cego obwód RC, a nie obwód RLC (usuń indukcyjność). Napisz funkcj˛e fun_rc.m. 11.6 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. • Równania różniczkowe zwyczajne (RRZ) opisuja˛ dynamik˛e obiektów i systemów (zmienność w czasie). • W ogólnej postaci sa˛ to nieliniowe równania macierzowe, podajace ˛ zależność pochodnej stanu obiektu/systemu po czasie od bieżacego ˛ stanu i czasu (a pośrednio od wielkości wejściowych). • W szczególnym przypadku zależności liniowych, równania te sa˛ liniowe i nosza˛ nazw˛e równań stanu. Zawieraja˛ one cztery macierze A, B, C, D oraz zależa˛ od stanu poczatkowego ˛ x(0). • Rozwiazywanie ˛ problemów RRZ polega na całkowaniu wyrażenia na pochodna˛ po czasie. • Informacja do wykorzystania to wartość stanu i pochodnej: — pochodna w bieżacym/nast˛ ˛ epnym punkcie – metoda Eulera, Rungego-Kutty; — pochodna w poprzednich punktach – metoda Adamsa-Bashfortha, AdamsaMoultona; — stan w poprzednich punktach – metoda Geara. • Jeśli metoda korzysta z informacji w nast˛epnym punkcie w sposób uwikłany, to wymaga rozwikłania metodami analitycznymi lub iteracyjnymi. • Narz˛edziem dedykowanym do symulacji dynamiki obiektów/systemów jest Simulink. Literatura 1. S.C. Chapra, R.P. Canale, Numerical Methods for Engineers. Boston, McGraw-Hill, 2010. 2. MathWorks: “Differential equations,” on-line: https:// www.mathworks.com/ help/ matlab/ math/ differential-equations.html 3. MathWorks: “Ordinary Differential equations,” on-line: https:// www.mathworks.com/ help/ matlab/ ordinary-differential-equations.html 4. C. Moler: “Ordinary Differential Equations”, in Numerical Computing with Matlab, on-line: https:// www.mathworks.com/ moler/ chapters.html.html 5. J.H. Mathews, K.D. Fink, Numerical Methods Using Matlab. Upper Saddle River, Prentice-Hall, 2005. 6. S. Osowski, A. Cichocki, K. Siwek, Matlab w zastosowaniu do obliczeń obwodowych i przetwarzania sygnałów. Warszawa, Oficyna Wydawnicza Politechniki Warszawskiej, 2006. Rozdział 12 PDE - Rozwiazywanie ˛ równań różniczkowych czastkowych ˛ Streszczenie Przykład analitycznego i numerycznego rozwiazania ˛ prostego równania różniczkowego, rodzaje równań różniczkowych czastkowych: ˛ eliptyczne, paraboliczne, hiperboliczne, metoda różnic skończonych oraz przykłady jej zastosowania: ustalony rozkład 1D i 2D ciepła (równanie Laplace’a), przepływ 1D ciepła (równanie dyfuzji), propagacja 1D fali elektromagnetycznej (równanie Maxwella), funkcja Matlaba pdepe(). 12.1 Wprowadzenie Równania różniczkowe czastkowe ˛ zawieraja˛ pochodne czastkowe ˛ pierwszego, drugiego i ogólnie wyższych rz˛edów funkcji wieloargumentowych, np. f (x, y, z,t), wzgl˛edem jej argumentów, np. x, y, z,t (np. współrz˛ednych położenia w przestrzeni x,y,z oraz czasu t). Najcz˛eściej równania te wynikaja˛ z praw fizyki, opisujacych ˛ konkretne zjawisko, i ich rozwiazaniem ˛ jest czasowo-przestrzenna odpowiedź obiektu/systemu dynamicznego. Przykładem moga˛ być różniczkowe równania opisujace: ˛ 1. zjawisko dyfuzji, np. rozchodzenia si˛e zwiazków ˛ chemicznych, ciepła; 2. statyczny i dynamiczny rozkład wartości pola: temperatury, napr˛eżenia mechanicznego albo potencjału elektrycznego/magnetycznego; 3. rozchodzenia si˛e fal mechanicznych lub elektromagnetycznych w przestrzeni (równania Maxwella w tym drugim przypadku). W równaniu algebraicznym szukaliśmy wartości jednej zmiennej x lub kilku zmiennych x, y, z, które spełniaja˛ jakaś ˛ konkretna˛ zależność, np.: 5x2 + 4x + 3 = 0, 2x + 3y + 4z = 0. (12.1) W równaniach różniczkowych zwyczajnych szukaliśmy funkcji f (x) spełniajacej ˛ jakieś równanie dla wszystkich wartości x z jakiegoś przedziału, np.: d 2 f (x) d f (x) +b + c f (x) = e(x), (12.2) dx2 dx dla wszystkich wartości x z przedziału x1 ≦ x ≦ x2 oraz zadanej funkcji wymuszajacej ˛ e(x). W równaniach różniczkowych czastkowych ˛ szukamy funkcji 2D, 3D, ogólniej ND, f (x, y, z,t, ...), która spełnia zadane równanie wraz ze swoimi pochodnymi czast˛ kowymi, np. dla funkcji 2D: a a ∂ f (x, y) ∂ 2 f (x, y) ∂ 2 f (x, y) + b + a = e(x, y), ∂ x2 ∂ x∂ y ∂ y2 (12.3) dla wszystkich wartości (x, y) z zadanego przedziału. Podsumowujac, ˛ rozwiazuj ˛ ac ˛ równania różniczkowe czastkowe ˛ szukamy (przypadki: 1D, 2D, ...): • pola skalarnego jednej wartości f (x, y, z,t, ...) dla wybranego zakresu wartości argumentów, np. przestrzenno-czasowego rozkładu temperatury, • pola wektorowego kilku wartości f(x, y, z,t, ...), np. przestrzenno-czasowego rozkładu pr˛edkości i kierunku wiatru. 239 240 12 PDE - Rozwiazywanie ˛ równań różniczkowych czastkowych ˛ Ufff... nie b˛edzie łatwo. 12.2 Analityczne i numeryczne rozwiazanie ˛ równania różniczkowego [1] Równania różniczkowe rozwiazuje ˛ si˛e w sposób analityczny i numeryczny. W tym podrozdziale w celach pogladowych ˛ rozwia˛żemy tymi dwoma sposobami równanie różniczkowe 1D eliptyczne (poniżej czerwonym kolorem sa˛ podane przyj˛ete warunki poczatkowe/brzegowe), ˛ czyli równanie czastkowe ˛ uproszczone do jednego wymiaru: d 2 f (x) = 1, dx2 d f (x) dx f (x = 0) = 1, 0 ≦ x ≦ 4, Rozwiazanie ˛ analityczne. Stosujemy podstawienie p(x) = nanie (12.4) w postaci: =2 . (12.4) x=4 d f (x) dx , zapisujemy rów- d p(x) = 1, → d p(x) = 1 · dx | · (), (12.5) dx a nast˛epnie całkujemy obustronnie równanie otrzymane powyżej (co zaznaczono po R prawej stronie: ()). W wyniku tego, korzystajac ˛ z drugiego warunku w równaniu (12.4) (mówiacym, ˛ że pochodna funkcji f (x) w punkcie x = 4 jest równa 2, czyli p(4) = 2) otrzymujemy: Z p(x) = x + c1 → 2 = 4 + c1 → c1 = −2. (12.6) f (x) Teraz uwzgl˛edniamy, że p(x) = d dx oraz w podobny rozwiazujemy ˛ równanie x − 2. Stosujemy podstawienie v = x − 2, dv = dx. Otrzymujemy: d f (x) = x−2 dx d f (v) =v dv 1 f (v) = v2 + c2 2 → d f (x) dx = Z → d f (v) = v · dv | · () (12.7) → 1 f (x) = (x − 2)2 + c3 . 2 (12.8) Z warunku f (0) = 1, obliczamy teraz wartość stałej c3 : 1 1 = (0 − 2)2 + c3 → c3 = −1. 2 Końcowe rozwiazanie ˛ równania różniczkowego ma postać: 1 f (x) = (x − 2)2 − 1. 2 Jest ono przedstawione wraz z pierwsza˛ i druga˛ pochodna˛ na rysunku 12.1. (12.9) (12.10) 12.2 Analityczne i numeryczne rozwiazanie ˛ równania różniczkowego [1] 241 Funkcja f(x) i jej pochodne 3 funkcja f(x) 1-sza pochodna 2-druga pochodna Obliczone Warunek f(0) Warunek fdd(4) 2.5 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 0 0.5 1 1.5 2 2.5 3 3.5 4 x Rysunek 12.1: Funkcja f (x), b˛edaca ˛ rozwiazaniem ˛ analitycznym równania różniczkowego (12.4) oraz jej pierwsza i druga pochodna, oraz punkty, b˛edace ˛ rozwiazaniem ˛ numerycznym tego samego równania. Rozwiazanie ˛ numeryczne. Dyskretyzujemy zmienna˛ x w pi˛eciu równoodległych punktach: xk = k, k = 0, 1, 2, 3, 4 z krokiem ∆ x = h = 1. Druga˛ pochodna˛ przybliżamy w punkcie xk w sposób nast˛epujacy: ˛ d 2 f (xk ) = dxk2 f (xk+1 )− f (xk ) h − h f (xk )− f (xk−1 ) h = f (xk+1 ) − 2 f (xk ) + f (xk−1 ) . h2 (12.11) Uwzgl˛edniamy (12.4) i zapisujemy powyższe równanie dla każdego w˛ezła xk , oprócz w˛ezła x0 = 0, dla którego f (x0 ) = 1: f (x2 ) − 2 f (x1 ) + f (x0 ) h2 f (x3 ) − 2 f (x2 ) + f (x1 ) h2 f (x4 ) − 2 f (x3 ) + f (x2 ) h2 f (x5 ) − 2 f (x4 ) + f (x3 ) h2 = 1, (12.12) = 1, (12.13) = 1, (12.14) = 1. (12.15) Teraz upraszczamy zapis przez podstawienie fk = f (xk ) i przekształcamy układ równań (12.12)-(12.15) do postaci macierzowej: 242 12 PDE - Rozwiazywanie ˛ równań różniczkowych czastkowych ˛ 2 h − f0 f1 −2 1 0 0 1 −2 1 0 f2 h2 0 1 −2 1 f3 = h2 f4 0 0 1 −2 h2 − f5 (12.16) Nast˛epnie skorzystamy ze wzoru na aproksymat˛e pochodnej funkcji w punkcie x4 oraz znajomości jej wartości równej 2, czyli z drugiego warunku brzegowego: f5 − f3 = 2 → f5 = 4h + f3 . (12.17) 2h Otrzymana˛ wartość f5 podstawiamy do ostatniego równania w równaniu macierzowym (12.16) (ostatni wiersz): f 3 − 2 f 4 = h2 − f 5 , f3 − 2 f4 = h2 − 4h − f3 , 2 f3 − 2 f4 = h2 − 4h. Ostatecznie, przyjmujac ˛ h = 1 oraz uwzgledniajac ˛ pierwszy warunek brzegowy f0 = 1, równanie (12.16) przyjmuje nast˛epujaca˛ postać: 2 h − f0 0 f1 −2 1 0 0 1 −2 1 0 f2 h2 1 (12.18) 0 1 −2 1 f3 = h2 = 1 −3 f4 0 0 2 −2 h2 −4h Powyższy układ równań rowiazujemy ˛ ze wzgl˛edu na wartości funkcji [ f1 , f2 , f3 , f4 ]T w punktach x1 = 1, x2 = 2, x3 = 3, x4 = 4, i ostatecznie otrzymujemy: T 1 1 [ f1 , f2 , f3 , f4 ] = − , −1, − , 1 2 2 T (12.19) Otrzymane rozwiazanie ˛ jest także zaznaczone na rysunku 12.1 za pomoca˛ specjalnego symbolu. W listingu 12.1 jest przedstawiony kod programu, rozwiazuj ˛ acego ˛ równanie różniczkowe (12.4) w sposób numeryczny. Listing 12.1: Program rozwiazuj ˛ acy ˛ numerycznie równanie różniczkowe (12.4) % PDE_przyklad.m - pierwszy przyklad clear all; close all; % Rownania drugich pochodnych w punktach A = [ -2, 1, 0, 0; ... % punkt x1 1, -2, 1, 0; ... % punkt x2 0, 1, -2, 1; ... % punkt x3 0, 0, 2, -2 ]; % punkt x4 % Wektor po prawej stronie b = [ 0; ... 1; ... 1; ... -3 ]; % Rozwiazanie numeryczne fnum = A \ b; % Porownanie z rozwiazaniem analitycznym f(x) = 0.5*(x-2)^2 + 1 x = 0 : 0.01 : 4; % zmiennosc argumentu 12.3 Standardowe rodzaje równań różniczkowych czastkowych ˛ [3][7] 243 f = 0.5*(x-2).^2 - 1; % funkcja fd = (x-2); % jej pierwsza pochodna fdd = 1*ones(1,length(x)); % jej druga pochodna x0=0; f0=1; xd0=4; fd0=2; plot(x,f,’k’, x,fd,’b’, x,fdd,’r’, 1:4,fnum,’mo’, x0,f0,’ko’, xd0,fd0,’bo’, ... ’Linewidth’,2,’MarkerSize’,7); grid; xlabel(’x’); title(’Funkcja f(x) i jej pochodne’); legend(’funkcja f(x)’, ’1-sza pochodna’, ’2-druga pochodna’, ... ’Obliczone’,’Warunek f(0)’,’Warunek fdd(4)’,’Location’,’north’); axis([0,4,-2,3]); Problem 12.1 (** Zmiana warunków brzegowych). Postaraj si˛e rozwiazać ˛ analitycznie i numerycznie równanie różniczkowe (12.4) dla innych wartości warunków brzegowych, nie równych 1 i 2. Zmień charakter warunków brzegowych na identyczny po obu stronach, tzn. tylko wartości funkcji albo tylko jej pochodne. 12.3 Standardowe rodzaje równań różniczkowych czastkowych ˛ [3][7] Klasyfikacja równań. W tym laboratorium b˛edziemy zajmować si˛e czastkowymi ˛ równaniami różniczkowymi, które sa˛ zdefiniowane nast˛epujaco ˛ dla funkcji 2D u(x, y) (czas t może być wybrana˛ zmienna,˛ x albu y, x0 ≦ x ≦ x f , y0 ≦ x ≦ y f ): A(x, y) ∂ 2u ∂ 2u ∂ 2u ∂u ∂u + B(x, y) +C(x, y) = F x, y, u, , ∂ x2 ∂ x∂ y ∂ y2 ∂x ∂y (12.20) W zależności od wartości współczynników A, B,C sa˛ rozróżniane cztery przypadki szczególne tego równania, określone w tabeli 12.1. Z kolei w tabeli 12.2 podano dwa rodzaje definicji warunków brzegowych, które sa˛ stosowane na granicy analizowanego obszaru zmienności argumentów: Dirichleta i Neumana. Tabela 12.1: Klasyfikacja równań różniczkowych czastkowych ˛ [3] [7] Nazwa równania, warunek Przykład 2 2 Eliptyczne: B2 − 4AC < 0 Równanie Poissona: ∇2 u = ∂∂ x2u + ∂∂ y2u = f (x, y) Opisuje pole statyczne potencjału ze źródłem f . Dla f = 0 jest to równanie Laplace’a Paraboliczne: B2 − 4AC = 0 Równanie dyfuzji (ciepła, masy): ∂∂tu = D ∂∂ x2u D - wspólczynnik dyfuzji Hiperboliczne: B2 − 4AC > 0 Równanie falowe: ∂∂t 2u = v2 ∂∂ x2u v - pr˛edkość propagacji fali 2 2 2 Równanie dyfuzji jako przykład. W przypadku 1D dyfuzja w środowisku o stałych rozłożonych jest zdefiniowana nast˛epujacym ˛ równaniem (np. przepływ ciepła i zmienny w czasie rozkład temperatury w długim pr˛ecie nagrzewanym z jednej strony): 244 12 PDE - Rozwiazywanie ˛ równań różniczkowych czastkowych ˛ Tabela 12.2: Definiowanie warunków brzegowych dla równań różniczkowych czast˛ kowych [3] [7] Typ warunku Definicja Dirichleta Zadana wartość na brzegu: u=U Neumanna Zadana wartość pochodnej w kierunku prostopadłym (normalnym) do brzegu: ∂u ′ ∂n = U ∂ 2 u(t, x) ∂ u(t, x) − a · (u(t, x) − u0 ) = D· ∂t dx2 (12.21) gdzie: • D - współczynnik dyfuzyjności, • a - współczynnik strat ciepła do otoczenia, • u0 - poziom dyfundujacej ˛ wielkości w otoczeniu. W ogólniejszym przypadku 2D-3D wielkość u(...) może reprezentować czasoprzestrzenny rozkład temperatury w obiekcie 2D-3D ze stratami bocznymi. W naszym, prostszym przypadku obiektem jest bardzo długi pr˛et aluminiowy (obiekt półnieskończony), ze stratami bocznymi, z jednej strony stykajacy ˛ si˛e ze źródłem ciepła, tzn. zanurzony we wrzatku. ˛ Odpowiedź termiczna pr˛eta na skok temperatury o amplitudzie A w punkcie czasoprzestrzeni (x = 0,t = 0), przy warunku poczatkowym ˛ u(x = 0,t = 0) = u0 = 0, jest zdefiniowana równaniem: √ √ √ A −x√ a x x x Da D u(t, x) = e erfc √ − at + e erfc √ + at , (12.22) 2 2 Dt 2 Dt gdzie: 2 erfc(ξ ) = √ π Z ∞ 2 e−t dt. (12.23) ξ Na rysunku 12.2 przedstawiono kształt funkcji u(t, x) (12.22) dyfuzji temperatury na odcinku x = [0, 1] dla kolejnych chwil dla D = 10−4 , a = 10−4 . Rysunek został wygenerowany w programie 12.2. 12.4 Metoda różnic skończonych 245 Rysunek 12.2: Kształ funkcji u(t, x) (12.22), b˛edacej ˛ rozwiazaniem ˛ równania różniczkowego dyfuzji (12.21). Listing 12.2: Program prezentujacy ˛ rozwiazanie ˛ analityczne (12.22) równania różniczkowego dyfuzji (12.21) % PDE_dyfuzja.m - dyfuzja ciepla w dlugim precie %(w aluminiowym mieszadle zanurzonym we wrzatku) clear all; close all; A = 10; u0 = 0; D = 1e-4; a = 1e-4; % wartosc skoku wielkosci u(t,x) % poziom dyfundujacej wielkosci u(t,x) w otoczeniu % wsp. dyfuzyjnosci % wsp. strat do otoczenia t = 0 : 1 : 1000; % czas x = 0 : 0.05 : 1; [T,X] = meshgrid(t,x); u = A/2*( exp( -X*sqrt(a/D) ) .* erfc( X./(2*sqrt(D*T)) - sqrt(a*T) ) + ... exp( X*sqrt(a/D) ) .* erfc( X./(2*sqrt(D*T)) + sqrt(a*T) ) ); figure; mesh( u ); xlabel(’t [s]’); ylabel(’x [m]’); title(’u(t,x)’); pause 12.4 Metoda różnic skończonych Metoda różnic skończonych jest najprostsza˛ metoda˛ rozwiazania ˛ numerycznego równania różniczkowego czastkowego. Z jej podstawami zaznajomiliśmy si˛e już w podrozdziale 12.2. Sprowadza si˛e ona do przybliżenia pochodnych czastkowych ˛ w każdym punkcie przestrzeni za pomoca˛ zależności różnicowych, przedstawionych w tabeli 12.3. Wartości dyskretne funkcji, b˛edacej ˛ rozwiazaniem ˛ równania, otrzymuje si˛e 246 12 PDE - Rozwiazywanie ˛ równań różniczkowych czastkowych ˛ w wyniku rozwiazania ˛ układu równań powstałych w ten sposób. Ponieważ rozwiazy˛ wane równanie macierzowe jest opisane macierza˛ rzadka˛ (z duża˛ liczba˛ elementów zerowych), nie jest to metoda efektywna obliczeniowo. Z tego powodu równania macierzowe sa˛ cz˛esto rozwiazawane ˛ w sposób iteracyjny. Układajac ˛ kolejne równania trzeba uwzgl˛ednić warunki brzegowe. Tabela 12.3: Wzory na przybliżenia pochodnych czastkowych ˛ w metodzie różnic skończonych Operacja Przybliżenie różnicowe Pierwsza pochodna: Dwupunktowy iloraz różnicowy centralny pierwszego rz˛edu: u(x ,y j )−u(xi−1 ,y j ) u −u ∆2c ui = i+1xi+1 = i+1, j2h i−1, j −xi−1 ∂ u(x,y) ∂x x = xi , y = y j Druga pochodna: ∂ 2 u(x,y) ∂ x2 Trzypunktowy iloraz różnicowy w przód drugiego rz˛edu: u −2u +u ∆ u −∆ u ∆32 u = 2 i h 2 i−1 = i+1, j h2i, j i−1, j x = xi , y = y j Laplasjan: ∂ 2 u(x,y) ∂ x2 +∂ 2 u(x,y) ∂ y2 Ilustracja graficzna = ∇2 u(x, y) Różnica pi˛eciopunktowa (ten sam przyrost h dla zmiennych x, y): 2 u+∆2 u = 1 u ∇25 u = ∆3,x i+1, j + ui, j+1 + ui−1, j + ui, j−1 − 4ui, j 3,y h2 Warunek brzeg. Dirichleta: u (x0 , y) = g(y) Zadana wartość w˛ezłów brzegowych: u0, j = g(y j ) Warunek brzeg. Neumanna: ∂ u(x0 ,y) = f (y) ∂x Sztuczny punkt poza obszarem dla schematu ∇25 u: u1, j −u−1, j = f (y j ) → u−1, j = u1, j − 2h f (y j ) 2h bez rysunku 12.5 Przykłady użycia metody różnic skończonych Obecnie zapoznamy si˛e z zastosowaniem metody różnic skończonych do rozwiazy˛ wania prostych równań różniczkowych czastkowych. ˛ 12.5.1 Ustalony rozkład ciepła 1D - równanie Laplace’a Cienki pr˛et, izolowany z boku, jest z jednej strony (x = 0) nagrzewany przez źródło ciepła o stałej temperaturze Tp = 20 stopni Celsjusza, a z drugiej strony (x = 1) chłodzony przez odbiornik ciepła, wymuszajacy ˛ stała˛ temperatur˛e Tk = −20 stopni Celsjusza (patrz rysunek 12.3). Zjawisko przepływu ciepła opisuje w tym przypadku równanie Laplace’a, czyli szczególna postać równania Poissona, z zerem po prawej stronie (warunki poczatkowe/brzegowe ˛ na czerwono): ∂ 2 T (x) = 0, ∂ x2 T (x = 0) = Tp = 20, T (x = 1) = Tk = −20. (12.24) 12.5 Przykłady użycia metody różnic skończonych 247 Po zastosowaniu schematu różnicowego dla drugiej pochodnej czastkowej ˛ (patrz tablica 12.3) z dyskretyzacja˛ 11-punktowa˛ (∆ x = 0.1), otrzymujemy: Ti+1 −2Ti +Ti−1 = 0 T (x = 1) = T10 = Tk . (12.25) Zapisujac ˛ tych 9 równań razem w postaci macierzowej (po przesieniu znanych wartości T0 i T10 na prawa˛ stron˛e), otrzymujemy równanie z macierza˛ trójprzekatniow ˛ a˛ o wymiarach 9 × 9: −2 1 0 T1 −T0 1 −2 . . . T2 0 . = . (12.26) . . . . . . 1 .. .. −T10 0 1 −2 T9 dla i = 1, 2, ..., 9, T (x = 0) = T0 = Tp , Jego rozwiazaniem ˛ jest linia prosta, opadajaca ˛ liniowo od wartości 20oC (dla x = 0) do o wartości −20 C (dla x = 1). Rozwiazanie ˛ to spełnia równanie oraz warunki brzegowe, określone w równaniu 12.24. Rysunek 12.3 Ustalony przepływ ciepła przez pr˛et izolowany z boku: z jednej strony nagrzewany (Tp ) a z drugiej — chłodzony (Tk ). Listing 12.3: Program rozwiazuj ˛ acy ˛ numerycznie równanie różniczkowe (12.24) po jego dyskretyzacji do postaci (12.26) % PDE_pret.m clear all; close all; N=5; Tp=20; Tk=-20; D = diag( -2*ones(N,1),0 ) + diag(ones(N-1,1),1) + diag(ones(N-1,1),-1); b = zeros(N,1); b(1) = -Tp; b(N) = -Tk; D, pause b, pause T = D\b; plot([Tp; T; Tk]); xlabel(’punkty x’); ylabel(’temperatura [oC]’); title(’Temp(x) [oC]’); grid; Problem 12.2 ((L)** Izolowany pr˛et ogrzewany i chłodzony). Zapoznaj si˛e z programem 12.3, rozwiazuj ˛ acym ˛ równanie różniczkowe czastkowe ˛ (12.24). Uruchom go i sam sprawdź jakie jest rozwiazanie ˛ tego równania. Zwi˛eksz liczb˛e punktów dyskretyzacji i wartości brzegowe. 248 12 PDE - Rozwiazywanie ˛ równań różniczkowych czastkowych ˛ 12.5.2 Nieustalony przepływ ciepła 1D - równanie dyfuzji Jeszcze raz rozpatrzymy przypadek długiego pr˛eta, izolowanego z boku, tylko teraz przeanalizujemy dynamiczne zmiany temperatury pr˛eta po skokowym przyłożeniu źródła ciepła (temperatury) w punkcie poczatkowym. ˛ Na końcu pr˛eta założymy warunek Neumanna (zerowa pochodna, brak przepływu ciepła). Równanie Poissona dyfuzji ciepła (zależnego od położenia x i czasu t) oraz warunki poczatkowe/brzegowe sa˛ wi˛ec nast˛epujace: ˛ ∂ 2 T (x,t) ∂ T (x,t) =D , ∂t ∂ x2 T (x = 0,t = 0) = 0, T (x = 0,t > 0) = Tp , ∂ T (x,t) ∂x (12.27) Dyskretyzujemy równanie (12.27): Ti, j+1 − Ti, j Ti+1, j − 2Ti, j + Ti−1, j =D . ∆t (∆ x)2 (12.28) Po lewej stronie pozostawiamy tylko Ti, j+1 . Otrzymujemy: Ti, j+1 = Ti, j + D · ∆t Ti+1, j − 2Ti, j + Ti−1, j . (∆ x)2 (12.29) Teraz dyskretyzujemy warunek Dirichleta na wartości brzegowe po lewej stronie pr˛eta (patrz rys. 12.3): Ti,0 = 0, dla i = 1, ..., M, (12.30) T0, j = Tp , dla j = 1, ..., N. (12.31) Założyliśmy M + 1 punktów w przestrzeni (od 0 do M) oraz N + 1 w czasie. Na końcu zapisujemy warunek Neumana na pochodna˛ na brzegu ze wspólnym punktem po prawej stronie pr˛eta (patrz rys. 12.3): TM+1, j − TM−1, j =0 → TM+1, j = TM−1, j . (12.32) 2∆ x Powyższa równość modyfikuje nam schemat różnicowy (12.29), który należy zastosować po prawej stronie pr˛eta w ostatnim punkcie x: TM, j+1 = TM, j + D · ∆t 2TM−1, j − 2TM, j . (∆ x)2 (12.33) Teraz możemy zapisać równania dla wszystkich punktów/w˛ezłów pr˛eta, zebrać je razem i otrzymać równanie macierzowe z bardzo duża,˛ ale rzadka,˛ macierza˛ przekatniow ˛ a.˛ Co pozostawiamy jako ewentualne zadanie laboratoryjne. Alternatywnie można iterować równanie (12.29) po czasie, czyli sukcesywnie wypełniać siatk˛e w˛ezłów poczawszy ˛ od t = 0, czyli j = 0. Schemat iteracyjny jest stabilny kiedy D·∆t 2 (∆ ≦ 1. x)2 W programie 12.4 zaimplementowano iteracyjny sposób rozwiazania ˛ powyższego zagadnienia. Jest to pierwsze iteracyjne rozwiazanie ˛ równania różniczkowego czast˛ kowego, przedstawione w tym rozdziale. W programie T (x,t) jest oznaczone jako u(x,t). Z kolei u0(j) oznacza u(x) dla t, czyli wartości poprzedniej chwili. W = 0. x=xk ,t=var 12.5 Przykłady użycia metody różnic skończonych 249 zwiazku ˛ z tym u0(j+1),u0(j),u0(j-1) to odpowiednio u(x+∆ x,t), u(x,t), u(x− ∆ x,t). Natomiast u1(j) oznacza u(x) dla t + ∆t, czyli nast˛epnej chwili. Z tego powodu u1(j+1),u1(j),u1(j-1) to odpowiednio u(x + ∆ x,t + ∆t), u(x,t + ∆t), u(x − ∆ x,t + ∆t). Na rysunku 12.4 jest zaprezentowane obliczone rozwiazanie. ˛ Rysunek 12.4: Wynik numerycznego rozwiazania ˛ równania różniczkowego dyfuzji (12.29) - nieustalony przepływ ciepła. Listing 12.4: Program rozwiazuj ˛ acy ˛ iteracyjnie numerycznie równanie różniczkowe (12.27) po jego dyskretyzacji do postaci (12.29) % PDE_dyfuzja_num.m clear all; close all; D = 0.0001; % stala dyfuzji Tp = 20; % temperatura poczatkowa po lewej stronie xmax = 2; % dlugosc preta nx = 100; % liczba punktow przestrzennych dx = xmax/nx; % krok w przestrzeni tmax = 100; % czas obserwacji nt = 100; % liczba punktow czasowych dt = tmax/nt; % krok w czasie q = (D*dt)/dx^2; % stala w rownaniu u0 = zeros(1,nx); u0(1) = Tp; % warunek poczatkowy wzdluz preta dla t=0 U = u0; % zapamietanie poprzedniej chwili % Iteracyjne rozwiazanie rownania rozniczkowego for n = 1 : nt-1 % PO CZASIE u1(1) = Tp; % punkt 1 w przestrzeni dla nastepnej chwili for j = 2 : nx-1 % W PRZESTRZENI - kolejne punkty w przestrzeni u1(j) = u0(j) + q *( u0(j+1) - 2*u0(j) + u0(j-1) ); % (11.29) end % (nowe) = (stare) + wsp*( stara druga pochodna ) u1(nx) = u0(nx) + q*( 2*u0(nx-1) - 2*u0(nx) ); % punkt ostatni (11.33) U = [U; u1]; % zapamietaj obecne rozwiazanie u0 = u1; % aktualizacja bufora: obecne --> poprzednie end 250 12 PDE - Rozwiazywanie ˛ równań różniczkowych czastkowych ˛ x = 0 : dx : xmax-dx; t = 0 : dt : tmax-dt; figure; mesh(x,t,U); grid; xlabel(’x [m]’); ylabel(’t [s]’); title(’U(x,t)’); pause Problem 12.3 (*** Izolowany pr˛et z nieustalonym przepływem ciepła). Spróbuj napisać program, rozwiazuj ˛ acy ˛ numerycznie równanie różniczkowe czast˛ kowe (12.27), wykorzystujac ˛ równania dyskretne wyprowadzone powyżej, ale zapisujac ˛ je w postaci macierzowej. 12.5.3 Ustalony rozkład ciepła 2D - równanie Laplace’a W tym przypadku zainteresujemy si˛e rozkładem pola temperatury (T ) w ścianie domu podczas zimy: w środku ciepło, na zewnatrz ˛ - zimno (patrz rysunek 12.5. Podobnie jak poprzednio mamy do czynienia z równaniem Laplace’a - tym razem 2D (x, y) (warunki brzegowe na czerwono): ∂ 2T ∂ 2T + 2 = 0, ∂ x2 ∂y T (x p ) = Tp , T (xk ) = Tk , ∂T ∂y = yp ∂T ∂y = 0. (12.34) yk Przeprowadzamy dyskretyzacj˛e przestrzeni 2D metoda˛ regularnej siatki, tak jak to przedstawiono na rysunku 12.5. Przyjmujemy tylko 9 punktów/w˛ezłów. Dla każdego z nich zapisujemy równanie Laplace’a w postaci dyskretnej (left, right, up, down, center), tak ja na rysunku 12.5 po prawej stronie): Tl + Tr + Tu + Td − 4Tc = 0. (12.35) Rysunek 12.5: Dwymymiarowy przepływ ciepła: ściana domu w zimie. Po lewej: ustalone pole 2D temperatury w punktach [T1 , T2 , ..., T9 ]. Po prawej: oznaczenia w˛ezłów zastosowane podczas dyskretyzacji. Rozpatrzmy teraz punkty o numerach 1,2,3,4,5. Punkty brzegowe na wewn˛etrznej i zewn˛etrznej ścianie domu maja˛ temperatur˛e otoczenia, czyli odpowiednio, Tp i Tk (warunek Dirichleta), zaś punkty brzegowe górne i dolne, leżace ˛ wewnatrz ˛ ściany, 12.5 Przykłady użycia metody różnic skończonych 251 maja˛ taka˛ sama˛ temperatur˛e jak ich sasiedzi ˛ centralni, odpowiednio, poniżej i powyżej (warunek Neumanna). • • • • • punkt 1: Tp + T2 + T1 + T4 − 4T1 = Tp + T2 + T4 − 3T1 = 0, punkt 2: T1 + T3 + T2 + T5 − 4T2 = T1 + T3 + T5 − 3T2 = 0, punkt 3: T2 + Tk + T3 + T6 − 4T3 = T2 + Tk + T6 − 3T3 = 0, punkt 4: Tp + T5 + T1 + T7 − 4T4 = 0, punkt 5: T4 + T6 + T2 + T8 − 4T5 = 0. Zapisujac ˛ wszystkie równania razem otrzymujemy poniższe równanie macierzowe (rzadkie!), które rozwiazujemy ˛ ze wzgl˛edu na wektor temperatur [T1 , ..., T9 ]T : −Tp T1 −3 1 0 1 0 0 0 0 0 0 1 0 0 0 0 T2 0 1 −3 1 T3 −Tk 0 0 0 0 1 −3 0 0 1 (12.36) 1 0 0 −4 1 0 1 0 0 T4 = −Tp T5 0 0 1 −4 1 1 0 0 1 0 .. .. .. . . . 0 0 0 0 0 1 0 1 −3 −Tk T9 Program 12.5 rozwiazuje ˛ numerycznie opisany problem. Listing 12.5: Program prezentujacy ˛ rozwiazanie ˛ numeryczne czastkowego ˛ równania rózniczkowego 2D (12.34) % PDE_plyta.m clear all; close all; Tp = 20; Tk = -5; N = 9; % temperatura: dom (poczatek), otoczenie (koniec) % liczba punktow, 3 x 3 % Warunki brzegowe % p1 p2 p3 % ---------% (Tp) | p1 p2 p3 | (Tk) % (Tp) | p4 p5 p6 | (Tk) % (Tp) | p7 p8 p9 | (Tk) % ---------% p7 p8 p9 b = [ -Tp; ... 0; ... -Tk; ... -Tp; ... 0; ... -Tk; ... -Tp; ... 0; ... -Tk]; % punkt 1 % punkt 2 % punkt 3 % punkt 4 % punkt 5 % punkt 6 % punkt 7 % punkt 8 % punkt 9 % Rownanie Laplace’a wewnatrz plyty - punkty powyzej i ponizej sz uwzgl. w CENTRUM A = [ -3 1 0 1 0 0 0 0 0; ... % pkt 1 - (-3) 1 -3 1 0 1 0 0 0 0; ... % pkt 2 - (-3) 0 1 -3 0 0 1 0 0 0; ... % pkt 3 - (-3) 1 0 0 -4 1 0 1 0 0; ... % pkt 4 - (-4) 0 1 0 1 -4 1 0 1 0; ... % pkt 5 - (-4) 0 0 1 0 1 -4 0 0 1; ... % pkt 6 - (-4) 0 0 0 1 0 0 -3 1 0; ... % pkt 7 - (-3) 0 0 0 0 1 0 1 -3 1; ... % pkt 8 - (-3) 0 0 0 0 0 1 0 1 -3 ]; % pkt 9 - (-3) 252 12 PDE - Rozwiazywanie ˛ równań różniczkowych czastkowych ˛ % Punkty lewego i prawego boku sa po lewej stronie rownania: suma daje zero po prawej stronie. % Po przeniesieniu punktow bokow, o znanych wartosciach, na prawa strone, % zostaja one zanegowane: A*x = b. disp(’Rozklad temperatury 3x3:’) x = A \ b, reshape( x, 3, 3)’, pause Problem 12.4 (*** Ściana domu w zimie). Zapoznaj si˛e z programem 12.5, rozwia˛ zujacym ˛ równanie rózniczkowe czastkowe ˛ (12.34). Uruchom go i sam sprawdź jakie jest rozwiazanie ˛ tego równania. Zwi˛eksz liczb˛e punktów dyskretyzacji do 16 (4 × 4). Przyjmij inne wartości brzegowe. 12.5.4 Jednowymiarowa propagacja fali elektromagnetycznej równanie Maxwella Obecnie zajmiemy si˛e zagadnieniem emisji fali elektromagnetycznej przez anten˛e. Założymy środowisko jednorodnej próżni, bez obecności pradów ˛ i ładunków. Równania Maxwella maja˛ w takim przypadku postać eliptyczna: ˛ 1 ∂ 2E ∂ 2E − 2 = 0, c2 dt 2 dx 1 ∂ 2H ∂ 2H − 2 = 0, c2 dt 2 dx (12.37) gdzie: • c - pr˛edkość światła w próżni (3 · 108 [m/s]), • E - potencjał elektryczny, • H - potencjał magnetyczny. Wektory pól elektrycznych i magnetycznych sa˛ do siebie prostopadłe i współfazowe. W przypadku jednowymiarowym dla sygnału sinusoidalnego o cz˛estotliwości f jako warunku brzegowego, rozwiazaniem ˛ równania (12.37) jest sinusoidalna fala elektromagnetyczna, przemieszczajaca ˛ si˛e w próżni na zasadzie wzajemnego indukowania si˛e pola elektrycznego i magnetycznego ( f , λ = cf - jej cz˛estotliwość i długość): x E(x,t) = E0 sin 2π f t − 2π . (12.38) λ Poniżej sa˛ przedstawione przekształcenia równania (12.37), prowadz˛ece do jego rozwiazania ˛ numeryczego, pokazanego w programie 12.6. Dowód. Wprowadzamy oznaczenie u(x,t) = E(x,t). Rozpatrujemy tylko przypadek jednowymiarowy. Ostatnia linia nawiazuje ˛ do kodu Matlaba w programie 12.6: u2 , u1 , u0 to u w chwilach t + ∆t,t,t − ∆t, natomiast u( j + 1), u( j), u( j − 1) to u dla x + ∆ x, x, x − ∆ x. 12.5 Przykłady użycia metody różnic skończonych 253 1 ∂ 2 u(x,t) ∂ 2 u(x,t) − = 0, c2 dt 2 dx2 2 ∂ 2 u(x,t) 2 ∂ u(x,t) = c , dt 2 dx2 2 dt · c ∂ 2 u(x,t) = ∂ 2 u(x,t), dx ux,t+∆t − 2ux,t + ux,t−∆t = q · ux+∆ x,t − 2ux,t + ux−∆ x,t ux,t+∆t = q · ux+∆ x,t − 2ux,t + ux−∆ x,t + 2ux,t − ux,t−∆t , u2 ( j) = q · [u1 ( j + 1) − 2u1 ( j) + u1 ( j − 1)] + 2u1 ( j) − u0 ( j). Problem 12.5 ((L)* Jednokierunkowa propagacja fali elektromagnetycznej). Zapoznaj si˛e z programem 12.6, rozwiazuj ˛ acym ˛ równanie różniczkowe czast˛ kowe (12.37) dla przypadku jednowymiarowego. Zwróć uwag˛e, że tym razem równanie różniczkowe czastkowe ˛ jest rozwiazywane ˛ w sposób iteracyjny, a nie macierzowy. Zauważ przesuwanie si˛e indukowanej fali elektromagnetycznej. Porównaj kod programu z końcowym wynikiem wyprowadzenia, przedstawionego powyżej. Listing 12.6: Program rozwiazuj ˛ acy ˛ numerycznie równanie różniczkowe (12.37) po jego dyskretyzacji) % PDE_fala.m - jednokierunkowa propagacja fali elektromagnetycznej clear all; close all; c = 3e8; % predkosc swiatla w prozni f = 900e6; % czestotliwosc fali RF (radio-frequency) w MHz w = 2*pi*f; % pulsacja nx = 500; % liczba punktow w przestrzeni nt = 400; % liczba punktow w czasie dtdx = 0.2; % rozdzielczosc czasowo-czestotliwosciowa len = c/f; % dlugosc rozchodzacej sie fali RF k = 2*pi/len; % wsp. skalujacy x --> przesuniecie katowe: fi = k*x xx = 3*len; % zakladana dlugosc obserwacji przestrzennej dx = xx/nx; % liczba punktow w przestrzeni dt = dtdx*dx/c; % patrz tekst q = (c*dt/dx)^2; % patrz tekst x = 0 : dx : xx; % punkty przestrzenne t = 0; % czas t0 u0 = sin(w*t-k*x); % natezenie pola elektrycznego w t0 v0 = w*cos(w*t-k*x); % natezenie pola magnetycznego w t0 (pochodna elektrycznego) t = dt; % nastepna chwila u1 = u0 + dt*v0; % u(k=1) = u(k=0) + dt*du(t)/dt | dla (k=0) U = [u0; u1]; % zapamietanie tt = [ 0; dt ]; % zapamietanie % Iteracyjne rozwiazanie rownania rozniczkowego for n = 1 : nt % PO CZASIE t = t+dt; tt=[tt;t]; % nastepna chwila u = sin(w*t-k*x); % nowe pobudzenie na wejsciu for j = 2 : nx % u2() - nastepna chwila w kazdym pkt % PO PRZESTRZENI u2(j) = q*(u1(j+1) - 2*u1(j) + u1(j-1)) + 2*u1(j) - u0(j); % punkty 2 : nx end % (nowe) ( druga pochodna ) 2*(obecne) (stare) % u2(1) = q*( u1(2) - 2*u1(1) + u(nx) ) + 2*u1(1) - u0(1); % punkt (1) u2(nx+1) = u2(1); % punkt (nx+1) U = [U; u2]; % zapamietaj obecne rozwiazanie u0 = u1; u1 = u2; % aktualizacja: obecne-->poprzednie-->popoprzednie end plot(x,U); grid; xlabel(’x [m]’); title(’U(x)’); pause 254 12 PDE - Rozwiazywanie ˛ równań różniczkowych czastkowych ˛ 12.6 Zastosowanie wbudowanej funkcji Matlaba pdepe() W środowisku Matlab istnieje specjalna funkcja pdepe(), służaca ˛ do rozwiazywania ˛ równań rózniczkowych czastkowych, ˛ pełniaca ˛ podobna˛ rol˛e co funkcje odeXXX() dla równań różniczkowych zwyczajnych. Obecnie przytoczymy przykład jej użycia za [2]. Załóżmy, że chcemy rozwiazać ˛ nast˛epujace ˛ równanie różniczkowe czastkowe, ˛ czyli równanie dyfuzji (12.27): ∂ u ∂ 2u = 2 . dla 0 ≦ x ≦ 1, ∂t ∂x Przyjmujemy nast˛epujace warunki poczatkowe: ˛ π2 • dla t = 0 : • dla x = 0 : • dla x = 1 : t ≧ 0. (12.39) u (x, 0) = sin (πx), u(0,t) = 0, πe−t + ∂∂ ux (1,t) = 0. Funkcja Matlaba pdepe() rozwiazuje ˛ równania nast˛epujacej ˛ postaci: ∂u ∂u ∂u ∂u ∂ c x,t, u, = x−m xm f x,t, u, + s x,t, u, . ∂ x ∂t ∂x ∂x ∂x Ponieważ nasza˛ funkcj˛e można przedstawić jako: ∂u ∂ ∂u π2 = x0 x0 + 0, ∂t ∂x ∂x (12.40) (12.41) dlatego musimy zastosować nast˛epujace ˛ podstawienia: ∂u c x,t, u, = π 2, ∂x ∂u s x,t, u, = 0. ∂x (12.42) Z tego powodu funkcja główna naszego równania, wywoływana przez pdepe(), przyjmuje nast˛epujac ˛ a˛ postać: m = 0, ∂u ∂u f x,t, u, = , ∂x ∂x function [c,f,s] = pdex1pde(x,t,u,dudx) c = pi^2; f = dudx; s = 0; end Ponieważ warunek poczatkowy ˛ na u0 ma być zastosowany dla wszystkich wartości x w chwili poczatkowej ˛ tspan(1), funkcja inicjalizujaca ˛ jest nast˛epujaca: ˛ function u0 = pdex1ic(x) u0 = sin(pi*x); end Na końcu musimy przekształcić nasze warunki brzegowe do wymagań programu głównego: ∂u p (x,t, u) + q (x,t) f x,t, u, = 0. (12.43) ∂x Robimy to i otrzymujemy co nastepuje: 12.6 Zastosowanie wbudowanej funkcji Matlaba pdepe() 255 • dla x = 0: ∂u = 0, ∂x q (0,t) = 0; u (0,t) = 0 → u + 0 · (12.44) p (0,t, u) = u, (12.45) • dla x = 1: ∂u ∂u (1,t) = 0 → πe−t + 1 · (1,t) = 0, ∂x ∂x p (1,t, u) = πe−t , q (1,t) = 1. πe−t + (12.46) (12.47) W zwiazku ˛ z powyższym otrzymujemy nast˛epujac ˛ a˛ funkcj˛e definiujaca ˛ warunki brzegowe: function [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t) pl = ul; ql = 0; pr = pi * exp(-t); qr = 1; end Program główny, wywołujacy ˛ trzy napisane przez nas funkcje pomocnicze/wewn˛etrzne, jest przedstawiony w listingu 12.7. Na rysunku 12.6 porównano rozwiazanie ˛ numeryczne, otrzymane z programu, z rozwiazaniem ˛ analitycznym, określonym przez nast˛epuja˛ równanie: u(x,t) = e−t sin(πx). (12.48) Rysunek 12.6: Porównanie numerycznego i analitycznego rozwiazania ˛ równania (12.39). Listing 12.7: Program rozwiazuj ˛ acy ˛ numerycznie równanie różniczkowe (12.39) z wykorzystaniem funkcji Matlaba pdepe() % PDE_SolveSinglePDEExample.m clear all; close all: % Required (x,t) grid 256 12 PDE - Rozwiazywanie ˛ równań różniczkowych czastkowych ˛ x = linspace(0,1,20); t = linspace(0,2,5); % a <= x <= b % t1 <= t <= t2 % Solving init. condition m = 0; % function u0 for t(1) sol = pdepe( m, @pdex1pde, @pdex1ic, u = sol(:,:,1); boundary conditions u(x=a,t), u(x=b,t) @pdex1bc, x, t); % Results figure; subplot(121); surf(x,t,u); title(’Num solution’); xlabel(’odl. x’); ylabel(’czas t’); subplot(122); surf(x,t,exp(-t)’*sin(pi*x)); title(’True solution’); xlabel(’odl. x’); ylabel(’czas t’); Problem 12.6 (*** Inżynierskie zadanie). Spróbuj wykorzystać funkcj˛e Matlaba do rozwiazania ˛ numerycznego innego czastkowego ˛ równania różniczkowego, wybranego przez osobiście przez Ciebie. 12.7 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. • Życie słuchacza kursu “Metody numeryczne” nie jest lekkie, szczególnie podczas laboratorium, dotyczacego ˛ rozwiazywania ˛ numerycznego równań różniczkowych czastkowych ˛ (RRCz). • Jednak nie możemy zamknać ˛ oczu i schować głowy w piasek, udajac, ˛ że problemu (czyli RRCz) nie ma. Ponieważ świat jest dynamicznie zmienny i wielowymiarowy, dlatego nie uciekniemy przed potrzeba˛ znalezienia rozwiazania ˛ RRC w wielu ważnych zadaniach inżynierskich. • Równania różniczkowe czastkowe ˛ opisuja˛ dynamik˛e systemów przestrzennie rozłożonych (zmienność w czasie i przestrzeni). • RRCz dzielimy je na rodzaje zależne od natury procesów, które opisuja: — eliptyczne (pola statyczne ze źródłami, np. pola temperatury, potencjału), — paraboliczne (np. równanie dyfuzji), — hiperboliczne (np. równanie falowe). • Najprostsza koncepcyjnie metoda numerycznego rozwiazania ˛ RRCz to metoda różnic skończonych z dyskretnym przybliżeniem pochodnych na równomiernej siatce w˛ezłów. • Istnieja˛ również metody korzystajace ˛ z równoważnego, całkowego sformułowania problemu, jak np. metoda elementów skończonych (o metodzie tej nie mówiliśmy, ale dla kompletności wspominamy o niej teraz). • Wypełnianie dużej, rzadkiej macierzy opisujacej ˛ analizowany problem RRCz (równanie i warunki brzegowe) na g˛estej siatce punktów jest żmudne. Z kolei iteracyjne rozwiazywanie ˛ równania macierzowego, zwiazanego ˛ z równaniem różniczkowym, jest trudne. • Istnieja˛ specjalizowane pakiety służace ˛ rozwiazywaniu ˛ złożonych problemów polowych opisanych RRCz. Literatura 257 Literatura 1. D. Borkowski, Metody numeryczne w elektrotechnice. Materiały do wykładu, AGH, Kraków 2012. 2. Matlab: "Solving Partial Differential Equations,"on-line: https:// www.mathworks.com/ help/ matlab/ math/ partial-differential-equations.htmll 3. J.H. Mathews, K.D. Fink, Numerical Methods Using Matlab. Upper Saddle River, Prentice-Hall, 2005 4. C. Moler: “Partial Differential Equations”, in Numerical Computing with Matlab, on-line: https: // www.mathworks.com/ moler/ chapters.html.html 5. W.H. Press, S.A. Teukolsky, W.T. Vetterling, B.P. Flannery, Numerical Recipes: The Art of Scientific Computing. Cambridge University Press, 2007. 6. S. Rosłoniec, Wybrane metody numeryczne z przykładami zastosowań w zadaniach inżynierskich. Oficyna Wydawnicza Politechniki Warszawskiej, Warszawa 2008. 7. W.Y. Yang, W. Cao, T.-S. Chung, J. Morris, Applied Numerical Methods Using Matlab. Wiley, Hoboken 2005. Rozdział 13 Generowanie liczb pseudolosowych i metody Monte Carlo Streszczenie Determinizm-losowość-pseudolosowość, generowanie liczb pseudolosowych, transformacje rozkładów losowych, szumy kolorowe, binarne sekwencje pseudolosowe PRBS, eksperymenty z zaburzeniem losowym - metody Monte Carlo. Patrz: [2] 13.1 Wprowadzenie Determinizm. Poj˛ecie deterministyczny oznacza, że coś jest określone/zdefiniowane w sposób jednoznaczny, jest w pełni przewidywalne. Tak jak wzajemne oddziaływanie ciał opisane przez zasady dynamiki Newtona. Potwierdzeniem deterministycznego widzenia świata jest stwierdzenie Laplace’a: "Dajcie mi poczatkowe ˛ pr˛edkości i położenia wszystkich czastek ˛ we Wszechświecie, a b˛ed˛e umiał przewidzieć cała˛ jego przyszłość". Losowość. Poj˛ecie losowy oznacza, że nie jesteśmy w stanie czegoś w pełni przewidzieć (kontrolować). Losowość opisywana jest matematyczna˛ teoria˛ prawdobodobieństwa. Przykładowo: rzucamy kostka˛ do gry, nie wiemy jaka cyfra wypadnie (1-6), ale wiemy, że prawdopodobieństwo otrzymania dowolnej z nich jest równe 61 . Fizycznie obserwowane szumy cieplne w układach elektronicznych sa˛ zwiazane ˛ z chaotycznym ruchem elektronów. Pseudolosowość. Poj˛ecie pseudolosowy oznacza zjawisko/zachowanie, które jest w pełni określone/zdeterminowane, ale udaje zachowanie losowe. Na tej zasadzie działaja˛ generatory liczb pesudolosowych (w Matlabie funkcje rand(), randn()): stosuja˛ konkretna˛ reguł˛e matematyczna˛ do otrzymania sekwencji liczb, wygladaj ˛ a˛ cej na losowa.˛ Technika udawanego chaosu jest szeroko stosowana w świacie ludzi i zwierzat ˛ (np. odciaganie ˛ drapieżnika od gniazda przez ptaki, rozrzucanie pozycji poprawnej odpowiedzi w testach wyboru). W zastosowaniach technicznych liczby pseudolosowe sa˛ wykorzystywane jako sekwencje synchronizacyjne, kryptograficzne, autoryzacyjne, ... 13.2 Generatory liczb pseudolosowych Podstawy. Liczby pseudolosowe sa˛ generowane na podstawie deterministycznej zależności, która jest wykonywana iteracyjnie, zaczynajac ˛ od wybranej wartości poczat˛ kowej. Otrzymujemy w ten sposób okresowy ciag ˛ liczb. Dobrze zaprojektowany generator ma długi okres pracy bez powtórzeń, rz˛edu 2b , gdzie b oznacza liczb˛e bitów słowa używanego w komputerze. W tabeli 13.1 sa˛ podane wzory, wykorzystywane przez najprostsze generatory. Generatory multiplikatywne oferuja˛ dłuższe okresy pracy bez powtórzeń niż addytywne. Najcz˛eściej stosuje si˛e jednak generatory kongruentne, które stanowia˛ połaczenie generatorów addytywnych i multiplikatywnych. Długi okres sekwencji bez powtórzeń uzyskuje si˛e dzi˛eki odpowiedniemu doborowi wartości prametrów a, m [6]. Użycie słowa 32-bitowego powoduje, że otrzymywany okres sekwencji liczb losowych jest równy 232 ≈ 109 . W wi˛ekszości zastosowań, poza kryptografia˛ i bezpieczeństwem, 259 260 13 Generowanie liczb pseudolosowych i metody Monte Carlo jest to wystarczajace. ˛ Dłuższe okresy uzyskuje si˛e łacz ˛ ac ˛ wyniki z różnych generatorów. Tabela 13.1: Rodzaje generatorów liczb losowych Rodzaj Przepis Opis addytywny xn+1 = (xn + m) mod p multiplikatywny xn+1 = (a · xn ) mod p kongruentny xn+1 = (a · xn + m) mod p reszta z dzielenia przez p sumy poprzedniej liczby xn oraz stałej m reszta z dzielenia przez p iloczynu poprzedniej liczby xn oraz stałej a reszta z dzielenia przez p iloczynu poprzedniej liczby xn oraz stałej a, powi˛ekszonego o wartość stałej m Szczegóły. We wszystkich metodach, przedstawionych w tabeli 13.1, liczby całkowite z zakresu [0, P − 1] sa˛ generowane z takim samym prawdopodobieństwem (czyli równomiernie). Normalizacja rn = xPn sprowadze je do przedziału [0, 1). W tabeli 13.2 sa˛ podane wartości parametrów a, m stosowane w różnych generatorach kongruentnych, natomiast w tabeli 13.3 — nazwy funkcji generatorów liczb losowych, stosowanych w różnych j˛ezykach (środowiskach). Tabela 13.2: Wartości parametrów stosowane w generatorach kongruentnych (obecnie oraz w przeszłości) Oprogramowanie P a m Numerical Recipes [3] Borland C/C++ Borland Delphi, Vurtual Pascal GNU Compiler Collection ANSI C POSIX C Microsoft Visual C/C++ 232 1664525 22695477 134775813 69069 1103515245 1103515245 214013 1013904223 1 1 5 12345 12345 2531011 232 232 232 232 231 232 Tabela 13.3: Nazwy funkcji generatorów liczb losowych Oprogramowanie Nazwy funkcji/kommend Nazwy bezpiecznych funkcji Unix/Linux/QNX Windows Java Python Matlab rand(), srand(), random(), srandom() c:>echo %random% rem [0-32767] Math.random(), util.Random() random() rand(), randn() /dev/random() CryptGenRandom() SecureRandom() – – Problem 13.1 ((L)* Testowanie generatorów liczb losowych w Matlabie). W listingu 13.1 przedstawiono przykładowy kod Matlaba funkcji dwóch generatorów: multiplikatywnego i kongruenthego, oraz programu głównego, który te funkcje wywołuje. Korzystajac ˛ z talicy 13.2 zmień parametry generatora kongruetnego. Spróbuj wyznaczyć okres powtarzania si˛e generowanej sekwencji liczb. Sprawdź jaki jest histogram generowanych liczb (funkcja hist()). 13.2 Generatory liczb pseudolosowych 261 Listing 13.1: Testowanie generatorów liczb losowych w j˛ezyku Matlab % test_rand.m clear all; close all; r = rand_mult(10000,123); % r = rand_multadd(10000,123); figure; plot(r,’bo’); pause figure; hist(r,20); pause % multiplikatywny (ile liczb, pierwsza liczba) % kongruentny %############################## function s=rand_mult( N, seed ) a = 69069; p = 2^12; s = zeros(N,1); for i=1:N s(i) = mod(seed*a,p); seed = s(i); end s = s/p; %################################# function s=rand_multadd( N, seed ) a = 69069; m = 5; p = 2^32; s = zeros(N,1); for i=1:N s(i) = mod(seed*a+m,p); seed = s(i); end s = s/p; Problem 13.2 (* Testowanie generatorów liczb losowych w j˛ezyku C). W listingu 13.2 przedstawiono kod funkcji rand(), wykorzystywany w j˛ezyku POSIX C. Napisz program testujacy ˛ t˛e funkcj˛e. Listing 13.2: Funkcja rand() z j˛ezyka POSIX C static unsigned long next = 1; /* RAND_MAX assumed to be 32767 */ int rand(void) { next = next * 1103515245 + 12345; \* x(n+1) = a*x(n) + m *\ return((unsigned)(next/65536) % 32768); } void srand(unsigned seed) { next = seed; } Kryptografia. Generatory, które sa˛ bezpieczne kryptograficznie bazuja˛ na poj˛eciu entropii (miary nieuporzadkowania, ˛ chaosu). Entropia jest obliczana dla parametrów systemu, charakteryzujacych ˛ si˛e losowościa,˛ a nast˛epnie wykorzystywana w procesie generacji, np. jako liczba startowa sekwencji. Losowy jest czas dost˛epu do dysku, 262 13 Generowanie liczb pseudolosowych i metody Monte Carlo czas przejścia pakietu IP, szum cieplny czujnika temperatury, itp. Funkcje generatorów bezpiecznych kryptograficznie zostały wymienione tabeli 13.3. 13.3 Transformacje rozkładów losowych Odwrócenie znanej dystrybuanty. Najłatwiej jest generować liczby pseudolosowe o rozkładzie równomiernym. Po unormowaniu otrzymuje si˛e liczby rzeczywiste z przedziału [0,1] (w skrócie R[0, 1]). Wykonujac ˛ transformacj˛e liczb o tym rozkładzie otrzymuje si˛e liczby losowe o innychRrozkładach. Ogólna zasada transformacji polega x na odwróceniu dystrybuanty F(x) = −∞ p(x)dx pożadanego ˛ rozkładu p(x): jeśli r jest zmienna˛ losowa˛ o rozkładzie R[0, 1], a docelowy (pożadany) ˛ rozkład p(x) zmiennej x ma mieć dystrybuant˛e F(x), to transformacja zmiennych jest rozwiazaniem ˛ równania F(x) = r (patrz rysunek 13.1). Szukamy wi˛ec wyrażenia x = F −1 (r), X) (r → x), którego użyjemy do przekształcenia zbioru wygenerowanyc liczb {r} na liczby {x}. F(x) 1 0.8 0.6 r Rysunek 13.1 Ilustracja graficzna zasady transformacji rozkładu R[0, 1] na dowolny rozkład, na przykładzie rozkładu majacego ˛ funkcj˛e g˛estości prawdopodobieństwa p(x) = e−λ x oraz dystrybuant˛e F(x) = 1 − e−λ x = r. 0.4 0.2 0 0 0.5 1 1.5 2 2.5 3 x Problem 13.3 ((L)* Generowanie liczb o rozkładzie wykładniczym). Załóżmy, że chcemy wygenerować zbiór liczb o rozkładzie wykładniczym p(x) = e−λ x (funkcja Rx g˛estości prawdopodobieństwa), który ma dystrybuant˛e F(x) = −∞ p(x)dx dana˛ nast˛epujacym ˛ wzorem: F(x) = 1 − e−λ x . (13.1) Przyrównujac ˛ powyższe równanie do r oraz odwracajac ˛ otrzymana˛ zależność otrzymujemy: 1 − e−λ x = r ⇒ e−λ x = 1 − r ⇒ −λ x = ln(1 − r) ⇒ x = − 1 ln(1 − r). (13.2) λ Jeśli r ∈ R[0, 1], to wynikowe liczby x maja˛ rozkład wykładniczy p(x) = e−λ x z parametrem λ . Sprawdź to, korzystajać ˛ z programu 13.3. Listing 13.3: Przykład transformowania liczb o rozkładzie równomiernym na inny rozkład % rand_transform1.m % R[0,1] --> Dowolny rozklad o zadanej dystrybuancie 13.3 Transformacje rozkładów losowych 263 % F(x) = 1-exp(-lamb*x) = r --> x=? x = 0 : 0.01 : 3; lamb = 1; F = 1-exp(-lamb*x); plot( x, F ); xlabel(’x’); ylabel(’r’); title(’F(x)’); grid; pause disp(’Rownomierny R[0,1] --> o dowolnej dystrybuancie’); N = 10000; lamb = 2; r = rand(1,N); x = - (1/lamb)*log(1 - r); figure; subplot(221); plot(r,’b.’); subplot(222); hist(r,20); subplot(223); plot(x,’b.’); subplot(224); hist(x,20); pause Przekształcenie Boxa-Millera działa na innej zasadzie. Transformuje si˛e w nim biegunowy układ współrz˛ednych na kartezjański. Dzi˛eki temu para dwóch losowo niezależnych liczb (r1 , r2 ) z R[0, 1] zostaje przekształcona na dwie losowo niezalażne liczby (n1 , n2 ) z N[0, 1] (rozkład normalny o wartości oczekiwanej/średniej 0 oraz odchyleniu standardowym1): (r1 , r2 ) ⇒ (n1 , n2 ) : n1 = p −2 ln(r1 ) cos(2πr2 ), n2 = p −2 ln(r1 ) sin(2πr2 ). (13.3) Jak widzimy: 1. generujemy dwie liczby o rozkładzie równomiernym R[0, 1], 2. interpretujemy je jako moduł i kat ˛ w układzie biegunowym, 3. stosujemy nieliniowa˛ transformacj˛e, która generuje nam dwie ortogonalne współrz˛edne w układzie kartezjańskim, obydwie o rozkładzie normalnym. Wynik takiej operacji jest pokazany na rysunku 13.2. hist( n1 ) 1500 1000 500 0 -4 -3 -2 -1 0 1 2 3 4 hist( n2 ) 1500 1000 500 0 -5 -4 -3 -2 -1 0 1 2 3 4 Rysunek 13.2: Przykładowe histogramy zmiennych losowych n1 , n2 wygenerowanych za pomoca˛ algorytmu Boxa-Millera. Problem 13.4 (* Generowanie liczb o rozkładzie normalnym). Zapoznaj si˛e z programem 13.4. Uruchom go. Zweryfikuj poprawnośc otrzymanych wyników. Przekształć otrzymane sekwencje N(0, 1) na sekwencje o innych wartościach średnich/o- 264 13 Generowanie liczb pseudolosowych i metody Monte Carlo czekiwanych oraz innych odchyleniach standardowych. Czy nie wystarczy ich po prostu pomnożyć przez jakaś ˛ liczb˛e (zmiana odchylenia), a nast˛epnie dodać do wyniku jakaś ˛ inna˛ liczb˛e (zmiana średniej). Zrób to i sprawdź wynik na rysunku histogramu. Listing 13.4: Przykład transformowania liczb o rozkładzie równomiernym na rozkład normalny - przekształcenie Boxa-Millera % rand_transform2.m % Przeksztalcenie Boxa-Millera disp(’Rownomierny R[0,1] --> Normalny (0,1)’) N = 10000; r1 = rand(1,N); r2 = rand(1,N); n1 = sqrt(-2*log(r1)) .* cos(2*pi*r2); n2 = sqrt(-2*log(r1)) .* sin(2*pi*r2); figure; subplot(111); plot(n1,n2,’b*’); pause figure; subplot(211); hist(n1,20); title(’n1’); subplot(212); hist(n2,20); title(’n2’); pause 13.4 Binarne sekwencje pseudolosowe PRBS Podstawy. Do identyfikacji właściwości dynamicznych systemów transmisji danych (sygnałów, informacji) potrzebny jest pobudzajacy ˛ sygnał testujacy ˛ o szerokim widmie cz˛estotliwościowym. Taka˛ właściwość ma szum biały (zawierajacy ˛ wszystkie cz˛estotliwości, czyli majacy ˛ szerokie, płaskie widmo), ale jest on niedeterministyczny i trudny w generowaniu. Dlatego czesto zamiast niego używa si˛e sygnałów deterministycznych najprostszych w generowaniu, czyli dwuwartościowych (typu włacz/wy˛ łacz, ˛ +/-), przełaczanych ˛ w dyskretnych momentach określonych przez zegar taktujacy. ˛ Sygnały takie sa˛ nazywane binarnymi sekwencjami pseudo-losowymi (PRBS Pseudo-Random Binary Sequence). Sekwencje ml-PRBS (maximum-length PRBS) stanowia˛ ich podgrup˛e, charakteryzujac ˛ a˛ si˛e taka˛ sekwencja˛ przełaczeń, która daje najszersze widmo sygnału. Sekwencje ml-PRBS generuje si˛e szybko w sposób sprz˛etowy, albo wolniej w sposób programowy, z użyciem bufora przesuwnego ze sprz˛eżeniem zwrotnym oraz układem/operacja˛ XOR (dodawaniem bitowym modulo-2: 0+0=0, 0+1=1, 1+0=1, 1+1=0). Przykład takiego układu jest przedstawiony w górnej cz˛eści rysunku 13.3 dla bufora o długości N = 5 elementów. Odpowiedni wybór komórek ze sprz˛eżeniem zwrotnym powoduje, że na wyjściu układu otrzymujemy sekwencj˛e bitów ml-PRBS (0=-V, 1=+V), czyli sygnał majacy ˛ impulsowa˛ funkcj˛e autokowariancji, tzn. funkcj˛e autokorelacji sygnału z odj˛eta˛ wartościa˛ średnia.˛ Na wykresie znajdujacym ˛ si˛e w środkowej cz˛eści rysunku 13.3 jest przedstawiona sekwencja liczb: 0001101110101000010010110011111...0001101110101000010010110011111... otrzymana w rozpatrywanym przypadku. Jak widać powtarza si˛e ona co 2N − 1 = 25 − 1 = 31 elementów. Poniżej jest pokazana funkcja autokowariancji tej sekwencji, obliczona dla fragmentu sygnału o długości 64 elementów. Wyraźnie sa˛ widoczne 13.4 Binarne sekwencje pseudolosowe PRBS 265 wartości impulsowe, które świadczace ˛ o punktowym nałożeniu si˛e przesuwanego sygnału na siebie. Pozostałe wartości sa˛ małe, co dobitnie świadczy o braku samopodobieństwa fragmentów sekwencji, czyli o losowości otrzymanej sekwencji PRBS. W tabeli 13.4 wytłumaczono zasad˛e tworzenia odczepów w schemacie z buforym przesuwnym. Natomiast na listingu 13.5 zaprezentowano program do generacji wybranych sekwencji PRBS z wykorzystaniem tabeli 13.4. Wykresy zaprezentowane po prawej stronie rysunku 13.3 zostały wygenerowany przez program 13.5. y(n) 1 0.5 0 0 10 20 30 40 50 60 70 Ryy(k) 15 10 5 0 -60 -40 -20 0 20 40 60 Rysunek 13.3: Przykładowy układ (schemat obliczeniowy) do generacji sekwencji ml-PRBS (na górze) oraz sama wygenerowana sekwencja (po środku) oraz jej funkcja auto-kowariancji (na dole). Układ odczepów wynika z tabeli 13.4: przyj˛eto N = 5 (5-cio elementowy bufor przesuwny), okres sekwencji L = 2N − 1 = 31, co jest potwierdzone na rysunku. Listing 13.5: Generowanie sekwencji ml-PRBS w Matlabie N = 5; % 2,3,4,5,9,12 L = 2*(2^N); buf = ones(1,N); 266 13 Generowanie liczb pseudolosowych i metody Monte Carlo for n = 1 : L if(N==1) y(n)=xor(buf(1), buf(2)); end % N=2 oct(7) 111 if(N==3) y(n)=xor(buf(2), buf(3)); end % N=3 oct(13) 1 011 if(N==4) y(n)=xor(buf(3), buf(4)); end % N=4 oct(23) 10 011 if(N==5) y(n)=xor(buf(3), buf(5)); end % N=5 oct(45) 100 101 if(N==9) y(n)=xor(buf(5), buf(9)); end % N=9 oct(1021) 1 000 010 001 if(N==12) y(n)=xor(buf(6), xor(buf(8), xor(buf(11), buf(12)))); end % N=12 oct(10123) 1 000 001 010 011 buf = [ y(n) buf(1:N-1) ]; end figure; subplot(211); stem(y,’bo’); title(’y(n)’) subplot(212); stem(-L+1:L-1,xcorr(y-mean(y))); grid; title(’Ryy(k)’); axis tight; pause Problem 13.5 ((L)** Generowanie sekwencji ml-PRBS). Uzupełnij program 13.5: sprawdź poprawność danych z tabeli 13.4, które nie zostały uwzgl˛ednione w programie (czyli pozostałe wartości N). Tabela 13.4: Pozycje odczepów w buforze przesuwnym z rysunku 13.3, służacym ˛ do generacji sekwencji ml-PRBS N Odczepy zapisane octalnie Odczepy zapisane binarnie 2 3 4 5 6 7 8 9 10 11 12 7 13 23 45 103 211 435 1021 2011 4005 10123 111 1011 10011 100101 (x3 , x5 ) zrób to sam zrób to sam zrób to sam 1000010001 zrób to sam zrób to sam 1000001010011 13.5 Przykłady zastosowań sekwencji PRBS w teleinformatyce Poniżej krótko scharakteryzowano wybrane zastosowania generatorów liczb losowych w telekomunikacji. Uogólniajac: ˛ współczesna telekomunikacja cyfrowa nie istniałaby bez możliwości generowania i wysyłania sekwencji PRBS przez nadajniki oraz bez ich odbierania i analizy przez odbiorniki, z wykorzystywaniem do: • do synchronizacji odbiorników, • do estymacji wpływu kanału na transmitowane dane oraz korekcji otrzymanych danych Modemy ADSL (Asynchronous Digital Subscriber Line). Sekwencja C-REVERB, stosowana do synchronizacji i estymacji kanału transmisji przewodowej, telefonicznej lub kablowej, jest generowana według nast˛epujacego wzoru (wygeneruja˛ ja,˛ sprawdź jej okresowość): 13.5 Przykłady zastosowań sekwencji PRBS w teleinformatyce b[n] = 1 dla n = 1...9, 267 b[n] = b[n − 4] XOR b[n − 9], dla n = 10...512. (13.4) GPS. Każdy satelita ma przypisana˛ sobie jedna˛ z 36 różnych, wzajemnie ortogonalnych 1023-bitowych (0/1) sekwencji PRBS Golda, nazywanych C/A (coarse acquisition). Sekwencje te sa˛ nadawane z cz˛estotliwościa˛ 1023 kHz. Odbiornik koreluje odebrany sygnał ze znanymi, możliwymi sekwencjami, oraz oblicza wzajemne opóźnienia sygnałów z poszczegolnych satelitów. Znajac ˛ te opóźnienia, jest w stanie wyliczyć własne położenie w stosunku do satelit z dokładnościa˛ do 300 metrów, stosujac ˛ zasad˛e trangulacji, wywodzac ˛ a˛ si˛e z geodezji. DAB, DVB-T, DVB-T2. Sygnał pilota, wykorzystywany do synchronizacji odbiornika oraz estymacji wpływu kanału transmisji, jest modulowany sekwencja˛ PRBS, która w radiu cyfrowym DAB+ nazywa si˛e Phase Reference Symbol. PR stanowi 1536 par losowych liczb o wartościach 1 oraz -1, definiujacych ˛ w dziedzinie cz˛estotliwości jeden z czterech stanów 1536 sygnałów nośnych, czyli ich amplitud˛e i przesuni˛ecie fazowe, tzw. modulacji 4-QAM. Dodatkowo w radiu cyfrowym DAB+ stosuje si˛e sekwencj˛e PRBS do rozpraszania widma cz˛estostliwościowego przesyłanych bitów (poprzez pomnożenie ich przez PRBS w nadajniku i ponownie w odbiorniku). W tym konkretnym przypadku stosuje si˛e schemat generacji przedstawiony na rysunku 13.4. Problem 13.6 (* Generowanie sekwencji PRBS w radiu DAB). Napisz program, implementujacy ˛ układ/algorytm przedstawiony na rysunku 13.4, który służy do rozpraszania widma cz˛estotliwościowego danych przesyłanych w radiu DAB. Telefonia cyfrowa. Tutaj sytuacja jest nast˛epujaca (tylko wybrane przykłady); • 3G GSM wykorzystuje 26-bitowa˛ sekwencj˛e PRBS do estymacji kanału przesyłu. • CDMA wykorzystuje sekwencje PRBS do rozpraszania widma sygnału, nadawanego do konkretnego użytkowika (poprzez pomnożenie sekwnecji PRBS i nadawanej). W odbiorniku cyfrowym informacja przeznaczona dla danego odbiorcy musi być ponownie pomnożona (skorelowana) ze znana˛ sekwencja˛ rozpraszajac ˛ a˛ [4]. • 4G LTE stosuje sekwencje Zadoff-Chu jako PSS (Primary Synchronization Sequences), a sekwencje ml-PRBS jako SSS (Secondary Synchronization Sequences). • 5G New Radio jako sygnałów PSS i SSS używa wyłacznie ˛ sekwencji ml-PRBS. Rysunek 13.4: Schemat generacji sekwencji PRBS w radiu cyfrowym DAB+. 268 13 Generowanie liczb pseudolosowych i metody Monte Carlo 13.6 Metody Monte Carlo Charakterystyka. W analizie Monte Carlo: • losowo generuje si˛e wartości wielkości "wejściowych", np. badanego modelu transmisji, • oblicza si˛e wartości parametrów statystycznych otrzymanych wielkości "wyjściowych". Jest to alternatywa dla teoretycznych metod analizy systemów. Kiedyś metodami Monte Carlo nazywano pobieranie próby wartości z rzeczywiście wykonywanych eksperymentów (np. wyznaczanie liczby π metoda˛ rzucania kulek w prostokat ˛ opisany na kole). Obecnie eksperymenty przeprowadza si˛e na metoda˛ symulacji numerycznej. Metod˛e Monte Carlo, mi˛edzy innymi, stosuj˛e si˛e w: • badaniach fizyki czastek, ˛ • analizie systemów kolejkowych (sieci: kolejowe, telekomunikacyjne, komputerowe - serwery), • analizie własności algorytmów, wykorzystywanych do przetwarzania danych zakłóconych, • algorytmach numerycznych (optymalizacji - poszukiwaniu minimum globalnego, całkowaniu wielowymiarowym – [3] str. 304, w szczególności adaptacyjnym str. 316) Metoda Monte Carlo to metoda zast˛epcza, która jest stosowana wtedy, kiedy nie potrafimy ściśle opisać problemu lub nie posiadamy narz˛edzi do jego rozwiazania ˛ analitycznego. Wiele problemów zostało najpierw rozwiazanych ˛ metoda˛ Monte Carlo, a dopiero później analitycznie. Stosuje si˛e ja˛ także w nauce i technice do testowania hipotez. Przykładowo, stop˛e bł˛edów transmisji (BER - Bit Error Rate) można łatwo oszacować symulujac ˛ transmisj˛e z dodawanymi zakłóceniami (pseudolosowymi), udajacymi ˛ szumy w kanale transmisyjnym. Problem 13.7 (* Wyznaczenie wartości liczby π metoda˛ losowa). ˛ Załóżmy, że strzelamy z równomiernym rozrzutem do okragłej ˛ tarczy o promieniu r, wpisanej w kwadrat o boku 2r, patrz rysunek 13.5. Ponieważ stosunek pola koła do pola kwadratu jest równy: s= πr2 π = (2r)2 4 ⇒ π = 4s, (13.5) dlatego należy si˛e spodziewać, że stosunek liczby strzałów trafionych we wn˛etrze koła do wszystkich oddanych strzałów przybliża wartość π4 . Tym lepiej im wi˛ecej strzłów si˛e odda. Aby osiagn ˛ ać ˛ dokładność do 16-stu miejsc po przecinku należy strzelić 1016 razy (1 podzielone przez liczb˛e prób). Listing 13.6 prezentuje program, w którym przeprowadzone sa˛ stosowne obliczenia. Dlaczego otrzymane wyniki nie sa˛ satysfakcjonujace? ˛ Zastosuj inne, własne funkcje generatorów liczb losowych. 13.6 Metody Monte Carlo 269 Rysunek 13.5 Ilustracja graficzna wyznaczania wartości liczby π metoda˛ strzelania do okragłej ˛ tarczy wpisanej w kwadrat. Listing 13.6: Program do obliczenia wartości liczby π metoda˛ strzelania do okragłej ˛ tarczy wpisanej w kwadrat % oblicz_pi.m clear all; close all; format long; N = 100000; Nk = 0; for i = 1 : N x = rand(1,1)*2.0 - 1.0; y = rand(1,1)*2.0 - 1.0; if( sqrt( x*x + y*y ) <= 1.0) Nk = Nk + 1; end end pi, mypi = 4.0 * Nk / N, % liczba strzalow % liczba trafien w kolo % PETLA: kolejne strzaly % # kwadrat o boku 2 %# % kolo o promieniu 1 % zwieksz liczbe trafien o 1 % % % dokladne pi % obliczone pi xy = 2*rand(N,2)-1.0; Nk = numel( find( sqrt(xy(:,1).^2 + xy(:,2).^2) <= 1 ) ); mypi = 4.0 * Nk / N, % obliczone pi Zastosowanie #1: Testowanie właściwości estymatorów. Załóżmy, że mamy trudno dost˛epne dane pochodzace z z bardzo drogiego eksperymentu i chcemy wyliczyć interesujac ˛ a˛ nas wielkość. Załóżmy także, że w konkretnym przypadku istnieje kilka metod obliczeniowych i nie wiemy, która˛ z nich wybrać. Co zrobimy? Wygenerujemy wiele danych o znanych parametrach, zastosujemy każda˛ z metod, obliczymy estymaty szukanych wartości, a nast˛epnie ich wartości średnie oraz wariancje (rozrzut wokół średniej). Estymator (metoda obliczeniowa) nie powinien być obciażony, ˛ tzn. wartość średnia z wielu pomiarów powinna pokrywać si˛e z wartościa˛ poprawna,˛ a nie być przesunieta wzgl˛edem niej. Równocześnie estymator powinien charakteryzować si˛e małym rozrzutem wokół wartości średniej. Problem 13.8 (* Testowanie estymatorów wartości skutecznej napi˛ecia sieci elektrycznej). Wartość skuteczna zbioru wartości xn , n = 1, 2...N jest ogólnie zdefiniowana w sposób nast˛epujacy: ˛ s √ 1 N 2 (1) xsk = Px = (13.6) ∑ xk . N n=1 jako pierwiatek kwadratowy z mocy Px “sygnału” x, czyli sumy kwadratów jego próbek xn , podzielonych przez ich liczb˛e. W przypadku próbek sinusoidy o amplitudzie A można zastosować inny estymator wartości skutecznej: 270 13 Generowanie liczb pseudolosowych i metody Monte Carlo A 1 (2) xsk = √ = √ max |xn | , (13.7) 2 2 n=1...N czyli estymat˛e jej amplitudy podzielonej przez pierwiastek z dwóch. W programie 13.7 obie metody sa˛ porównane. Generuje si˛ew nim w przybli żeniu jeden okres, około Nx = 100 próbek sinusoidy xn = Ax sin 2π ffxs n + ϕx o cz˛estotliwości fx = 50 Hz, próbkowanej z cz˛estotliwościa˛ f pr = Nx · fx = 5000 herców, o nast˛epuja˛ cych wartościach parametrów: √ • amplitudzie Ax = 2 · 230 woltów, • losowej cz˛estotliwości fx [Hz], opisanej rozkładem normalnym (średnia f¯x = 50 Hz, odchylenie standardowe σ fx = 31 Hz), • losowym przesuni˛eciu fazowym ϕx , opisanym rozkładem równomiernym [0, 2π] radianów. W programie 13.7 zaimplementowano oba estymatory w j˛ezyku Matlab i przestowano. Na rysunku 13.6 pokazano histogram otrzymanych wartości skutecznych dla obu estymatorów: poprawna wartość to 230 woltów. Jak widać, w przypadku stosunku sygnału do szumu SNR=60 decybeli (górny wykres) drugi estymator ma zdecydowanie mniejsza˛ wariancj˛e, ale jest obciażony, ˛ tzn. jego wartość średnia jest różna od 230. Dla SNR=0 decybeli (dolny wykres) drugi estymator zwi˛eksza swoja˛ wariancj˛e i zmienia obcia˛żenie z ujemnego na dodatnie, co nie dziwi. Listing 13.7: Program do testowania dwóch estymatorów wartości skutecznej sygnału napiecia sieci elektrycznej/zasilajacej ˛ - sinusoidy o cz˛estotliwości w przybliżeniu równej 50 herców % oblicz_skut.m - obliczanie wartosci skutecznej snusoidy clear all; close all; Ax = sqrt(2)*230; fx = 50; % nominalna amplituda i czestotliwosc sygnalu Nx = 100; n = 0:Nx-1; % liczba probek, indeksy probek fpr = Nx * fx; % czest. probkowania 100x wieksza, ~100 probek/okres for iter = 1 : 10000 x = Ax*sin( 2*pi*(fx+1/3*randn())/(Nx*fx)*n + rand()*2*pi ); %sygnal x = awgn( x, 60 ); % SNR = 0, 20, 40, 60 dB xsk1(iter) = sqrt( sum(x.^2) / Nx ); % estymator #1 xsk2(iter) = max( abs(x) ) / sqrt(2); % estymator #2 end subplot(211); hist(xsk1,30); grid; xlabel(’xsk1’); title(’hist( xsk1 )’); subplot(212); hist(xsk2,30); grid; xlabel(’xsk2’); title(’hist( xsk2 )’); 13.6 Metody Monte Carlo 271 hist( xsk1 ) 4000 3000 2000 1000 0 228 228.5 229 229.5 230 230.5 231 231.5 232 230.5 231 231.5 232 230.5 231 231.5 232 230.5 231 231.5 232 xsk1 hist( xsk2 ) 4000 3000 2000 1000 0 228 228.5 229 229.5 230 xsk2 hist( xsk1 ) 4000 3000 2000 1000 0 228 228.5 229 229.5 230 xsk1 hist( xsk2 ) 4000 3000 2000 1000 0 228 228.5 229 229.5 230 xsk2 Rysunek 13.6: Histogramy obliczonych wartości skutecznych sygnału napi˛ecia sieci elektrycznej dla dwóch estymatorów, zaimplementowanych w programie 13.7 (powino być 230 woltów). Powyżej dla stosunku sygnału do szumu SNR=60 dB, poniżej dla SNR=0 dB. Zastosowanie #2: Algorytmy minimalizacji globalnej. Przy okazji omawiana metod minimalizacji funkcji poruszyliśmy problem posiadania przez funkcj˛e wielu minimum lokalnych, które przeszkadzaja˛ podczas poszukiwania minimum globalnego. Sytuacja taka jest przedstawiona na rysunku 13.7. Typowym rozwiazaniem ˛ jest zastosowanie w takim przypadku algorytmu Metropolisa metody Simulated Annealing, patrz [3]. Jednak możliwe jest także prostsze rozwiazanie ˛ o nazwie MCARLO: poszukiwanie minimum z zaburzeniem losowym, czyli siłowe pokrywanie punktami prób- 272 13 Generowanie liczb pseudolosowych i metody Monte Carlo nymi obszaru poszukiwania z iteracyjnym zaw˛eżaniem obszaru szukania. Listing 13.8 prezentuje fragment kodu Matlaba tej metody. GlobalSearch and MultiStart Results 3 Single Run Result 2 Global Max 1 0 -1 Intensity Bound GlobalSearch MultiStart -2 -3 -1 -0.5 0 0.5 1 1.5 2 2.5 3 3.5 Rysunek 13.7: Przykład funkcji z wieloma minimami lokalnymi, dla której można użyć metody Monte Carlo do siłowego, losowego przeszukiwania całej dziedziny zmienności argumentów funkcji oraz jej systematycznego zaweżania. Listing 13.8: Fragment kodu Matlaba metody MCARLO rand(’seed’,sum(100*clock)); % Monte Carlo Search over entire variable parameter space for INUM = 1:MAXFUN % Main Loop for i = 1:nvars % Loop over variables IsInBounds = 0; while ~IsInBounds % Choose new parameter’s value in bounds XPLS = 2.0*(rand-0.5); % Random value in (-1,1) XPLS = XPLS * (MAXFUN-NFCN)/MAXFUN; % Resize random interval if ~isinf(VUB(i)) & ~isinf(VLB(i)), range = VUB(i)-VLB(i); else range = 1; end x(i) = AMID(i) + XPLS * WERR(i) * range; if x(i) <= VUB(i) & x(i) >= VLB(i), IsInBounds = 1; end end Literatura 273 end F = eval(evalstr); NFCN = NFCN + 1; if F < AMIN, AMIN = F; AMID = x; end end x = AMID; % Search finished. Set x to best values 13.7 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. 1. Liczby pseudolosowe sa˛ używane do wprowadzania elementu chaosu do obliczeń (przetwarzania danych), np. w celu: • utrudnienia interpretacji danych (kryptografia, rozpraszanie widma sygnału (spreading functions)), • selektywności odbioru transmisji (systemy: Code-Division Multiple Access CDMA, Global Positioning System GPS), • generowanie sygnałów o szerokim widmie cz˛estotliwościowym oraz małym samo-podobieństwie: bardzo niskiej korelacji własnej i wzajemnej (sygnały: radarowe - łatwa detekcji sygnałów odbitych od poruszajacych ˛ si˛e obiektów, telekomunikacyjne - do synchronizacji czasowej i cz˛estotliwościowej odbiorników, do identyfikacji właściwości cz˛estotliwościowych kanału transmisji oraz ich korekty), • analizy propagacji zaburzeń (analiza numeryczna, testowanie rozwiazań ˛ metodami Monte Carlo). 2. W implementacjach programowych najcz˛eściej sa˛ stosowane liniowe generatory kongruentne LCG (Linear Congruential Generator), 3. W zastosowaniach dotyczacych ˛ bezpieczeństwa, w szczególności kryptografii, korzysta si˛e z naturalnych źródeł losowości/entropii. 4. Metody Monte Carlo sa˛ prosta˛ alternatywa˛ dla skomplikowanych, teoretycznych metod analizy zachowania si˛e systemów technicznych w warunkach wyst˛epowania zakłóceń/zaburzeń. Literatura 1. K. Godfrey (Ed.), Perturbation Signals for System Identification. Prentice-Hall 1993. 2. C. Moler: “Random Numbers”, in Numerical Computing with Matlab, on-line: https:// www. mathworks.com/ moler/ chapters.html.html 3. W.H. Press, S.A. Teukolsky, W.T. Vetterling, B.P. Flannery, Numerical Recipes in C: The Art of Scientific Computing. Rozdz. "Random Numbers". Cambridge University Press, 1992. 4. R. Rao, S. Dianat, Basics of Code Division Multiple Access (CDMA). Spie Press, 2005. 5. T. Twardowski, Techniki obliczeniowe w nauce i technice. Materiały do wykładu, AGH-WIET, Kraków 2015. 6. R. Wieczorkowski, R. Zieliński, Generatory liczb losowych. Wydawnictwa NaukowoTechniczne WNT, Warszawa 1997. Rozdział 14 Obliczanie wartości funkcji standardowych Streszczenie Algorytmy wyznaczania wartości funkcji standardowych: sin(), cos(), exp(), ln(), log2(), log10(). 14.1 Wprowadzenie Kiedy musimy implementować funkcje standardowe? Kiedy coś jest produkowane i sprzedawane w dziesiatkach ˛ tysi˛ecy sztuk, to każda przysłowiowa złotówka ma znaczenie. W takim przypadku, rozpatrujac ˛ możliwe oszcz˛edności, cz˛esto wybiera si˛e tańsza˛ architektur˛e obliczeniowa,˛ posiadajac ˛ a˛ mniej pami˛eci podr˛ecznej i słabszy procesor, najcz˛eściej bez ko-procesora zmienno-przecinkowego. Wówczas wszystkie funkcje arytmetyczne sa˛ realizowane w sposób programowy i trzeba bardzo si˛e starać, aby pogodzić sprzeczne wymagania: niskie koszty oraz szybkość+dokładność. Wi˛ekszość środowisk programowych udost˛epnia zestaw standardowych (elementarnych) funkcji matematycznych. W j˛ezykach kompilowanych jest to biblioteka typu MATH. Jednak: • sa˛ środowiska programowe bez standardowych funkcji matematycznych (układy FPGA, niektóre tanie kontrolery 8/16-to bitowe), • konkretne aplikacje maja˛ cz˛esto przeciwstawne wymagania, dotyczace ˛ małej zaj˛etości pami˛eci lub dużej szybkości obliczeń, a dost˛epne funkcje biblioteczne sa˛ najcz˛eściej optymalizowane według jednego kryterium, • jeśli mamy uproszczone wymagania wzgl˛edem uniwersalnej implementacji funkcji, która oferuje wynik z dokładnościa˛ na poziomie bł˛edu reprezentacji komputerowej liczb (np. dotyczace ˛ ograniczonego zakresu argumentu lub dokładności), to możemy zaoszcz˛edzić pami˛eć lub obcia˛żenie procesora, tworzac ˛ alternatywna˛ implementacj˛e funkcji samodzielnie. Przykład - programowa zmiana cz˛estotliwości sygnałów w telekomunikacji. Jedna˛ z podstawowych operacji we współczesnej telekomunkacji bezprzewodowej jest mikser cz˛estotliwości: układ służacy ˛ do konwersji serwisów danych analogowych x(t) i cyfrowych x(n) z zakresu niskich cz˛estotliwości na zakresy wysokich cz˛estotliwości (MHz, GHz) i z powrotem: UP: fc xup (n) = x(n) · e+ j2π fs n , DOWN: xdown (n) = xup (n) · e Xup ( f ) = X( f − fc ), − j2π ffcs n , (14.1) Xdown ( f ) = Xup ( f + fc ) = X( f ). (14.2) Jak widać do modyfikacji kolejnych próbek czasowych sygnału nadawanego x(n) wystarczy generować wartości funkcji exp(± j · n · ∆ φ ) = cos(n · ∆ φ ) ± j sin(n · ∆ φ ) z przyrostem argumentu o ∆ φ = 2π ffcs , gdzie: – fc - docelowa, wysoka cz˛estotliwość nośna (carrier) danego serwisu, – fs - cz˛estotliwość próbkowania (sampling) danego serwisu, W tym przypadku nie jest potrzebna ogólna (kosztowna) implementacja tych funkcji. 275 276 14 Obliczanie wartości funkcji standardowych 14.2 Generatory funkcji sinus Tablica LUT (look-up table) i interpolacja liniowa. Wartości dowolnej funkcji y = f (x) można dostatecznie gesto stablicować dla interesujacego ˛ nas zakresu wartości argumentu x, tzn. obliczyć zbiór par [...(xk−1 , yk−1 ), (xk , yk ), (xk+1 , yk+1 ), ...], a nast˛epnie obliczać wartość y dla dolnej wartości x (np. leżac ˛ a˛ pomi˛edzy xk i xk+1 : x ∈ [xk , xk+1 )) metoda˛ lokalnej interpolacji, np. z użyciem wielomianów Lagrange’a (patrz wykład o interpolacji). W przypadku funkcji y = sin(x) obliczamy wartości y dla x ∈ [0, 2π], czyli dla jednego okresu funkcji sin() (albo oszcz˛edniej tylko dla jednej czwartej okresu x ∈ [0, π2 ]). W najprostszym przypadku znajdujemy najbliższa˛ wartość xk z tablicy i zwiazan ˛ a˛ z nia˛ wartość yk (interpolacja zerowego rzadu, ˛ powtórzenie wartości), ale możemy użyć interpolacji pierwszego rz˛edu (liniowej) albo wyższego rz˛edu do dokładniejszego wyznaczenia wartości funkcji pomi˛edzy zapami˛etanymi w˛ezłami. Dla efektywności algorytmu decydujace ˛ jest umiej˛etne mapowanie kata ˛ na argument stablicowanej funkcji oraz odpowiedni wybór typu wartości (int, float) dla wartości argumentu i samej funkcji. Konkretny przykład obliczania wartości funkcji trygonometrycznych w j˛ezyku C za pomoca˛ metody LUT jest zaprezentowany w listingu 14.1 [6]. Z kolei program 14.2 demonstruje ide˛e metody w j˛ezyku Matlab. Listing 14.1: Implementacja w j˛ezyku C algorytmu look-up-table dla obliczania funkcji trygonometrycznych /* Pobrane ze strony: https://jfdube.wordpress.com/2011/12/06/trigonometric-look-uptables-revisited/ */ template<tU32 SinTableSize>; struct TrigLookup { tFloat SinTable[SinTableSize]; TrigLookup() { CHECK(IsPowerOfTwo(SinTableSize)); for(tU32 i=0; i<SinTableSize; i++) { SinTable[i] = sin(((tFloat)i / SinTableSize) * Pi2); } } FORCEINLINE tFloat Lookup(tU16 Value) { const tU32 Divisor = (65536 / SinTableSize); const tU32 Index = Value / Divisor; const tFloat LUTSinA = SinTable[Index & (SinTableSize - 1)]; const tFloat LUTSinB = SinTable[(Index + 1) & (SinTableSize - 1)]; const tFloat LUTSinW = (Value & (Divisor - 1)) / (tFloat)Divisor; return LUTSinW * (LUTSinB - LUTSinA) + LUTSinA; } FORCEINLINE tFloat Sin(tU16 Value) { return Lookup(Value); /* SIN - pierwsza cwiartka */ } FORCEINLINE tFloat Cos(tU16 Value) { return Lookup(Value + 16384); /* COS - druga cwiartka */ } FORCEINLINE tFloat Tan(tU16 Value) { return Lookup(Value) / Lookup(Value + 16384); /* TAN - pierwsza / druga */ } }; 14.2 Generatory funkcji sinus 277 Listing 14.2: Proste wyznaczanie funkcji sinus metoda˛ look-up-table w j˛ezyku Matlab % Generowanie sinusoidy metoda LUT (look-up table) clear all; close all; M = 100; dx = (pi/2)/M; x = 0 : dx : pi/2; stab = sin( x ); % krok dyskretyzacji x w tablicy % dyskretyzacja x: xk = x0 + k*dx % tablica sinusa yk=sin(xk) dla zadanych wartosci xk xx = 1/2*(pi/2)/M : (pi/2)/(M-1) : pi/2; s = stab( 1 + round( xx / dx ) ); figure; plot(x,stab,’ro-’,xx,s,’bx-’); grid; pause % xx to inne wartosci argumentow funkcji % pobieramy najblizsze wartosci w tablicy % porownujemy Problem 14.1 (* Testowanie generowania funkcji sinus metoda˛ LUT). Przeanalizuj kod funkcji z listingu 14.1. Napisz program w j˛ezyku C do ich przetestowania. W razie konieczności, dokonaj wymaganych zmian. Alternatywnie przepisz kod wszystkich funkcji na j˛ezyk Matlab i zweryfikuj ich poprawność. Jeśli dalej nie jesteś przekonany do atrakcyjności tego zadania, to dodaj inne funkcje trygonometryczne oraz interpolacj˛e mi˛edzyw˛ezłowa˛ do programu Matlaba z listingu 14.2. Rozwini˛ecie w szereg Taylora. Funkcje sin(x) oraz cos(x) można rozwiać ˛ w otoczeniu x = 0 w szereg Taylora: 1 3 1 5 1 7 x + x − x + ... 3! 5! 7! 1 2 1 4 1 6 cos(x) = x − x + x − x + ... 2! 4! 6! sin(x) = x − (14.3) (14.4) Aproksymacja Pade funkcja˛ wymierna.˛ Obie funkcje można także przedstawić jako iloraz dwóch wielomianów: sin(x) = x(60 − 7x2 ) , (60 + 3x2 ) (14.5) cos(x) = 12 − 5x2 . 12 + x2 (14.6) Problem 14.2 ((L)* Generowanie funkcji sinus i cosinus za pomoca˛ szeregu Taylora i aproksymacji Pade). Napisz program w j˛ezyku Matlab, obliczajacy ˛ wartości funkcji sin() oraz cos() za pomoca˛ wzorów aproksymacyjnych (14.3)-(14.6) dla wartości kata ˛ w przedziale [0, π2 ]. Na rysunku sprawdź jakość aproksymacji: 1) nałóż na siebie funkcj˛e idealna˛ i obie aproksymujace, ˛ 2) odejmij od siebie funkcj˛e idealna˛ i aproksymujac ˛ a˛ w obu przypadkach, dla wszystkich wartości x z badanego zakresu. Która aproksymacja zapewnia mniejszy bład? ˛ Jak bład ˛ zależy od rz˛edu użytego szerego Taylora? Skorzystaj z programu 14.3. ‘ Listing 14.3: Wyznaczanie wartości funkcji sinus/kosinus z szeregu Taylora oraz aproksymacji Pade 278 14 Obliczanie wartości funkcji standardowych % Sin/Cos z rozwiniecia Taylora oraz z aproksymacji Pade clear all; close all; x = 0 : (pi/2)/1000 : pi/2; sref = sin( x ); cref = cos( x ); % Taylor s = x - x.^3/prod(1:3) + x.^5/prod(1:5) - x.^7/prod(1:7); c = 1 - x.^2/prod(1:2) + x.^4/prod(1:4) - x.^6/prod(1:6); figure; plot(x,sref,’r’,x,s,’b’); grid; pause figure; plot(x,cref,’r’,x,c,’b’); grid; pause % Pade s = x.*(60-7*x.^2) ./ (60+3*x.^2); c= (12-5*x.^2) ./ (12+x.^2); figure; plot(x,sref,’r’,x,s,’b’); grid; pause figure; plot(x,cref,’r’,x,c,’b’); grid; pause Metoda iteracyjna/rekursywna. Załóżmy, że: xn = x0 + n · ∆ x. (14.7) gdzie x0 jest poczatkow ˛ a˛ wartościa˛ argumentu, a ∆ x — jego przyrostem. Wówczas wartości funkcji: yn = sin(xn ), n = 0, 1, 2, ... (14.8) można obliczyć w sposób iteracyjny (rekursywny): yn = ayn−1 − yn−2 , (14.9) gdzie a = 2 cos(∆ x), y−1 = sin(x0 − ∆ x), y−2 = sin(x0 − 2∆ x). (14.10) Jak wynika z równania (14.9), wyliczenie kolejnej wartości yn = sin(xn ) wymaga tylko wykonania jednego mnożenia i jednego dodawania (a dokładniej: odejmowania). Jednak zmiana wartości x0 lub ∆ x wymusza ponowne uruchomienia generatora z innymi wartościami startowymi. Dla małych wartości ∆ x schemat generacji jest bardzo wrażliwy na dokładność reprezentacji komputerowej mnożnika a. Stabilniejsza numerycznie wersja oscylotora programowego (14.9) ma nast˛epujac ˛ a˛ postać (tzw. magic circle, n = 1, 2, 3, ..., przy założeniu x0 = 0): un = un−1 + bvn−1 , (14.11) vn = vn−1 − un , (14.12) gdzie: ∆x , 2 ∆x u0 = cos , 2 b = 2 sin v0 = 0. (14.13) (14.14) (14.15) (14.16) 14.2 Generatory funkcji sinus 279 W tym przypadku otrzymujemy z generatora nast˛epujace ˛ sygnały wyjściowe (n = 0, 1, 2, ...): u(n) = cos((n − 0.5) ∗ ∆ x), (14.17) v(n) = sin(n ∗ ∆ x). (14.18) Jeśli jest potrzeba jednoczesnego wygenerowania funkcji v(x) = sin(x) oraz u(x) = cos(x) dla tej samej wartości kata, ˛ czyli w kwadraturze, to generator (14.11)-(14.15) tego nie zapewnia. Wówczas można zastosować nast˛epujace ˛ równania [8] (n = 1, 2, 3, ...): wn−1 = un−1 + k1 vn−1 , (14.19) vn = vn−1 + k2 wn−1 , (14.20) un = wn−1 − k1 vn , (14.21) gdzie: ∆x , k1 = tan 2 k2 = sin(∆ x), u0 = 1, v0 = 0. (14.22) Problem 14.3 ((L)* Generowanie funkcji sinus/cosinus metoda˛ iteracyjna). ˛ Zapoznaj si˛e z programem 14.4. Dodaj do niego implementacj˛e ostatniej metody (14.19)(14.22), zaproponowanej w artykule [8]. Wybierz dodatkowo jeden z innych algorytmów, opisanych w [8], i także napisz dla niego program. Listing 14.4: Wyznaczanie wartości funkcji sinus/kosinus metoda˛ iteracyjna˛ % Sin/Cos iteracynie/rekursywnie clear all; close all; % Wartosci parametrow x0 = 0; % 0, pi/4; dx = pi/10; N = 100; % Odniesienie n = 0:N-1; x = x0 + n*dx; y1 = sin( x ); % Metoda iteracyjna #1 y(1) = sin( x0 - 2*dx ); y(2) = sin( x0 - dx ); a = 2*cos(dx); for n = 3 : N+2 y(n) = a*y(n-1) - y(n-2); end y2 = y(3:end); figure; plot(x,y1,’ro-’,x,y2,’go-’); grid; title(’y=sin(x)’) legend(’Sinus’,’Rekursywnie’); pause % Metoda iteracyjna #2 u(1) = cos( dx/2 ); v(1) = 0; b = 2*sin( dx/2 ); for n = 2 : N 280 14 Obliczanie wartości funkcji standardowych u(n) = u(n-1) - b*v(n-1); v(n) = v(n-1) + b*u(n); end y3a = u(1:end); y3b = v(1:end); figure; plot(x,y1,’r’,x,y3a,’go-’,x,y3b,’bo-’); grid; title(’y=sin(x)’) legend(’Sinus’,’Magic u’,’Magic v’); pause Rotacja wektora zespolonego. W cyfrowej telekomunikacji bezprzewodowej sygnał generuje si˛e w nadajniku w tzw. paśmie podstawowym (wokół cz˛estotliwości 0 herców), a nast˛epnie przesuwa si˛e go do docelowej cz˛estotliwości nośnej fc (po angielsku carrier), np. 100 MHz albo 1 GHz, a w odbiorniku — z powrotem do pasma podstawowego. Konwersja cz˛estotliwości sygnału s(n) do góry jest wykonana poprzez jego pomnożenie z sygnałem zespolonym nośnej c(n) (n oznacza numer liczby/próbki): sup (n) = s(n)c(n), (14.23) natomiast konwersja cz˛estotliwości do-dołu — poprzez pomnożenie ze sprz˛eżeniem zespolonym (zanegowanie cz˛eści urojonej) nośnej c∗ (n): sdown (n) = sup (n)c∗ (n), (14.24) Ponieważ zespolony sygnał nośnej dany jest równaniem ( fc - cz˛estotliwość nośnej (carrier), fs - cz˛estotliwość próbkowania (sampling), n - numer liczby/próbki): 2π fc 2π fc 2π fc + j sin n = e jn fs , c(n) = cos n fs fs (14.25) sekwencja operacji (14.23)(14.24) daje ponownie w wyniku sygnał s(n): sdown (n) = sup (n) · c∗ (n) = [s(n)c(n)] · c∗ (n) = s(n). (14.26) gdyż katy ˛ zespolonej nośnej i jej sprz˛eżenia odejmuja˛ si˛e, dajac ˛ w wyniku 0, a dla kata ˛ zerowego otrzymujemy e j0 = 1. Liczba zespolona c(n) (14.25) może być otrzymana poprzez obrót liczby poprzedniej c(n − 1) o zadany kat ˛ φ: c(n) = e jn 2π fc fs = e j(n−1) 2π fc fs fc · e j2π fs = c(n − 1) · e jφ , (14.27) fc . fs (14.28) gdzie φ = 2π Przyjmujac ˛ nasze poprzednie oznaczenia y(n · ∆ x) = c(n · ∆ x), ∆ x = 2π ffcs , otrzymujemy nast˛epujacy ˛ wzór na jednoczesna˛ generacj˛e funkcji sinus i kosinus metoda˛ obrotu liczby zespolonej (rotacji wektora dwu-elementowego na płaszczyźnie): cos(n · ∆ x) y (n · ∆ x) cos(∆ x) − sin(∆ x) yre ((n − 1) · ∆ x) = re = (14.29) sin(n · ∆ x) yim (n · ∆ x) sin(∆ x) cos(∆ x) yim ((n − 1) · ∆ x) Wyznaczenie nowej próbki zespolonej (jednocześnie wartości sin() i cos()) to koszt czterech operacji mnożenia i dwóch operacji dodawania. Ograniczeniem jest konieczność wcześniejszego przygotowania macierzy rotacji dla zadanego kata ˛ ∆ x (czyli obliczenie wartości elementów wektora [cos(∆ x), sin(∆ x)]) oraz konieczność przeliczenia wartości elementów tej macierzy przy zmianie kata. ˛ 14.2 Generatory funkcji sinus 281 Problem 14.4 (* Jednoczesne generowanie funkcji sinus oraz cosinus metoda˛ rotacji wektora zespolonego). Zapoznaj si˛e z programem 14.5. Porównaj jej dokładność/stabilność z metoda˛ iteracyjna˛ opisana˛ równaniami (14.19)-(14.22) - w tym celu zaimplementuj t˛e metod˛e. Listing 14.5: Wyznaczanie wartości funkcji sinus oraz kosinus metoda˛ rotacji wektora zespolonego % Rotacja zespolona clear all; close all; % Parametry dx = 2*pi*1000/44100; % dx = phi = 2*pi*f0/fpr = 2*pi / (fpr/f0) N = 100; % Odniesienie n = 0:N-1; y1 = exp( j*n*dx ); % Sekwencja rotacji y2re(1) = cos(dx*0); y2im(1) = sin(dx*0); R = [ cos(dx) -sin(dx); ... sin(dx) cos(dx) ]; for n = 2 : N rot = R * [ y2re(n-1); y2im(n-1) ]; y2re(n) = rot(1,1); y2im(n) = rot(2,1); end figure; n = 0:N-1; subplot(211); plot(n,real(y1),’r-’,n,y2re,’b-’); grid; title(’cos()’); subplot(212); plot(n,imag(y1),’r-’,n,y2im,’b-’); grid; title(’sin()’); pause Algorytm CORDIC. W przypadku obliczania ciagu kolejnych wartości funkcji sinus i kosinus na sprz˛ecie komputerowym, dla którego koszt obliczeniowy operacji mnożenia jest wysoki w porównaniu z kosztem dodawania i przesuwania bitów (np. mikrokontrolery, układy FPGA - Field Programmable Gate Arrays), warto jest stosować algorytm CORDIC (Co-ordinate Rotation Digital Computer). W tym celu równanie rotacji (14.29) zapisuje si˛e w nast˛epujacej ˛ postaci: yre (n) cos(∆ x) − sin(∆ x) yre (n − 1) = = yim (n) sin(∆ x) cos(∆ x) yim (n − 1) 1 − tan(∆ x) yre (n − 1) cos(∆ x) (14.30) tan(∆ x) 1 yim (n − 1) Uproszczenie obliczeń uzyskamy, jeśli obrót o kat ˛ ∆ x (w granicach 0, π2 ) sprowadzimy do serii N obrotów o mniejsze katy ˛ spełniajace ˛ nast˛epujacy ˛ warunek tan(θi ) = 1 , 2i i = 1, ..., N. (14.31) Dzielenie dowolnej liczby przez 2i jest równoważne przesuni˛eciu jest bitów i pozycji w prawo. Uwzgl˛edniajac ˛ równość (14.31) w zależności 14.30) otrzymujemy: 282 14 Obliczanie wartości funkcji standardowych # " # " (i) (i+1) 1 1 −bi 21i yre (n − 1) yre (n) =q 1 (i+1) (i) yim (n − 1) yim (n) 1 + 212i bi 2i 1 (14.32) ponieważ: Ki = cos(θi ) = p 1 1 . =√ 1 + 2−2i 1 + tan2 (θi ) (14.33) Wartości bitów bi , zwiazane ˛ z danym katem ˛ φ , można umieścić w tablicy i pobierać je z niej. Iloczyn ∏ Ki wszystkich wartości Ki jest stały dla danego N, dlatego może być wykonane tylko jedno mnożenie korygujace ˛ po wszystkich obrotach. Problem 14.5 (** Algorytm CORDIC). Spróbuj zaimplementować algorytm CORDIC w j˛ezyku C. Problem 14.6 (** The best from INTERNET). Dokładnie przeanalizuj program test_from_internet.m, uzupełniajacy ˛ wykład, który został pobrany ze strony [1]. Uruchom go, przeanalizuj rysunki, skomentuj otrzymane wyniki. 14.3 Zastosowania generatorów funkcji sinus/kosinus Przykład zastosowania - wybór jednej stacji radiowej FM z nagranego cyfrowego sygnału IQ. Załóżmy, że spróbkowaliśmy z cz˛estotliwościa˛ fs = 3.2 MHz sygnał z anteny i nagraliśmy w paśmie podstawowym sygnał zespolony I(n) + jQ(n), zawierajacy ˛ wiele stacji radiowych FM. Aby wybrać do dekodownia interesujaca ˛ nas stacj˛e o cz˛estotliwości f0 Hz, musimy przesunać ˛ sygnał w osi cz˛estotliwości o − f0 Hz i ustawić nasza˛ staj˛e pośrodku w cz˛estotliwości 0 Hz: IQ(n) = IQ(n) · e− j2π f0 fs n . (14.34) Nast˛epnie należy: 1) użyć filtra cyfrowego i pozostawić tylko co 16-ma˛ próbk˛e sygnału zespolonego ±100 kHz wokół cz˛estotliwości zerowej (1/16 pasma 3.2 MHz), 2) dokonać demodulacji cz˛estotliwości, 3) użyć filtra cyfrowego i pozostawić tylko co 8-ma˛ próbk˛e sygnału rzeczywistego ±12.5 kHz wokół cz˛estotliwości zerowej (1/8 pasma 200 kHz), 4) odsłuchać sygnału monofonicznego wybranej stacji. Problem 14.7 (* Cyfrowy odbiornik radia FM mono). Zapoznaj si˛e z programem 14.6. Uruchom go: obejrzyj po kolei wszystkie rysunki, zwracaj uwag˛e na oś cz˛estotliwości: 3.2 MHz → 200 kHz → 25 kHz. Spróbuj teraz wybrać inna˛ stacj˛e radiowa˛ do zdekodowania. Czy Twoja misja zakończyła si˛e sukcesem? Listing 14.6: Program Matlaba odbiornika cyfrowego radia FM mono % Octave: >>pkg load signal[ENTER} clear all; close all; 14.3 Zastosowania generatorów funkcji sinus/kosinus 283 % Wczytaj nagrany sygnal radia FM - Twoj wybor FileName = ’SDRSharp_FMRadio_101600kHz_IQ.wav’; T=5; demod=1; % wiele stacji FM inf = audioinfo(FileName), pause % co zawiera nagranie fs = inf.SampleRate; % liczba probek na sekunde [x,fs] = audioread(FileName,[1,T*fs]); % wczytaj tylko T sekund Nx = length(x), % dlugosc sygnalu % Odtworz zespolony sygnal I+j*Q(n), jesli potrzeba dodaj Q=0 [dummy,M] = size(x); if(M==2) x = x(:,1) - j*x(:,2); else x = x(1:Nx,1) + j*zeros(Nx,1); end % Zdemoduluj i odtworz jedna, wybrana stacje radia FM - tylko mono bwSERV=200e+3; bwAUDIO=25e+3; % Parametry: czestotliwosci w Hz D1 = round(fs/bwSERV); D2 = round(bwSERV/bwAUDIO); % Rzad pod-probkowania D1 i D2? f0 = 0e+6; x = x .* exp(-j*2*pi*f0/fs*(0:Nx-1)’); % Stacja? przesun w Hz: 0? -0.59? x = resample(x,1,D1); % Filtracja i redukcja probek D1 x = real(x(2:end)).*imag(x(1:end-1))-real(x(1:end-1)).*imag(x(2:end)); % demod FM x = resample(x,1,D2); % Filtracja i redukcja probek D2 soundsc(x,bwAUDIO); % Odtwarzanie stacji Przykład zastosowania - p˛etla PLL. W odbiorniku cyfrowym należy przesunać ˛ odebrany sygnał radiowy z wysokiej cz˛estotliwości fc , tzw. nośnej, do czestotliwości fbb = 0 Hz (baseband). W tym celu należy w odbiorniku zsyntezować (odtworzyć) nieznanany sygnał nośnej na podstawie otrzymanego, cz˛esto zniekształconego sygnału. Jedna˛ z możliwości jest adaptacyjne dostrojenie si˛e do cz˛estotliwości sygnału nośnej, o nieznanych parametrach, w jakiś sposób wydzielonego/odfiltrowanego z całego sygnału. Służy do tego p˛etla synchronizacji fazowej PLL (Phase-Locked Loop). Problem 14.8 (* P˛etla synchronizacji fazowej w radiu FM). Zapoznaj si˛e z programem 14.7. Uruchom go: obejrzyj po kolei wszystkie rysunki. Czy p˛etla dostroiła si˛e do nieznanej cz˛estotliwości? Zastap ˛ funkcj˛e Matlaba sin(), cos(), exp(j...) swoimi funkcjami. Listing 14.7: Program Matlaba p˛etli synchronizaci fazowej stosowanej w radiu FM % Petla cyfrowa PLL - Phase-Locked Loop clear all; close all; % PLL parameters fs = 250000; % czestotliwosc probkowania fc = 19000; phc = pi/4; % czestotliwosc nosnej fPLLstart = fc-25; dfreq = 100; % poczatkowa czestotl. petli, szerokosc pracy petli ipll = 1; % 1=real PLL, 2=complex PLL % Generacja sygnalow N = 50000; n=0:N-1; A = 0.1; % licza probkek, indeksy probek dt=1/fs; t=dt*n; % okres probkowania, chwile probkowania if(ipll==1) s = A * cos(2*pi*fc*t + phc); end % sygnal WE rzeczywisty if(ipll==2) s = A * exp(j*(2*pi*fc*t + phc)); end % sygnal WE zespolony % Obliczenie wartosci wspolczynnikow petli damp = sqrt(2)/2; omeg = (dfreq/fs) / (damp+1/(4*damp)); mi1 = (4*damp*omeg) / (1 + 2*damp*omeg + omeg*omeg); mi2 = (4*omeg*omeg) / (1 + 2*damp*omeg + omeg*omeg); % PLL omega = zeros(1,N+1); omega(1) = 2*pi*fPLLstart / fs; % standardowe tlumienie % zmienna % stala adaptacji #1 % stala adaptacji #2 284 14 Obliczanie wartości funkcji standardowych theta = zeros(1,N+1); smax = max(abs(s)); for n = 1 : N % PETLA ADAPTACJI if( ipll==1 ) delta = -2*sin(theta(n)) * s(n)/smax; else delta = -2*imag( exp(j*theta(n)) * conj(s(n) )/smax ); end theta(n+1) = theta(n) + omega(n) + mi1*delta; omega(n+1) = omega(n) + mi2*delta; end c = cos( theta(1:N) ); % odtworzona nosna sr = real(s) / smax; % czesc rzeczywista zaklocenego sygnalu wejsciowego n = 1:100; plot(n,sr(n),’r.-’,n,c(n),’b.-’); title(’s(n) and c(n)’); grid; pause figure; plot(1:N,sr-c,’r-’); title(’s(n)-c(n)’); grid; pause figure; plot(theta); title(’\theta(n) [rad]’);grid; pause figure; plot(omega*fs/(2*pi),’b-’); xlabel(’n’); title(’f_{PLL}(n) [Hz]’); grid; pause 14.4 Obliczanie wartości funkcji logarytmicznych log2() i log10() Każda liczba dodatnia x może być przybliżona w nast˛epujacy ˛ sposób: x = a · 2n , gdzie 1 ≦ a < 2, (14.35) na przykład: 1 1 1 · 22 = 1.6875 · 4. 6.75 = 1 + + + 2 8 16 (14.36) Ponieważ log2 (a · b) = log2 (a) + log2 (b) oraz log2 (2n ) = n, dlatego log2 (x) dla liczb x postaci (14.35) jest równy: log2 (x) = log2 (a) + log2 (2n ) = log2 (a) + n, gdzie 0 ≦ log2 (a) < 1. (14.37) Wartość logarytmu przy podstawie 2 dla liczby 2n można łatwo wyznaczyć poprzez przesuwanie w prawo bitów tej liczby i sprawdzanie czy po kolejnym przesunieciu jest ona jeszcze wi˛eksza od 0 (albo poprzez przesuwanie w prawo bitów liczby x i sprawdzanie czy jest jeszcze ona wi˛eksza od 1 - patrz program 14.9). Natomiast wartości log2 (a) moga˛ być: • stabelaryzowane w całym zakresie zmienności a, tzn. [1, 2) (LUT - look-up table), • aproksymowane funkcja˛ prosta˛ w obliczeniach. Rozpatrzmy teraz ten drugi przypadek. Do przybliżenia wartości funkcji ln(1 + y) możemy użyć nast˛epujacych ˛ wzorów: klasyczny: LS optymalny: inny: 6+y , 6 + 4y 6 + 0.7662y , ln(1 + y) = 5.9897 + 3.7658y 1+z 15 − 4z2 y ln(1 + y) = ln = 2z , z= . 2 1−z 15 − 9z 2+y ln(1 + y) = Sprawdźmy zależność (14.40): (14.38) (14.39) (14.40) 14.4 Obliczanie wartości funkcji logarytmicznych log2() i log10() ln y 1 + 2+y 1+z = ln y = ln 1−z 1 − 2+y 2(1+y) 2+y 2 2+y = ln(1 + y). 285 (14.41) Dysponujac ˛ wartościa˛ ln(1 + y) w prosty sposób można wyliczyć wartości logarytmu y przy podstawie 2 i podstawie 10: ln(1 + y) , ln(2) log2 (1 + y) , log10 (1 + y) = log2 (10) log2 (1 + y) = (14.42) (14.43) Przykład obliczeniowy. Sprawdźmy w praktyce powyższe równania na konkretnym przykładzie. Załóżmy x = 71. Wówczas: 7 6 6 x = 71 = 64 + 7 = 2 + 7 = 2 · 1 + 6 , (14.44) 2 oraz 7 6 log2 (x) = log2 (71) = log2 2 + log2 1 + 6 , (14.45) 2 czyli log2 (x) = log2 (71) = 6 + 0.149747119504682 = 6.149747119504682. (14.46) Możemy najpierw obliczyć logarytm naturalny ln 1 + 7/26 = 0.103796793681644 z użyciem wzoru (14.40), a nast˛epnie na jego podstawie obliczyć logarytm przy podstawie 2 dla tej samej liczby, stosujac ˛ wzór (14.42): ln 1 + 7/26 0.103796793681644 log2 (1 + 7/2 ) = = = 0.149747119504683. ln(2) 0.693147180559945 (14.47) W programie 14.8 sa˛ wykonane wszystkie przedstawione powyżej obliczenia. 6 Listing 14.8: Ilustracja przykładu aproksymacji funkcji log2 (x) w j˛ezyku Matlab opisanego w tekście % Aproksymacja funkcji log2() format long x = 71, % wartosc wejsciowa: 70 = 64 + 7 = 2^6 + 7 = 2^6 * (1 + 7/2^6) % log2(70) = log2(2^6) + log2(1+7/2^6) = 6 + log2(1+7/2^6) % Czesc calkowita wyniku log2(x) xc = x; power = 0; while( xc > 1 ) xc = xc/2; power = power+1; end power = power-1, pause % znaleziona potega liczby 2 np. 6 % Czesc ulamkowa wyniku log2(x) x = x - 2^power, pause % pozostalosc np. 71 - 2^6 = 7 286 14 Obliczanie wartości funkcji standardowych x = x / 2^power; % pozostalosc ulamkowo np. 7/2^6 y = x/(2+x); % uzyte podstawienie lnxplus1 = 2*y.*(15-4*y.^2) ./ (15-9*y.^2); % ln(1+x) y = lnxplus1 / 0.693147181; % ln()-->log2(): dzielenie przez ln(2) y = power + y, % koncowy wynik Problem 14.9 (* Obliczanie wartości funkcji log2 (x) w j˛ezyku C). Zapoznaj si˛e z funkcja˛ LOG2_u32(), napisana˛ w j˛ezyku C, przedstawiona˛ na listingu 14.9. Znajdź w nim fragmenty odpowiedzialne za obliczenie wartości n = log2 (2n ) oraz log2 (a) liczby x - patrz wzory (14.35)(14.37). Napisz program w j˛ezyku C, wywołujacy ˛ t˛e funkcja.˛ Sprawdź poprawność jej działania. Listing 14.9: Funkcja LOG2() w j˛ezyku C dla skali decybelowej liczb typu uint32_t /********************************************************************** * Name: LOG2_u32 * Purpose: approximates value of log2 function for unsigned argument * Parameters: x - nonzero unsigned log2(x) parameter * Returns: float - value of log2(x) *********************************************************************/ float LOG2_u32(uint32_t x) { uint32_t y=x, power=0; float log2_val; /* evaluate integer part of log2 */ while(y>1) { y >>= 1; power++; } /* compensate integer part */ x -= 1<<power; /* prepare factor for fraction part of log2 */ log2_val = ( (float)x )/ (1<<power); /* use ln(1+x) rational Pade approximation in interval x=[0,1) */ log2_val = log2_val/(2+log2_val); log2_val = 2*log2_val*(15 - 4*log2_val*log2_val)/(15 - 9*log2_val*log2_val); /* convert from ln to log2: log2(x) = ln(x) / ln(2) */ log2_val /= 0.693147181; log2_val += power; return (log2_val); } Problem 14.10 ((L)* Obliczanie wartości funkcji logarytmicznych w j˛ezyku Matlab). Zapoznaj si˛e z programem 14.10. Wykorzystaj go do napisania funkcji obliczajacej ˛ log2 (x) oraz log10 (x) z użyciem wzorów podanych w tym podrozdziale. Inspiruj si˛e funkcja˛ 14.9, napisana˛ w j˛ezyku C. Sprawdź czy otrzymywane wyniki sa˛ poprawne. 14.6 Zastosowania algorytmów obliczania funkcji 287 Listing 14.10: Wst˛ep do obliczania funkcji logarytmiczych w j˛ezyku Matlab % Przyblizanie funkcji logarytmicznych x = 0 : 0.01 : 1; y1 = log(1+x); y2 = x.*(6+x)./(6+4*x); y3 = x.*(6+0.7662*x)./(5.9897+3.7658*x); figure; plot(x,y1,’r’,x,y2,’g’,x,y3,’b’); grid; pause y1 = log((1+x)./(1-x)); y2 = 2*x.*(15-4*x.^2) ./ (15-9*x.^2); figure; plot(x,y1,’r’,x,y2,’g’); grid; pause 14.5 Przybliżanie wartości różnych funkcji wielomianem W tabeli 14.1 podano wartości współczynników wielomianów postaci: y = p(x) = a0 + a1 x + a2 x2 + a3 x3 + ... (14.48) przybliżajacych ˛ wartości wybranych trzech funkcji. Tabela 14.1: Współczynniki aproksymacji trzech funkci [2] Funkcja √ x Zakres argumentu Bład ˛ bezwzgl˛edny 0.5 < x < 1.0 < 10−4 ex 0 ≦ x ≦ ln(2) < 2 · 10−10 ln(1 + x) 0≦x≦1 < 10−4 Współczynniki rozwini˛ecia a0 = 0.2307, a1 = 0.1.2917, a2 = −0.8914, a3 = 0.4855, a4 = −0.1165 a0 = 1.0, a1 = −0.9999999995, a2 = 0.4999999206, a3 = −0.1666653019, a4 = 0.0416573475, a5 = 0.0083013598, a6 = 0.0013298820, a7 = −0.0001413161 a0 = 0, a1 = 0.99949556, a2 = −0.49190896, a3 = 0.28947478, a4 = −0.13606275, a5 = 0.03215845 Problem 14.11 (* Przybliżanie wartości wybranych funkcji wielomianem). Napisz funkcj˛e w j˛ezyku Matlab, obliczajac ˛ a˛ przybliżona˛ wartość funkcji ex za pomoca˛ wielomianu o współczynnikach podanych w tablicy 14.1. Sprawdź poprawność jej działania oraz dokładność w całym zakresie wartości argumentu x. Znajdź w Internecie współczynniki rozwiniecia dla innych funkcji. Może jedna˛ z nich także zaimplementujesz? 14.6 Zastosowania algorytmów obliczania funkcji Dobrym przykładem konieczności zastosowania własnych algorytmów i programów do obliczania wartości funkcji standardowych sa˛ psychoakustyczne kodery dźwi˛eku, implementowane na tanim sprz˛ecie. Podstawa˛ ich działania jest dekompozycja dźwi˛eku na podpasma cz˛estotliwościowe (od-do Hz, od-do Hz, ...) oraz kwantowanie sygnałów 288 14 Obliczanie wartości funkcji standardowych podpasmowych. Decyzja, jak istotne sa˛ poszczególne podpasma i ile bitów powinna w nich otrzymać każda próbka dźwi˛eku, jest wypracowywana w programach, implementujacych ˛ model matematyczny ludzkiego aparatu słuchowego. W modelu tym u√ żywane sa,˛ mi˛edzy innymi, nast˛epujace ˛ funkcje: sin(x), cos(x), ex , ln(x), log10 (x), x. Przykładowo, trzeba w nim programowo zaimplementować nast˛epujace ˛ równania, podane w tabeli 14.2, nawet na najniższym poziomie programowym, czyli w assemblerze konkretnego procesora. Tabela 14.2: Równanie implementowane numerycznie w modelu psychoakustycznym standardu MPEG audio [2] Obliczana wielkość Okno Hanninga Równanie - definicja h(i) = 0, 5 − 0, 5 cos 2π(i−0,5) 1024 q Nieprognozowalność widmowa Indeks tonalności SNR (skala liniowa) 2 2 (rω ·cos( fω )−r̂ω ·cos( fˆω )) +(rω ·sin( fω )−r̂ω ·sin( fˆω )) cω = rω +|r̂ω | tbb = −0, 299 − 0, 43 ln(cbb ) bcb = 10−SNRb /10 " #1/N k Nk ∏ |Xk (l )|2 Płaskość widmowa Indeks maskowania Próg maskowania Entropia perceptualna SFM (k) = 10log10 l=1 Nk 1 2 Nk ∑ |Xk (l )| l=1 ( fkHz )2 β (k) = 2 + 2, 05 · arctg (0, 25 fkHz ) + 0, 75 · arctg 2,56 epartn SMRn = 10 · log10 npart , n = 1, 2, 3, ..., 32 n b +1 pe = −10 · ∑ cbwidthb · ln thr e +1 b b Problem 14.12 (** Obliczeniowe Sudety albo Himalaje). Rzuć okiem na strony 179-186 w normie [2], na których jest algorytmicznie opisany model psychoakustyczny ze standardu MPEG audio, stosowany do kodowania dźwi˛eku w radiu cyfrowym DAB+. Wybierz jeden z wzorów z tabeli 14.2, zaczerpni˛ety z tego modelu, zaimplementuj go w sposób uproszczony i porównaj wynik z oryginałem. 14.7 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu. 1. Funkcje standardowe (elementarne) sa˛ cz˛eścia˛ każdego środowiska obliczeniowego (Matlab, C/C++ z biblioteka˛ MATH, Python, Java, ...): • sa˛ wewn˛etrznie zaimplementowane w sposób optymalny (pod wzgl˛edem szybkości działania lub zaj˛etości pami˛eci), • dostarczaja˛ wynik z dokładnościa˛ na poziomie bł˛edu reprezentacji liczb w komputerze. 2. Samodzielna implementacja funkcji standardowych jest wskazana gdy: Literatura 289 • środowisko obliczeniowe nie zapewnia ich implementacji (mikrokontrolery, FPGA), • kryterium optymalności dost˛epnej implementacji nie odpowiada potrzebom naszego zastosowania, • nie potrzebujemy dokładności na poziomie bł˛edu reprezentacji, a możemy przygotować implementacj˛e alternatywna: ˛ działajac ˛ a˛ szybciej lub przy mniejszym zużyciu pami˛eci, • nie potrzebujemy uniwersalnej funkcji, ponieważ wymagania zastosowania sa˛ ograniczone. 3. Metody sztucznej inteligencji, w szczególności popularne ostatnio gł˛ebokie sieci neuronowe, potrzebuja˛ uproszczonych, szybkich implementacji wybranych funkcji, np. ex , z powodu ich wielokrotnego użycia w neuronach. Literatura 1. "Digital Waveguide Oscillators", on-line: https://www.dsprelated.com/freebooks/pasp/Digital_Waveguide_Oscillator.html 2. ETSI EN 300 401, "Radio Broadcasting Systems: Digital Audio Broadcasting (DAB) to mobile, portable and fixed receivers,"2006, online: https://www.etsi.org/deliver/etsi_en/300400_300499/300401/02.01.01_60/, str. 179-186. 3. R.Green, "Faster Math Functions", on-line: https://basesandframes.files.wordpress.com/2016/05/fastmath-functions_p1.pdf, 2007. 4. R. Green, "Even Faster Math Functions", on-line: https://basesandframes.wordpress.com/2020/04/04/evenfaster-math-functions/, 2020. 5. W. Półchłopek, R. Rumian, P. Turcza, "Podstawy arytmetyki stałoprzecinkowej", w Cyfrowe przetwarzanie sygnałów w telekomunikacji, T. Zieliński, P. Korohoda, R. Rumian (red.), PWN, str. 394-429, 2014. 6. Trigonometric Look-Up Tables Revisited, on-line: https://jfdube.wordpress.com/2011/12/06/trigonometriclook-up-tables-revisited/ 7. T. Twardowski, Techniki obliczeniowe w nauce i technice. Materiały do wykładu, AGH-WIET, Kraków 2015. 8. M. Vicanek, "A New Recursive Quadrature Oscillator", 2015, on-line: https://vicanek.de/articles/QuadOsc.pdf Rozdział 15 Obliczania numeryczne stałoprzecinkowe Streszczenie Obliczenia stałoprzecinkowe: cel, podstawowe operacje, ograniczenia, przykłady algorytmów, procesory sygnałowe. 15.1 Wprowadzenie - komputerowe reprezentacje liczb Obecnie zrobimy krótkie przypomnienie informacji z pierwszego wykładu dotyczace ˛ liczb zmienno- i stałoprzecinkowych. Poniżej podano wzory na wartości tych liczb (dla liczb zmiennoprzecinkowych: E - eksponenta/wykładnik, M - mantysa/cecha): • zmiennoprzecinkowa float - 32-bitowa (S - 1 bit, E - 8 bitów, M - 23 bity): 1 1 + ...b0 23 ; 21 2 (15.1) • zmiennoprzecinkowa double - 64-bitowa (S - 1 bit, E - 11 bitów, M - 52 bity): x = (−1)S · M · 2(E−127) , S ∈ {0, 1}, E = 0, 1, ...255, M = 1 + b22 1 1 +...b0 52 ; 1 2 2 (15.2) • stałoprzecinkowa QM.N (M - liczba bitów przed przecinkiem, N - liczba bitów po przecinku, łacznie ˛ M + N): x = (−1)S ·M ·2(E−1023) , reprezentacja: wartość: S ∈ {0, 1}, E = 0, 1, ...2047, M = 1+b51 QM.N = bM−1 ...b1 b0 .b−1 b−2 ...b−N , M+N−2 x = bM−1 · −2(M−1) + ∑ bk−N · 2(k−N) , (15.3) (15.4) k=0 zakres: −2(M−1) ≦ x ≦ 2(M−1) − kwant: ∆x = bład: ˛ 1 , 2N 1 (LSB), 2N 1 1 − (N−1) ≦ εx ≦ (N−1) . 2 2 (15.5) (15.6) (15.7) (15.8) 15.2 Liczby zmiennoprzecinkowe We wzorach (15.1) i (15.2) E oznacza wykładnik liczby 2, natomiast M - mantys˛e (cz˛eść ułamkowa˛ liczby). Na rysunku 15.1 przedstawiono graficznie definicj˛e zmiennoprzecinkowej reprezentacji liczb typu float oraz double. Należy podkreślić, że wykładnik dobiera si˛e tak, aby po przesuni˛eciu przecinka liczba ułamkowa zawsze miała liczb˛e 1 przed przecinkiem, czyli była z zakresu [1.0, 2.0) (jeśli wielkość liczby to umożliwia) — w takim przypadku w mantysie zapisywana jest tylko cz˛eść ułamkowa bez wiodacej ˛ (poprzedzajacej) ˛ jedynki, która jest domyślna. Dowyślna jedynka zwi˛eksza liczb˛e bitów reprezentacji i poprawia precyzj˛e. Format zmiennoprzecinkowy daje duże poszerzenie zakresu reprentacji liczb, ale kosztem ich precyzji. Porównujac ze soba˛ 32-bitowe liczby zmiennoprzecinkowe 291 292 15 Obliczania numeryczne stałoprzecinkowe f loat oraz stałoprzecinkowe long, zakres liczbowy w formacie zmiennoprzecinkowym jest 28 = 256 razy wi˛ekszy, ale dokładność mantysy w formacie stałoprzecinkowym jest o 8 bitów lepsza. W obliczeniach zmiennoprzecinkowych nie ma ryzyka przepełnienia, ale istnieje olbrzymie niebezpieczeństwo utraty precyzji, w sytuacji kiedy wykonujemy operacj˛e arytmetyczna˛ na dwóch liczbach znacznie różniacych ˛ si˛e wykładnikiem (przed wykonaniem operacji na liczbach zapisanych w reprezentacji f loat ustawiamy wykładnik liczby mniejszej tak, aby był on równy wykładnikowi liczby wi˛ekszej, w wyniku czego przecinek w cz˛eści ułamkowej liczby mniejszej przesuwa si˛e w lewo, a bity przesuwaja˛ si˛e w prawo i cz˛eściowo lub całkowicie nie mieszcza˛ si˛e już w reprezentacji bitowej mantysy, czyli sa˛ tracone). Sytuacja taka jest przedstawiona na rysunku 15.2 i porównana z dodawaniem liczb stałoprzecinkowych formatu long. Poniżej jako przykład jest podana konkretna, 32-bitowa liczba zmiennoprzecinkowa : 1 (120−127) 1 01111000 010 0000 0000 0000 0000 0000b = (−1) · 2 1 = · 1+ 4 = −1.25 · 2−7 = −0.9765625 · 10−2 (15.9) Na rysunku 15.3 jest przedstawiony przykład zapisu tej samej liczby −0.009765625 = −0.9765625 · 10−2 w formacie f loat oraz double. Na rysunkach 15.4 i 15.5 pokazano szczególne przypadki (wyjatki) ˛ zapisu liczb typu zmiennoprzecinkowego, na które trzeba bardzo uważać. Na koniec, na rysunku 15.6 zaprezentowano wi˛ecej przykładów konwersji liczb rzeczywistych na typ f loat. Rysunek 15.1: Definicja liczb zmiennoprzecinkowych typu f loat oraz double. 15.2 Liczby zmiennoprzecinkowe 293 Rysunek 15.2: Ilustracja utraty precyzji w liczbach typu f loat, w przeciwieństwie do liczb typu f ixed − point. Rysunek 15.3: Przykład zapisu tej samej liczby rzeczywistej w formatach f loat i double. 294 15 Obliczania numeryczne stałoprzecinkowe Rysunek 15.4: Przypadek liczby f loat z zerowym wykładnikiem E. Rysunek 15.5: Przypadek liczby f loat z wykładnikiem E zawierajacym ˛ same bity 1. 15.3 Liczby stałoprzecinkowe 295 Rysunek 15.6: Przykłady reprezentacji bitowej różnych liczb zmiennoprzecinkowych. Problem 15.1 (* Romeo i Julia). Załóż sobie konto na stronie: https://juliahub.com/ui/Home, np. używajac ˛ konta Google albo pocztowego, oraz pobaw si˛e różnymi reprezentacjami liczb w Julii. Na poczatek ˛ sprawdź proste sekwencje instrukcji, podane na rysunku 15.6. Potem zacznij je modyfikować. Korzystaj z opisu (# komentarz) i fragmentów programu 15.1. Listing 15.1: Typy danych i proste komendy w Julii # Typy danych: # Int8, Int16, Int32, Int64, Int128 # UInt8, UInt16, UInt32, UInt64, UInt128 # BigInt # Float16, Float32, Float64 # BigFloat # Inf, -Inf, NaN # Deklaracja i inicjalizacja A = Int64(1234); F = Float16(1.125); B = Float64(A); # Proste funkcje na zmiennych tol = eps(Float16), eps(Float32), eps(Float64), eps(BigFloat) Float16(1.) + eps(Float64); a = Float16(1.25); b=a+eps(Float16); bits(b); 15.3 Liczby stałoprzecinkowe Najstarszy bit w reprezentacji QM.N to bit znaku: dzi˛eki niemu otrzymujemy liczby ujemne i dodatnie kodowane w notacji U2 (uzupełnień do dwóch). Dla przykładu zinterpretujmy bity nast˛epujacej ˛ liczby w zapisie Q1.31: 296 15 Obliczania numeryczne stałoprzecinkowe 1 1 1 + 0 · + 1 · + ... = 0.625 2 4 8 (15.10) Na rysunkach 15.7 oraz 15.8 w sposób pogladowy ˛ przedstawiono znaczenie poszczególnych bitów dla liczb 8 bitowych interpretowanych jako typ Q7.0/int8/char/ oraz jako typ Q0.7/fract8. 010100000000000000000000b = 0 · (−20 ) + 1 · Rysunek 15.7: Interpretacja liczb stałoprzecinkowych typu Q7.0. Rysunek 15.8: Interpretacja liczb stałoprzecinkowych typu Q0.7. 15.4 Typ stałoprzecinkowy 16-to bitowy 297 Kod QM.0 jest najcz˛eściej stosowany w tanich mikrokontrolerach i procesorach ogólnego przeznaczenia, natomiast kod Q0.N — w dedykowanych procesorach sygnałowych (DSP Digital Signal Processors). Zamijmy si˛e tym drugim. Co prawda ma on zakres ograniczony do [−1, 1), ale posiada nast˛epujace ˛ zalety: • operacja mnożenia a = b · c nie powoduje przepełnienia zakresu [−1, 1), gdyż wynik mnożenia dowolnych dwóch liczb z tego zakresu należy również do tego zakresu; ponieważ w wyniku mnożenia liczby ułamkowe staja˛ si˛e "jedynie"mniejsze 1 , 2−8 ·2−8 = 2−16 ) w celu zachowania precyzji wynikowa liczba jest (np. 41 · 41 = 16 zapisywana w notacji Q0.(N+N) - do tego służa˛ akumulatory wyników o podwojonej długości/precyzji, których zawartości można przesuwać (patrz rys. 15.9); • operacja dodawnia a = b + c może dać liczb˛e dwukrotnie wi˛eksza,˛ czyli w formacie Q1.M, np. (−1) + (−1) = −2; w celu unikni˛ecia przepełnienia akumulatory maja˛ z przodu dodatkowe bity "przechwytujace"przepełnienie ˛ zakresu - rejestr a2 na rys. 15.9; • operacja mnożenia i akumulacji (MAC - Multiply and Accumulate) a = a + b · c (dodawania wyniku mnożenia do poprzedniej zawartości akumulatora) może dać liczb˛e w formacie Q1.(N+N), np. (−1) + (1)(−1) = −2 oraz 0 + 218 · 218 = 2116 (np. 24-bitowy processor DSP56300 ma akumulatory o długości 56 bitów: 8+24+24) - 8 bitów z przodu na ewentualne przepełnienie i 24 bity z tyłu, zabezpieczajace ˛ przed utrata˛ precyzcji - patrz rys. 15.14). Rysunek 15.9: Rola akumulatora w operacjach na liczbach stałoprzecinkowych (dodatkowe bity z przodu i z tyłu). 15.4 Typ stałoprzecinkowy 16-to bitowy Powszechnie używany i wystarczajacy ˛ w wi˛ekszosci zastosowan jest typ stałoprzecinkowy implementowany na słowie typu int(eger) 16-to bitowym. Tabela15.1 przedstawia dokładność reprezentacji typami od Q0.15 (powszechnie stosowany w procesorach DSP) do Q15.0 (zwykły int16 w j˛ezykach programowania). Typ QM.N jest tylko specjalna˛ interpretacja˛ słowa bitowego typu int. Konwersja miedzy typami jest prostym skalowaniem, co pokazuje tabela 15.2: inna reprezentacja jest otrzymywana poprzez podzielenie reprezentacji Q15.0 przez współczynnik skalujacy. ˛ Problem 15.2 ((L)* Testowanie formatu liczb QM.N). Zapoznaj si˛e z programem 15.2. Sprawdź jego poprawność dla różnych formatów liczb QM.N. Napisz swój program. 298 15 Obliczania numeryczne stałoprzecinkowe Tabela 15.1: Dokładność reprezentacji liczb typu QM.N Typ Najmniejsza ujemna liczba Najwi˛eksza dodatnia liczba Dokładność (precyzja) QM.N Q0.15 Q1.14 Q2.13 Q3.12 Q4.11 Q5.10 Q6.9 Q7.8 Q8.7 Q9.6 Q10.5 Q11.4 Q12.3 Q13.2 Q14.1 Q15.0 −2M -1 -2 -4 -8 -16 -32 -64 -128 -256 -512 -1024 -2048 -4096 -8192 -16384 -32768 2M − 21N 0.999969482421875 1.99993896484375 3.9998779296875 7.999755859375 15.99951171875 31.9990234375 63.998046875 127.99609375 255.9921875 511.984375 1023.96875 2047.9375 4095.875 8191.75 16383.5 32767 1 2N 0.00003051757813 0.00006103515625 0.00012207031250 0.00024414062500 0.00048828125000 0.00097656250000 0.00195312500000 0.00390625000000 0.00781250000000 0.01562500000000 0.03125000000000 0.06250000000000 0.12500000000000 0.25000000000000 0.50000000000000 1.00000000000000 Tabela 15.2: Konwersja liczb reprezentacji typu QM.N poprzez skalowanie Typ Dzielnik (2N ) Minimum HEX QM.N Q0.15 Q1.14 Q2.13 Q3.12 Q4.11 Q5.10 Q6.9 Q7.8 Q8.7 Q9.6 Q10.5 Q11.4 Q12.3 Q13.2 Q14.1 Q15.0 2N 215 = 32768 214 = 16384 213 = 8182 212 = 4096 211 = 2048 210 = 1024 29 = 512 28 = 256 27 = 128 26 = 64 25 = 32 24 = 16 23 = 8 22 = 4 21 = 2 20 = 1 8000h 8000h 8000h 8000h 8000h 8000h 8000h 8000h 8000h 8000h 8000h 8000h 8000h 8000h 8000h 8000h 8000h (−2M ) (−1) (−2) (−4) (−8) (−16) (−32) (−64) (−128) (−256) (−512) (−1024) (−2048) (−4096) (−8192) (−16384) (−32768) Maksimum HEX 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh 7FFFh (2M − 21N ) (0.99) (1.99) (3.99) (7.99) (15.99) (31.99) (63.99) (127.99) (255.99) (511.99) (1023.99) (2047.99) (4095.99) (8191.99) (16383.99) (32767) Listing 15.2: Program Matlaba do konwersji liczb stałoprzecinkowych QM.N do postaci binarnej/bitowej i z powrotem % fractional2binary.m a = 1234.57849; % your float point number n = 16; % number bits for integer part of your number m = 20; % number bits for fraction part of your number % binary number d2b = [ fix(rem(fix(a)*pow2(-(n-1):0),2)), fix(rem( rem(a,1)*pow2(1:m),2))], % % the inverse transformation b2d = d2b*pow2([n-1:-1:0 -(1:m)].’), 15.6 Wybór reprezentacji liczb 299 15.5 Podstawowe operacje arytmetyczne w implementacji stałoprzecinkowej W tabeli 15.3 scharakteryzowano wykonywanie podstawowych operacji arytmetycznych w arytmetyce stałoprzecinkowej QM.0 - liczby całkowite ze znakiem (U2). Czyli dla reprezentacji z dzielnikiem 1 w tabeli 15.2. Tabela 15.3: Charakterystyka operacji arytmetycznych w implementacji stałoprzecinkowej typu QM.0 (najpierw jest wykonywana operacja w nawiasach (.), x >> M i x << M oznacza przesuni˛ecie M bitów w prawo/lewo) Nazwa operacji Dodawanie Wykonanie operacji r = x+y Odejmowanie r = x−y Mnożenie r = (x ∗ y) >> M Dzielenie (x << M)/y Uwagi zwykła arytmetyka U2, niebezpieczeństwo przepełnienia zakresu zwykła arytmetyka U2, niebezpieczeństwo przepełnienia zakresu 1) niebezpieczeństwo przepełnienia zakresu i utraty precyzji, 2) wynik pośredni dwukrotnie szerszy, 3) powielenie bitu znaku wyniku, jeśli liczby ze znakiem 1) niebezpieczeństwo przepełnienia zakresu i utraty precyzji, 2) wynik pośredni dwukrotnie szerszy 15.6 Wybór reprezentacji liczb Liczby zmiennoprzecinkowe typu float/double maja˛ niezaprzeczalne zalety i wady. Zalety liczb FP sa˛ nast˛epujace: ˛ • duża dynamika zakresu, • duża precyzja reprezentacji, • łatwość programowania. Wady liczb FP sa˛ nast˛epujace: ˛ • Sa˛ nienaturalne dla niektórych platform/architektur, niemajacych ˛ FPU - Floating Point Unit: – stałoprzecinkowe procesory DSP taktowane najwyższymi czestotliwościami, – tanie, popularne mikrokontrolery 8/16-bitowe, np. 8051, V850, – układy FPGA (Field Programmable Gate Arrays), np. firm Xilinx i Altera. • Obliczenia FP można emulować programowo, ale jest to powolne. Czas wykonania operacji arytmetycznych jest krytyczny w niektórych zastosowaniach, np. podczas dekodowania danych audio i wideo w czasie rzeczywistym, np. podczas strumieniowania multimediów w sieci komputerowej, ogladania cyfrowej telewizji naziemnej lub satelitarnej. • Realizowane sprz˛etowo operacje zmiennoprzecinkowe zużywaja˛ wiecej energii (pradu), ˛ generuja wi˛ecej ciepła (problem jego odprowadzania) oraz zużywaja˛ wi˛ecej powierzchni krzemu w układzie procesora (powoduja˛ zwi˛ekszenie jego ceny!). A przecież urzadzenia ˛ przenośne powinny być projektowane na minimalne zużycie baterii i jak najdłuższy czas działania. 300 15 Obliczania numeryczne stałoprzecinkowe Liczby stałoprzecinkowe typu fixed-point. W tym przypadku zalety i wady liczb zmiennoprzecinkowych zamieniaja˛ si˛e miejscami, tzn. np. to co było wada˛ liczb zmiennoprzecinkowych staje si˛e zaleta˛ liczb stałoprzecinkowych, niestety za cen˛e utraty zalet tych pierwszych. Przykładowo, liczby stałoprzecinkowe maja˛ nast˛epujace ˛ wady: • mała˛ dynamika˛ zakresu, • mała˛ precyzj˛e reprezentacji kiedy liczba bitów jest ograniczona, • trudność (czasochłonność) programowania. Jednak znajduja˛ szerokie zastosowanie z dwóch powodów: • ponieważ oferuja˛ małe zużycie energii (baterii) i długi czas działania procesorów, sa˛ powszechnie stosowane w urzadzeniach ˛ przenośnych: telefonach komórkowych, aparatach fotograficznych, układach nawigacji z odniornikami GPS, układach gier typu Game Boy, • ponieważ operuja˛ na natywnym formacie danych, otrzymywanym bezpośrednio z urzadzeń ˛ wejściowych, np. próbki dźwi˛eku (kodery i dekodery audio MP3/AAC), kolor pikseli obrazu (konsole graficzne do gier X-Box/Play Station, odbiorniki TV), odczyt danych cyfrowych z czujników za pomoca˛ przetworników typu analog-cyfra (stacje pogodowe). W procesorach sygnałowych najcz˛eściej stosuje si˛e reprezentacj˛e stałoprzecinkowa˛ Q0.N. Natomiast w procesorach ogólnego przeznaczenia, np. mikrokontrolerach — reprezentacj˛e QM.0 (liczby całkowite ze znakiem w kodzie U2). 15.7 Przykłady implementacji stałoprzecinkowej algorytmów Typowy schemat implementowania algorytmów stałoprzecinkowych, z powodu zagrożenia przepełnieniem, niedomiarem i utrata˛ precyzji, zaczyna sie od implementacji zmiennoprzecinkowej. Poprawnie działajaca implementacja na typie float/double jest nast˛epnie zamieniana na typ QM.0 albo Q0.N i jest przeprowadzana analiza potencjalnych zródeł problemów. Na tym etapie można wspomagać si˛e specjalizowanymi narzedziami, np. firma Mathworks sprzedaje pakiet oprogramowania Fixed Point Designer [1] do analizy fixed-point. Poniżej zapoznamy si˛e z kilkoma wybranymi implementacjami stałoprzecinkowymi algorytmów. 15.7 Przykłady implementacji stałoprzecinkowej algorytmów 301 FFT. Poniżej przedstawiono i porównano ze soba˛ implementacj˛e algorytmu FFT (Fast Fourier Transform) w wersji zmiennoprzecinkowej i stałoprzecinkowej. Listing 15.3: Implementacja zmiennoprzecinkowa algorytmu FFT w Matlabie function x = fi_m_radix2fft_algorithm1_6_2(x, w) n = length(x); t = log2(n); % wartosci parametrow x = fidemo.fi_bitreverse(x,n); % zmiana kolejnosci for q = 1 : t % etapy L = 2^q; r = n/L; L2 = L/2; % stale w tym etapie for k = 0 : (r-1) % bloki for j = 0 : (L2-1) % motylki temp = w(L2-1+j+1) * x(k*L+j+L2+1); % korekta x(k*L+j+L2+1) = x(k*L+j+1) - temp; % # motylek x(k*L+j+1) = x(k*L+j+1) + temp; % # motylek end end end Listing 15.4: Implementacja stałoprzecinkowa algorytmu FFT w Matlabie function x = fi_m_radix2fft_withscaling(x, w) n = length(x); t = log2(n); x = fidemo.fi_bitreverse(x,n); % Generate index variables as integer constants % so they are not computed in the loop. LL = int32(2.^(1:t)); rr = int32(n./LL); LL2 = int32(LL./2); for q = 1 : t L = LL(q); r = rr(q); L2 = LL2(q); for k = 0 : (r-1) for j = 0 : (L2-1) temp = w(L2-1+j+1) * x(k*L+j+L2+1); % korekta x(k*L+j+L2+1) = bitsra( x(k*L+j+1) - temp, 1); % motylek x(k*L+j+1) = bitsra( x(k*L+j+1) + temp, 1); % motylek end end end 302 15 Obliczania numeryczne stałoprzecinkowe CORDIC. Listing 15.5 prezentuje kod programu w j˛ezyku C (http://www.dcs.gla.ac.uk/ jhw/cordic/), implementujacy ˛ algorytm CORDIC (patrz wykład "Funkcje standardowe"), służacy ˛ do generowania wartości funkcji sin(n · ∆ x) i cos(n · ∆ x), dla kolejnych wartości kata ˛ (n = 0, 1, 2, ...). Jest to wersja stałoprzecinkowa: obrót wektora [a, b] o wi˛ekszy kat ˛ jest realizowany poprzez seri˛e obrotów o mniejsze katy ˛ ∆ xk , dla których wartość funkcji tan(∆ xk ) jest równa 21n . Dzieki temu zamiast mnożyć liczb˛e a lub b przez tan(∆ xk ), wystaraczy ja˛ jedynie przenać ˛ n bitów w prawo. W zwiazku ˛ z tym wykonuje si˛e jedynie proste operacje dodawania, odejmowania i przesuwania bitów. Obecnie, poniżej, zacytujemy fragment ze strony http://www.dcs.gla.ac.uk/ jhw/cordic/. "Na poczatku ˛ program generuje zbiór nagłówkowy ze stałymi oraz kod obliczeniowy algorytmu dla różnych długości słów komputerówych (16 lub 32 bity), oraz zapisuje zbiór nagłówkowy na standardowe urzadzenie ˛ wyjściowe. Kolejność jest nast˛epujaca. ˛ 1. Na poczatku ˛ program powinien być uruchowiony na komputerze posiadajacym ˛ Floating-Point Unit (FPU) - do generacji stałych jest używana standardowa biblioteka matematyczna. 2. Potem wynikowy skypt *.h powinien być skompilowany na docelowy procesor/platform˛e (np. mikrokontroler) za pomoca˛ cross-kompilatora. Należy podać liczb˛e bitów bitsize używanego słowa komputerowego: spowoduje to przemapowanie wartości 1 na 2bitsize−2 . Przykładwo dla reprezentacji 16bitowej plik nagłówkowy b˛edzie używał formatu stałoprzecinkowego Q2.14, który w tym przypadku zapewni najwi˛eksza˛ precyzj˛e. Użytkownik może zmienić współczynnik mnożacy, ˛ wyst˛epujacy ˛ poniżej, na inna˛ wartość, jeśli zamierza użyć innej reprezentacji stałoprzecinkowej QM.N. Zapewni to maksymalna˛ dokładność (do przetestowania jako zadanie domowe). Funkcja CORDIC spodziewa si˛e wartości argumentu z przedziału [− π2 , π2 ]. Dla innych wartości argumentów wyniki sa˛ identyczne. Dla przedziału [ π2 , π] wynik jest taki sam jak dla ] π2 , a − π2 ], podobnie dla przedziału [−π, − π2 ]. Każdy kat ˛ może być przemapowany do zakresu [− π2 , π2 ] biorac ˛ jego wartość modulo π. W listingu 15.5 założono, że ustawiono bitsize=32 oraz zapisano wyjście z programu gentable.c do zbioru cordic-32bit.h. Oczywistym jest, że 16-bitowy algorytm CORDIC może być zaprogramowany podobnie prosto, dajac ˛ w wynku cordic-16bit.h. W zaprezentowanym listingu wyniki z 32-bitowego algorytmu CORDIC sa˛ porównywane z wynikiem standardowych implementacji funkcji sin() i cos() z biblioteki math.h. Jak widać algorytm nie jest idealny (perfekcyjnie dokładny), ale jego celem jest implementacja obliczeń na tanim sprz˛ecie: bez sprz˛etowych mnożarek lub z ograniczona˛ pami˛ecia.˛ Problem 15.3 (** Analiza i testowanie programu CORDIC). Sprawdź oprogramowanie CORDIC, pobrane ze strony http://www.dcs.gla.ac.uk/ jhw/cordic/, dla liczb stałoprzecinkowych 32, 16 i 8 bitowych. Listing 15.5: Kod w j˛ezyku C algorytm CORDIC w implementacji stałoprzecinkowej // Pobrane ze strony: http://www.dcs.gla.ac.uk/~jhw/cordic/ #include "cordic-32bit.h" #include <math.h> // for testing only! //Print out sin(x) vs fp CORDIC sin(x) int main(int argc, char **argv) { 15.7 Przykłady implementacji stałoprzecinkowej algorytmów 303 double p; int s,c; int i; for(i=0;i<50;i++) { p = (i/50.0)*M_PI/2; // use 32 iterations cordic((p*MUL), &s, &c, 32); // these values should be nearly equal printf("%f : %f\n", s/MUL, sin(p)); } } // cordic-32bit.h //Cordic in 32 bit signed fixed point math //Function is valid for arguments in range -pi/2 -- pi/2 //for values pi/2--pi: value = half_pi-(theta-half_pi) and similarly for values -pi---pi /2 // // 1.0 = 1073741824 // 1/k = 0.6072529350088812561694 // pi = 3.1415926536897932384626 //Constants #define cordic_1K 0x26DD3B6A #define half_pi 0x6487ED51 #define MUL 1073741824.000000 #define CORDIC_NTAB 32 int cordic_ctab[]={0x3243F6A8, 0x1DAC6705, 0x0FADBAFC, 0x07F56EA6, 0x03FEAB76, 0x01FFD55B , 0x00FFFAAA, 0x007FFF55, 0x003FFFEA, 0x001FFFFD, 0x000FFFFF, 0x0007FFFF , 0x0003FFFF, 0x0001FFFF, 0x0000FFFF, 0x00007FFF, 0x00003FFF, 0x00001FFF , 0x00000FFF, 0x000007FF, 0x000003FF, 0x000001FF, 0x000000FF, 0x0000007F , 0x0000003F, 0x0000001F, 0x0000000F, 0x00000008, 0x00000004, 0x00000002 , 0x00000001, 0x00000000, }; void cordic(int theta, int *s, int *c, int n) { int k, d, tx, ty, tz; int x=cordic_1K,y=0,z=theta; n = (n>CORDIC_NTAB) ? CORDIC_NTAB : n; for (k=0; k<n; ++k) { d = z>>31; //get sign. for other architectures, you might want to use the more portable version //d = z>=0 ? 0 : -1; tx = x - (((y>>k) ^ d) - d); ty = y + (((x>>k) ^ d) - d); tz = z - ((cordic_ctab[k] ^ d) - d); x = tx; y = ty; z = tz; } *c = x; *s = y; } 304 15 Obliczania numeryczne stałoprzecinkowe Cyfrowa filtracja rekursywna danych jest przykładem zastosowania implementacji stałoprzecinkowej, gdzie problemy numeryczne moga˛ być bardzo poważne. Obliczenia kolejnej wartości wyjściowej filtra rekursywnego maja˛ postać (x(n) - liczby wejściowe, y(n) - liczby wyjściowe): M y(n) = N ∑ bk x(n − k) − ∑ ak y(n − k), k=0 (15.11) k=1 Od strony obliczeniowej źródłem problemów jest zależność wielkości wyjściowej y(n) od poprzednich wartości wyjściowych: y(n − 1), ..., y(n − N). Tego typu sprz˛eżenie zwrotne może generowac bardzo duże i bardzo małe wartości pośrednie. Rodzi to niebezpieczenstwo przepełnienia, niedomiaru i utraty precyzji. Z tego powodu dane wyjściowe moga˛ zmieniać si˛e niestabilnie, a nawet rosnać ˛ w sposób nieograniczony. Aby ograniczyć wpływ bł˛edu numerycznego na wynik, stosuje sie specjalne struktury obliczeniowe, kaskad˛e tzw. sekcji bikwadratowych (czyli układów prostszych z opóźnieniami dwuelentowymi: typu y(n) = ∑2k=0 bk x(n − k) − ∑2k=1 ak y(n − k)). Wykonywana jest przez nia˛ ta sama˛ operacja co w równaniu (15.11), ale stabilniej. Analiza stabilości poszczególnej sekcji bikwadratowej jest dobrze opisana i umożliwia jej pełna˛ kontrol˛e [2] [3]. 15.8 Procesory sygnałowe Cyfrowe układy analizy i przetwarzania danych pomiarowych, zbieranych z różnych czujników (np. temperatury, ciśnienia, napr˛eżenia, pr˛edkości, ...; z mikrofonów, anten, ...; cały świat dokoła nas: zastosowania multimedialne, medyczne, wojskowe i dowolne inne, autonomiczny samochód, inteligentny dom, przemysł, itp. itd.) sa˛ zasypywane liczbami z przetworników analogowo-cyfrowych. Liczby te można interpretować jako liczby całkowite ze znakiem QM.0 (np. int8, int12, int16, ... albo jako liczby ułamkowe Q0.M (np. frac8, frac12, frac16, .... W tym drugim przypadku otrzymujemy liczby z przedziału [−1, 1). Podstawowa˛ operacja˛ wykonywana˛ przez procesor sygnałowy jest akumulowana suma (iloczyn skalarny) dwóch zbiorów liczb (dwóch sygnałów) {xn } oraz {yn }: N acc = ∑ xn · yn (15.12) n=1 Wyst˛epuja˛ trzy typowe sytuacje: 1. oba zbiory pochodza˛ z przetworników A/C (dane pomiarowe) i sa˛ ze soba˛ korelowane w celu znalezienia wyst˛epujacego ˛ podobieńtwa pomi˛edzy nimi (np. odebrany sygnał radarowy jest korelowany z sygnałem nadanym w celu wyznaczenia opóźnienia pomi˛edzy nimi - na tej podstawie oblicza si˛e odległość obiektu od radaru), 2. jeden zbiór, np. xn , pochodzi z przetwornika A/C (dane pomiarowe), a drugi yn jest sztucznie generowany i też jest z zakresu [−1, 1); sa˛ to: • współczynniki filtra cyfrowego yn = hn , dzi˛eki którym z sygnału xn sa˛ usuwane (odfiltrowane) niechciane czestotliwości, • wartości liczbowe wzorca cz˛estotliwości o kształcie funkcji sinus/kosinus, np. yn = cos(n · ∆ y) albo yn = sin(n · ∆ y) + j cos(n · ∆ y), dzi˛eki którym wynik operacji 15.12 informuje nas o sile wyst˛epowania konkretnej cz˛estotliwości w analizowanym sygnale (dla cz˛estotliwości f0 : ∆ y = 2π ffpr0 , gdzie f pr jest cz˛estotliwościa˛ próbkowania). 15.8 Procesory sygnałowe 305 Równanie (15.12) jest w praktyce implementowane jako akumulowana suma: acc = 0; acc = acc + x1 · y1 ; acc = acc + x2 · y2 ; acc = acc + x3 · y3 ; ... Procesory sygnałowe sa˛ specjalnie projektowane do szybkiej realizacji sprz˛etowej akumulowanej sumy. Cz˛esto maja˛ one osobna˛ pami˛eć P na program oraz dwa osobne bloki pami˛eci X i Y, z osobnymi magistralami adresowymi i danych, osobno dla danych xn i yn , które moga˛ pobierać równocześnie. Wykonuja˛ one sześć (6) operacji równocześnie dzi˛eki obliczeniom potokowym: • • • • (2) - inkrementacja dwóch k-tych wskaźników do pami˛eci X i Y, (2) - pobranie kolejnych danych xk−1 i yk−1 , (1) - wykonanie mnożenia wartości xk−2 · yk−2 , (1) - dodanie wyniku mnożenia do aktualnej zawartości akumulatora acc. Na rysunku 15.10 przedstawiono przykładowy program procesora Motorola/NXP DSP56300, napisany w asemblerze, służacy ˛ do filtracji cyfrowej sygnału metoda˛ średniej ważonej. W pami˛eci X jest sygnał xn , a w pami˛eci Y – wagi filtra yn = hn . W kolejnych liniach sa˛ wykonywane nast˛epujace ˛ operacje: • (1) wyzeruj akumulator CLR A, zapisz zawartość rejestru X0, z wartościa˛ z przetwornika A/C, do pami˛eci pod adres X:(R0)+, zwi˛eksz rejestr adresowy R0 o 1, pobierz współczynnik filtra z pami˛eci Y:(R4)+ do rejestru Y0, zwi˛eksz rejestr adresowy R4 o 1, • (1) powtórz (REP-eat) nast˛epna˛ intrukcj˛e NTAPS-1 razy, • (3) pomnóż zawartość rejestru procesora X0 przez zawarość rejestru Y0 i dodaj do aktualnej zawartości akumulatora A (instrukcja MAC), pobierz do X0 kolejna˛ próbk˛e sygnału z pami˛eci X spod adresu wskazywnego przez R0 - zwi˛eksz R0 o 1, pobierz do Y0 kolejna˛ próbk˛e sygnału z pami˛eci Y spod adresu wskazywnego przez R4 - zwi˛eksz R4 o 1; powtarzaj to NTAPS-1 razy, • wykonaj ostatnie mnożenie i zakumuluj wynik z zaokragleniem ˛ (MACR), zmniejsz zawartość rejestru adresowego R0 o 1. 306 15 Obliczania numeryczne stałoprzecinkowe Rysunek 15.10: Program filtracji cyfrowej metoda˛ średniej ważonej, napisany w assemblerze procesora DSP56300. Nie wszystko może być jeszcze w tej chwili zrozumiałe, ale mam nadziej˛e, że za chwil˛e znaki zapytania znikna.˛ Możesz wrócić do rysunku 15.10 po zapoznaniu si˛e z opisem poniżej. Na rysunku 15.11 jest przedstawiony schemat blokowy 24-bitowego procesora stałoprzecinkowego DSP563000, z trzema blokami pami˛eci: P, X, Y. Oczywiście bez programu jest on tylko nikomu niepotrzebnym kawałkiem krzemu. Jego środowisko programowe jest przedstawione na rysunku 15.12: assembler, linker, symulator, możliwość podłaczenia ˛ tzw. modułu uruchomieniowego Evaluation Module - szukaj w sieci "Symphony DSP56300 Studio Development Tools". Na rysunku 15.13 jest przedstawiona struktura logiczna (programowalne rejestry) procesora DSP56300: 4 rejestry 24-bitowe X1, X0, Y1, Y0 z możliwościa˛ połaczenia w dwa rejestry 48-bitowe [X1X0], [Y1Y0], oraz dwa 56-bitowe akumulatory A,B. Dodatkowo 8 zestawów rejestrów adresowych o numerach x=0-7: ADRES=(Rx+Nx) modulo Mx (R-główny, N - inkrementacji/dekrementacji, Mmodulo). Na ostatnim rysunku 15.14 jest pokazana jednostka arytmetyczno-logiczna (ALU) procesora: argumenty operacji moga˛ być 24-bitowe (rejestry: X0,X1,Y0,Y1) lub 48-bitowe (rejestry: [X1X0],[Y1Y0]), akumulatory A,B sa˛ 56-bitowe z zabezpieczeniem przed przepełnieniem i utrata˛ precyzji. 15.8 Procesory sygnałowe 307 Rysunek 15.11: Schemat blokowy 24-bitowego procesora stałoprzecinkowego DSP563000. 308 15 Obliczania numeryczne stałoprzecinkowe Rysunek 15.12: Środowisko uruchomieniowe procesora DSP563000. 15.8 Procesory sygnałowe 309 Rysunek 15.13: Rejestry wewn˛etrzne procesora SP56300: danych X,Y,A,B - podstawowe i akumulatory (góra) oraz adresowe R,N,M - główne, offsetowe, modulo (dół). 310 15 Obliczania numeryczne stałoprzecinkowe Rysunek 15.14: Jdnostka arytmetyczno-logiczna (ALU) procesora DSP563000 (góra) i rejestry danych - raz jeszcze (dół). Literatura 311 Problem 15.4 (* Zabawa assemblerem). Programowanie stałoprzecinkowe jest niskopoziome. Kod jest maksymalnie optymalizowany. Najcz˛eściej na poziomie assemblera konkretnego procesora, a nie na poziomie j˛ezyka C. Wejdź na stron˛e https://godbolt.org/. Napisz prosty program w j˛ezyku C i zobacz jak on wyglada ˛ w assemblerze, tzn. jakie instrukcje procesora sa˛ używane. 15.9 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu, ostatniego w cyklu, w krótkich żołnierskich słowach. • Cz˛eść wykładnicza daje przewag˛e liczb typu float w sytuacji kiedy przetwarzane dane charakteryzuja˛ si˛e duża˛ dynamika/zmienności ˛ a.˛ • Wokół 0 format Q0.31 ma lepsza˛ precyzj˛e. Bity nie sa˛ tracone na niepotrzebna˛ w tym przypadku cześć wykładnicza˛ (exponent). • Dla liczb wi˛ekszych i równych 1.0 nast˛epuje przepełnienie zakresu liczb Q0.31. • Dla liczb małych dokładność reprezentacji Q0.31 spada. • Liczby mniejsze od 2−31 leża˛ poza zakresem tego typu reprezentacji Q0.31. Co z tego wynika"? • typ stałoprzecinkowy można stosowac w obliczeniach z mała˛ dynamika˛ liczb, • trzeba uważać na przepełnienie (overflow) i niedomiar (underflow) w trakcie obliczeń, • bład ˛ reprezentacji małych liczb może być duży, • pociag ˛ wjechał na końcowa˛ stacj˛e. Podróżni sa˛ proszeni o sprawdzenie czy nie pozostawili ... czegoś .... gdzieś ... Literatura 1. Mathworks, Fixed Point Designer. Informacja on-line: https://www.mathworks.com/products/fixedpoint-designer.html 2. W. Półchłopek, R. Rumian, P. Turcza, "Podstawy arytmetyki stałoprzecinkowej", w Cyfrowe przetwarzanie sygnałów w telekomunikacji, T. Zieliński, P. Korohoda, R. Rumian (red.), PWN, str. 394-429, 2014. 3. M. Christensen, F. J. Taylor, "Fixed-point-IIR-filter challenges", EDN, 2006, str. 1-9, on-line: https://www.edn.com/fixed-point-iir-filter-challenges/ Rozdział 16 Podstawy numeryczne sztucznej inteligncji Streszczenie Wprowadzenie. Uczenie maszynowe i rozpoznawanie wzorców. Typowy przykład rozpoznawania. Regresja liniowa. Regresja logistyczna. Sieci neuronowe płytkie i głebokie. Algorytm propagacji wstecznej bł˛edów. 12 16.1 Wprowadzenie 16.1.1 Uczenie maszynowe Pod koniec kursu MeNu musimy wyt˛eżyć własna˛ inteligencj˛e, aby zrozumieć podstawy sztucznej inteligencji. Sztuczna inteligencja (AI - artificial intelligence) oznacza sprz˛et komputerowy i jego oprogramowanie, które maja˛ ambicje uczyć si˛e i odpowiednio modyfikować/rekonfigurować wraz z napływem nowych danych według algorytmu/modelu zoprojektowanego/zaprogramowanego przez twórców systemu, czyli elektroników i informatyków (zmiana używanych algorytmów oraz wartości ich parametrów). System sztucznej inteligencji ma wybrana˛ architektur˛e sprz˛etowo-programowa,˛ która może być przez niego automatycznie rekonfigurowana w zależności od rodzaju przetwarzanych danych wejściowych (data-driven). System dobiera: 1) odpowiednie wartości parametrów/współczynników (jest to niższy poziom AI z mniejsza˛ ingerencja˛ w program), oraz 2) algorytmy przetwarzania liczb, którymi dysponuje (wyższy poziom AI z samo-dostrajajacymi ˛ si˛e algorytmami/programami). Najlepszym przykładem jest uczacy ˛ si˛e ludzki mózg, który na poczatku ˛ jest mózgiem małego dziecka, ogladaj ˛ acego ˛ ze zdziwieniem po raz pierwszy swój pokoik, a potem mózgiem dorosłego człowieka, już wiedzacego ˛ jak wygladała ˛ Ziemia miliardy lat temu i jaka może być za miliony lat (rola uczenia si˛e, pomoc/wpływ: rodziców, szkoły, koleżanek i kolegów, mediów informacyjnych, ...). Dalekosi˛eżnym celem AI, w rozumieniu fantastyki naukowej, jest zbudowanie inteligentnych automatów uczacych ˛ si˛e i modyfikujacych ˛ si˛e, podobnych do ludzkiego mózgu - patrz rys. 16.1 3 . Jest to cel bardzo ambitny i trudny do osiani˛ ˛ ecia. 1 Bardzo dzi˛ekuj˛e dr inż. Jarosławowi Bułatowi i dyplomantowi Adamowi Ksi˛eżykowi za bardzo cenne uwagi dotyczace ˛ końcowej edycji tego rozdziału 2 Wi˛ ekszość programów zaprezentowanych w tym rozdziale to spolszczone wersje przykładów zawartych w repozytorium [12]: https:// github.com/ trekhleb/ machine-learning-octave 3 Obrazy pobrane z https:// pl.freepik.com/ darmowe-wektory/ 313 314 16 Podstawy numeryczne sztucznej inteligncji Rysunek 16.1: Mózg jako centrum dowodzenia każdego człowieka oraz neuron jako jego podstawowy element. Uczenie maszynowe (ML - machine learning), poprawniej uczenie maszyn czyli komputerów, to podzbiór AI - poj˛ecie w˛eższe (patrz rys. 16.2). W tym przypadku zakładamy niższy poziom adaptacji systemów: ich sprz˛et i oprogramowanie jest ściśle określone, zazwyczaj nadmiarowe, ale pod wpływem nauki (“to jest czarne, a to białe”) może samo iteracyjnie dobrać wartości liczbowe współczynników decyzyjnych, a nawet wyłaczyć wpływ pewnych ścieżek przetwarzania danych, ustawiajac ˛ wartość ich mnożników na ZERO. W konwecjonalnym programowaniu program działajac ˛ na określonych danych daje jakiś wynik, natomiast w uczeniu maszynowym wzorce danych i wynik oczekiwany z progromu wpływaja˛ na struktur˛e i wartości parametrów programu (patrz rys. 16.3). Rysunek 16.2: Klasyfikacja (wzajemne relacje) poj˛eć zwiazanych ˛ z AI. Rysunek 16.3: Porównanie post˛epowania w konwencjonalnym programowaniu oraz w zadaniach uczenia maszynowego. 16.1 Wprowadzenie 315 W tym przypadku szczególna˛ rol˛e odgrywa poczatkowy ˛ proces nauki: z nauczycielem mówiacym ˛ “dobrze/źle"lub bez niego - maszyna obserwuje wpływ danej wejściowej na wyjściowa˛ i zwi˛eksza wartości współczynników wagowych dla silnych zależności. Najlepiej kiedy trenowanie maszyny przeprowadza si˛e z użyciem dużej liczby danych (Big Data): wówczas można zakładać, że zostanie ona poprawnie nauczona, znajdzie najlepsze “nastawy” i b˛edzie można wierzyć jej decyzjom. Tak jak w przypadku doświadczonego lekarza, który już diagnozował bardzo wielu chorych. Systemy ML najpierw sa˛ uczone/trenowane za pomoca˛ wzorców stanów, a potem stosowane do znajdowania tych wzorców w nieznanych danych. Z tego powodu ML nazywa si˛e także rozpoznawaniem wzorców (pattern recognition). Nowe dane moga˛ być wykorzystywane do “douczenia” już istniejacych ˛ systemów ML. Na przykład dane nietypowego, nowego pacjenta wraz z informacja˛ o zdiagnozowanej chorobie moga˛ posłużyć do drobnej korekty wartości parametrów w oprogramowaniu. Rysunek 16.4 Kolejne etapy/operacje wyst˛epujace ˛ w uczeniu maszynowym. W klasycznym uczeniu maszynowym wyst˛epuja˛ nast˛epujace ˛ etapy (patrz rys. 16.4): 1. ekstrakcja cech (feature extraction) - po analizie i “zrozumieniu” istoty danych, wybiera si˛e taki zbiór cech (specyficznych właściwości), które najbardziej charakteryzuja˛ dane, tzn. bardzo si˛e różnia˛ dla różnych klas danych; np. mała/duża wartość wskaźnika PSA dla m˛eżczyzn z podejrzeniem raka prostaty podczas podejmowania decyzji zdrowy/chory; 2. redukcja zbioru cech (feature reduction) - po obliczeniu wartości wszystkich cech dla wielu zbiorów danych i ich porównaniu, zazwyczaj okazuje si˛e, że jedne z nich sa˛ bardziej czułe na wystapienie ˛ specyficznego “stanu” danych (duża różnica wartości dla stanów 0/1 - zdrowy/chory, np. wartość PSA) oraz że niektóre z nich sa˛ tak samo wrażliwe, czyli redundantne w zastosowaniu; wówczas pozostawia si˛e cechy najbardziej wrażliwe, a usuwa cechy małowrażliwe i redundantne; do redukcji wymiarowości zbioru cech stosuje si˛e metod˛e składowych głównych PCA (Principal Component Analysis) - patrz [22] tutaj; 3. dobór klasyfikatora (classifier selection): jego uczenie, walidacja i testowanie - testowanie skuteczności użycia różnych klasyfikatorów (modułów podejmuja˛ cych decyzj˛e o rodzaju danych, np. pacjent zdrowy/chory) na różnych zestawach pozostawionych cech i wybranie najskuteczniejszej pary (zbiór cech, klasyfikator); uczenie systemu i jego walidacj˛e przeprowadza si˛e na różnych zbiorach danych, osobnego dla uczenia (np. 70% danych)) i dla walidacji (np. 15% danych); w celu unikniacia ˛ grubego bł˛edu cz˛esto po zaprojektowaniu systemu przeprowadza si˛e jego końcowe testowanie na jeszcze innym podzbiorze danych (np. 15% 316 16 Podstawy numeryczne sztucznej inteligncji danych); w przypadku małej liczby danych proces uczenia i walidacji powtarza si˛e wielokrotnie, ale losowo zmieniajac ˛ dane uczace ˛ i walidacyjne (metoda k-fold); w przypadku posiadania dużej liczby danych oraz iteracyjnego uczenia sieci neuronowej, można podczas każdego powtórzenia cyklu uczenia używać tego samego zbioru uczacego ˛ i tego samego zbioru walidacyjnego, ale różnych od siebie - po każdym cyklu adaptacji wag sieci z użyciem wszystkich danych uczacych ˛ (po każdej tzw. epoce): 1) oblicza si˛e wartość funkcji kosztu/błedu dla danych uczacych ˛ i walidacyjnych, 2) oblicza si˛e dokładność rozpoznawania dla danych uczacych ˛ i walidacyjnych, 3) obserwuje si˛e otrzymywane krzywe i zatrzymuje proces uczenia w odpowiednim momencie - ma to zapobiec efektowi przeuczenia sieci, czyli nauczeniu si˛e przykładów ze zbioru treningowego na pami˛eć i utracenia zdolności podejmowania poprawnych decyzji dla nowych (nieznanych wcześniej danych), w tym przypadku walidacyjnych - patrz rysunek 16.5; aby zabezpieczyć si˛e przed popełnieniem dużego, przypadkowego bł˛edu (np. pech w doborze danych uczacych ˛ i walidacyjnych), po wytrenowaniu sieci (doborze wartości jej wag) sprawdza si˛e skuteczność jej działania dla zbioru testowego; 4. wnioskowanie dot. nieznanych danych (inference) z użyciem zwyci˛eskiej pary (zbiór cech + klasyfikator) - to obliczanie wartości elementów wybranego zbioru cech (tzn. pojedynczej liczby albo wektora/macierzy liczb) dla nowego, analizowanego zbioru danych, np. nowego pacjenta, oraz podj˛ecie decyzji przez klasyfikator, dotyczacej ˛ tego zbioru danych, np. pacjent zdrowy albo chory. 16.1 Wprowadzenie 317 Funkcja kosztu 1.5 Wartosc Uczenie Walidacja 1 0.5 0 5 10 15 20 25 30 35 40 Numer iteracji Dokladnosc 100 Uczenie Walidacja [%] 80 60 40 0 5 10 15 20 25 30 35 40 Numer iteracji a) Funkcja kosztu 4 Uczenie Walidacja Wartosc 3 2 1 0 0 5 10 15 20 25 30 35 40 Numer iteracji Dokladnosc 100 Uczenie Walidacja [%] 80 60 40 0 b) 5 10 15 20 25 30 35 40 Numer iteracji Rysunek 16.5: Porównanie wyników uczenia si˛e i walidacji dwóch różnych sieci neuronowych, pracujacych ˛ na dwóch różnych zbiorach danych. W obu przypadkach wraz ze wzrostem liczby powtórzeń cyklu nauki sieć coraz lepiej rozpoznaje przykłady ze zbioru uczacego, ˛ ale w zupełnie inny sposób reaguje na dane walidacyjne, które sa˛ dla niej nowe: a) poprawny proces: krzywa funkcji kosztu (bł˛edu rozpoznawania) dla walidacji maleje, zaś krzywa dokładności rozpoznawania rośnie, b) niepoprawny proces: krzywa funkcji kosztu (bł˛edu rozpoznawania) dla walidacji rośnie, a krzywa dokładności nie poprawia si˛e. Wszystkie powyższe operacje sa˛ bardzo ważne. Wejściowe zbiory danych moga˛ być bardzo duże (sygnały dźwi˛ekowe, obrazy, filmy, dane medyczne 3D, ...), natomiast zbiór cech powinien być mały, a mimo to pozwalajacy ˛ na przeprowadzenie poprawnej klasyfikacji, np. detekcji krwawienia w nagraniach edoskopowych poprzez obliczanie tylko zawartości koloru czerwonego w obrazie. Ogólnie, wartości cech dla tego samego typu danych (np. osób zdrowych albo osób chorych) powinny być zbliżone (np. niska albo wysoka wartość wskaźnika PSA), a dla innych rodzajów danych - maksymalnie różne. W przypadku pojedynczej cechy najprostsza˛ metoda˛ klasyfikacji jest progowanie: stan 1 jest rozpoznawany kiedy wartość cechy jest mniejsza niż próg, a stan 2 - kiedy 318 16 Podstawy numeryczne sztucznej inteligncji wi˛eksza lub równa. Dla wi˛ekszej liczby cech jednym z prostych i popularnych klasyfikatorów jest metoda K najbliższych sasiadów ˛ (K-nearest neighbors): 1) wartości cech, obliczone dla wzorców, sa˛ przechowywane w bazie danych, 2) znajduje si˛e K wzorców, których wektory cech sa˛ najbardziej podobne (według wybranej miary odległości) do wektora cech, otrzymanego dla analizowanych danych, 3) jako rozponany stan przyjmuje si˛e ten, który ma najwi˛ecej reprezentatów w zbiorze wzorców podobnych. Jednym z najskuteczniejszych klasyfikatorów jest metoda wektorów nośnych (SVM - Support Vector Machines). Przykład. Niech {(c1 , c2 )} oznacza zbiór wartości dwóch cech (c1 , c2 ), obliczonych dla wszystkich pacjentów. Najkorzystniej jest kiedy dla pacjentów zdrowych i chorych grupuja˛ si˛e one w przestrzeni 2D w dwóch, maksymalnie oddalonych od siebie obszarach (tworza˛ osobne “chmury” punktów) - patrz na lewa˛ stron˛e rys. 16.6. Ale nie zawsze tak jest - tym razem patrz na prawa˛ stron˛e rysunku. Kiedy cecha c1 oznacza liczb˛e napojów energetycznych wypijanych miesi˛ecznie, a cecha c2 — liczb˛e nieprzespanych nocy w tym samym okresie, to stan 1 (mało, mało) może oznaczać grup˛e niskiego ryzyka wystapienia ˛ problemów zdrotnych, a stan 2 (dużo, dużo) - grup˛e wysokiego ryzyka. Natomiast kiedy próbujemy zdiagnozować pi˛eć stanów pracy serca (np. norm˛e, arytmi˛e, migotanie przedsinków, rytm za wolny i rytm za szybki) za pomoca˛ zbioru 3 cech, to chcielibyśmy otrzymać 5 maksymalnie od siebie oddalonych “obłoków” punktów. Jak widać na rysunku rys. 16.6, w zależności od otrzymywanego rozkładu punktów podejmowanie decyzji może być prostsze lub trudniejsze. Im bardziej jednoznaczny jest rozkład (grupowanie si˛e) punktów w przestrzeni cech, tym prostszy może być klasyfikator (ponieważ zadaniem klasyfikatora jest znalezienie hiperpowierzchni, w szczególnym przypadku hiperpłaszczyzny: w naszym przypadku krzywej w przestrzeni 2D, rozdzielajacej ˛ ”obłoki” punktów różnych klas danych, np. zdrowy/chory). 16.1 Wprowadzenie 319 Rysunek 16.6: Ilustracja znaczenia wyboru cech c1 i c2 , które wykorzystuje si˛e łacznie ˛ do rozpoznania jednego z dwóch albo trzech stanów zdrowy/chory1/chory2 u każdego z diagnozowanych pacjentów: a) prosty przypadek - bardzo dobry wybór cech, dobra separacja stanów, liniowy klasyfikator, b) trudniejszy przypadek - gorsze właściwości separacyjne cech, cz˛eściowe nachodzenie na siebie przestrzeni stanów, trudniejszy/nieliniowy klasyfikator, c) bardzo trudny przypadek albo zły dobór cech - całkowicie wymieszane punkty dwóch stanów, d) niewypukły problem rozróżniania kilku stanów - dobra separacja stanów ale bardziej złożony klasyfikator. Oczywiście pojawiaja˛ si˛e nast˛epujace ˛ pytania: jakich cech? dlaczego 2-óch takich cech, a nie 3-ech albo 4-ech innych cech? na jakiej podstawie podejmować decyzj˛e, że 10-ty punkt (x10 , y10 ) należy przyporzadkować ˛ do konkretnej klasy? jaki klasyfikator zastosować (progowanie? K-najbliższych sasiadów? ˛ metod˛e wektorów nośnych SVM?) i jak przeprowadzać sama˛ klasyfikacj˛e? jakiej miary odległości pomi˛edzy stanami należy użyć? co zrobić w przypadku małej liczby danych, aby w wyniku uczenia klasyfikator nie nauczył si˛e “na pami˛eć” rozpoznawania konkretnych stanów (nie został przeuczony) i potrafił madrze ˛ “uogólniać/generalizować”? I w tym miejscu dochodzimy do jednego z podstawowych problemów klasycznego ML: aby sztuczna inteligencja poprawnie zadziałała należy ja˛ “zaprogramować” używajac ˛ własnej inteligencji, np. w zastosowaniach medycznych należy skorzystać z wiedzy całych pokoleń lekarzy, matematyków-fizyków-chemików (modelowanie procesów/obiektów) i informatyków. Ponieważ ML można użyć w przeróżnych scenariuszach na przeróżnych danych, “łatwych” i “trudnych”, proces doboru odpowiednich cech może być długi, żmudny i nie zawsze zakończony sukcesem. Dlatego cz˛esto zadanie automatycznego wyboru i ekstrakcji cech z “surowych” danych (pochodzacych ˛ z przetwornika analog-cyfra różnych urzadzeń) ˛ cz˛esto powierza si˛e do wykonania sieciom neuronowym. Maja˛ one wówczas nie tylko dokonywać klasyfikacji cech (po etapie uczenia, walidacji i testowania), ale także ich znalezienia i obliczania. Aby było to możliwe sieci musza˛ być wi˛eksze: splotowe albo głebokie. 320 16 Podstawy numeryczne sztucznej inteligncji 16.1.2 Sztuczne sieci neuronowe Sztuczne sieci neuronowe (ANN - artificial neural networks) to podzbiór metod ML, w którym wykorzystuje si˛e proste elementy obliczeniowe, tzw. neurony (patrz rys. 16.7), inspirowane biologicznie (bio-inspired). Tworzy si˛e z nich warstwy (layers) neuronów, a nast˛epnie łaczy ˛ si˛e ze soba˛ kolejne warstwy kaskadowo - jedna za druga˛ (patrz rys. 16.8). Neurony w poszczególnych warstwach pracuja˛ równolegle, zaś pomi˛edzy warstwami sa˛ połaczone ˛ metoda˛ każdy-z-każdym. Działanie klasycznego neuronu jest opisane nast˛epujacym ˛ równaniem: ! M y= f ∑ wm xm + b . (16.1) m=1 gdzie: xm - wejścia, { wm , b } - zmienne wewn˛etrzne neuronu, f (.) - funkcja aktywacji/decyzyjna, y - wyjście. Proste sieci ANN dokonuja˛ jedynie klasyfikacji/rozpoznawania rodzaju danych i oczekuja,˛ że na wejściu otrzymuja˛ wcześniej obliczone wartości cech danych. Wagi wi wszystkich neuronów sa˛ wcześniej dobierane podczas uczenia sieci na danych treningowych: w takim przypadku sieć wie jaka decyzja ma być podj˛eta i tak modyfikuje wagi, aby dla wi˛ekszości przypadków uczacych ˛ była to decyzja poprawna˛ (adaptacja metoda˛ decision-driven). Algorytm uczacy ˛ (wieloparametrycznej optymalizacji) minimalizuje bład ˛ pomi˛edzy obliczonym rezultatem rozpoznawania a rezultatem oczekiwanym (ground truth). W zależności od liczby wyjść decyzyjnych sieć ANN, przedstawiona na rysunku 16.8, może być: 1. klasyfikatorem binarnym, który ma tylko jedno wyjście, np. 1=chory, 0=zdrowy (jest to przypadek regresji logistycznej, która b˛edzie później omówiona; wówczas na wyjściu funkcji aktywacji jest prawdopodobieństwo tego, że pacjent jest chory, np. 0.9 czyli 90%); 2. klasyfikatorem wieloklasowym, który ma kilka wyjść; rodzaje: • multi-label - np. rozpoznawanie obiektów widocznych na zdj˛eciu, z predefiniowanego zbioru, które moga˛ wystapić: ˛ wszystkie na raz, w dowolnych kombinacjach albo wcale (np. dwa wyjścia: 11 = pies i kot, 10 = tylko pies, 01 = tylko kot, 00 = brak psa, brak kota); użycie regresji logistycznej; • multi-class - np. rozpoznawanie obiektów widocznych na zdj˛eciu, z predefiniowanego zbioru, z których może wystapić ˛ tylko jeden - one-vs-all (np. 10 wyjść i rozpoznawanie cyfr 0123456789: 2 = 0010000000); użycie techniki soft-max. Rysunek 16.7 Budowa numeryczna sztucznego neuronu, na nast˛epnych rysunkach oznaczanego jako N. W celu przyspieszenia obliczeń funkcja aktywacji i jej pochodna sa˛ cz˛esto obliczane metoda˛ interpolacji stablicowanych wartości. Kolor: czerwony - fukcja sigmoidalna, zielony - odmiana funkcji ReLU, praktycznie bardzo cz˛esto stosowana. 16.1 Wprowadzenie 321 Rysunek 16.8 Przykładowa struktura sieci neuronowej ANN typu MLP (Multi-Layer Perceptron - fully connected) z przepływem informacji od strony lewej do prawej: neurony Ni, j sa˛ grupowane w warstwy, które nast˛epnie sa˛ łaczone ˛ kaskadowo (i numer warstwy, j - numer neuronu): wyjście każdego neuronu warstwy poprzedniej jest podane na jedno z wejść każdego neuronu warstwy nast˛epnej. U nas na wejściu sa˛ obliczone wcześniej cechy c1 , c2 , c3 , a na wyjściu decyzje d1 , d2 . W pojedynczym neuronie liczby wejściowe xm sa˛ mnożone przez wagi wm , nast˛epnie wyniki wszystkich iloczynów sa˛ dodawane. Potem dodaje si˛e stała˛ przesuni˛ecia b (bias) i traktuje otrzymana˛ wartość sumaryczna˛ jako argument wybranej, nieliniowej funkcji aktywacji-decyzji f (.) (najlepiej ciagłej ˛ i różniczkowalnej: sigmoida, arcus tangens hiperboliczny, ...), przyjmujacej ˛ wartości z przedziału [0, 1] albo [-1, 1] (nie/tak - w obu przypadkach). Ponieważ funkcje sigmoidy i arcusa tangesa asympotycznie zmierzaja˛ do wartości 1 dla argumentu da˛żacego do nieskonczoności, powoduje to problemy z dokładnościa˛ obliczania ich pochodnych w tym przedziale. Z tego powodu cz˛esto stosuje si˛e funkcj˛e aktywacji ReLU (Rectified Linear Unit), narysowana˛ zielona˛ linia˛ na rysunku 16.7. Wymaga to jednak rozwiazania ˛ problemu obliczania wartości tej funkcji w okolicy z = 0. Klasyczna sieć neuronowa jest zbiorem kaskadowo połaczonych ˛ warst neuronów (patrz rys. 16.8: wejściowej, kilku pośrednich i wyjściowej. Sieć ma zawsze tyle wejść ile elementów ma wektor cech, np. 2 dla (c1 , c2 ) albo 3 dla (c1 , c2 , c3 ). Natomiast liczba neuronów w warastwie wyjściowe zależy od rodzaju przeprowadzanej klasyfikacji: • w klasyfikacji binarnej sieć ma jeden neuron z funkcja˛ aktywacji typu sigmoid, która pokazuje prawdopodobieństwo P(d = d1 ) przynależności przykładu do klasy #1 - wówczas przynależność przykładu do klasy #2 jest równe P(d = d2 ) = 1 − P(d = d1 ); • w klasyfikacji wieloklasowej (multi-class) i wieloetykietowej (multi-label) sieć ma tyle wyjść ile klas albo etykiet ma rozpoznawać (“rozmyte”, sigmoidalne decyzje d1 , d2 , ..., dM ; przykładowo sa˛ to prawdopobobieństwa tego, że na pojedynczym bloku punktów na obrazku jest przedstawiona cyfra 0, 1, 2, ..., 9 i tylko jedna z cyfr może wystapić ˛ - problem softmax), ALBO tego, że na obrazku jest kot (rozmyta decyzja d1 ) oraz pies (rozmyta decyzja d2 ), w sytuacji gdy jedno i drugie jest możliwe (00, 01, 10, 11). Przykładowo dla sieci majacej ˛ tylko jedna˛ warstw˛e, używajacej ˛ tylko dwóch cech i rozpoznajacej ˛ tylko dwa stany, mamy dwa wejścia i tylko dwa neurony: d1 = f (w1,1 c1 + w1,2 c2 + b1 ) , (16.2) d2 = f (w2,1 c1 + w2,2 c2 + b2 ) , (16.3) Wówczas na wyjściu d1 oczekujemy informacji o mierze przynależności wektora cech (c1 , c2 ) do klasy 1, a na wyjściu d2 - do klasy 2. W procesie nauki/trenowania sieć powinna znaleźć najlepsze wartości dwóch współczynników w1,1 , w1,2 neuronu pierw- 322 16 Podstawy numeryczne sztucznej inteligncji szego oraz wartości dwóch współczynników w2,1 , w2,2 neuronu drugiego. W procesie rozpoznawania powinna je już tylko stosować. Podj˛ecie decyzji sprowadza si˛e do progowania wyjścia funkcji aktywacji. W trudniejszym przypadku pomi˛edzy wejściami sieci a warstwa˛ wyjściowa˛ może istnieć wiele warstw wewn˛etrznych (pośrednich), najcz˛eściej jedna, dwie albo trzy, o różnej liczbie neuronów. Na wejścia każdego neuronu w warstwie nast˛epnej wchodza˛ wyjścia wszystkich neuronów z warstwy poprzedniej. Sa˛ one mnożone przez współczynniki wagowe danego neuronu. Zadaniem sieci jest dobranie wartości wszystkich tych współczynników na etapie uczenia wzorcami (długi proces), a nast˛epnie tylko wykonanie odpowiednich mnożeń podczas rozponawania/klasyfikacji (szybka operacja). Wartości funkcji decyzyjnych neuronów warstwy wyjściowej sa˛ prawdopodobieństwami znalezienia konkretnych stanów w danych wejściowych (0 to zdecydowanie NIE, 1 to zdecydowanie TAK, 0.5 to “na dwoje Babka wróżyła”). Wartości wag modyfikuje si˛e w procesie uczenia w kierunku zmniejszania si˛e tzw. funkcji kosztu-bł˛edu, proporcjonalnie do pochodnej czastkowej ˛ tej funkcji wzgl˛edem konkretnej wagi, ale ze znakiem minus (czyli w kierunku przeciwnyn do przyrostu wartości funkcji, ... czyli przeciwnym do jej gradientu). Z tego powodu fundamentem praktycznej implementacji sieci neuronowych na etapie uczenia jest umiej˛etność wykonania nast˛epujacych ˛ dwóch operacji: 1. numerycznego obliczenia pochodnych czastkowych ˛ funkcji kosztu wzgl˛edem wielu wag (szybka,˛ stabilna˛ implementacja˛ tej operacji zajmuje si˛e zagadnienie automatycznego różniczkowania - automatic differentiation), które ma fundamentalne znaczenie w ANN), 2. równoczesnej adaptacji wag bardzo wielu neuronów, najcz˛eściej z użyciem algorytmu najwi˛ekszego spadku funkcji kosztu (steepest descend optimization), z wykorzystaniem wcześniej obliczonych pochodnych; cz˛esto używa si˛e terminu SGD (Stochastic Gradient Descent), podkreślajacego ˛ fakt, że dane uczace, ˛ wykorzystywane do obliczenia pochodnych, sa˛ podawane na sieć w losowej kolejności; ponieważ w celu zmniejszenia bł˛edu obliczania pochodnych oblicza si˛e średnie wartości pochodnych dla mniejszych paczek danych wejściowych, tzw. batch-y, używane jest też określenie batch/minibatch SGD. I właśnie tych dwóch zagadnień b˛eda˛ dotyczyły nasze zabawy podczas tego laboratorium w aspekcie ANN: obliczania pochodnych i algorytmów optymalizacji/minimalizacji. Podsumowanie. W ogólności pod poj˛eciem ANN rozumie si˛e sieci o dowolnej strukturze połaczeń ˛ dowolnie zbudowanych neuronów, czyli jest to poj˛ecie najszersze. Powyżej została opisana jedynie klasyczna struktura ANN z podstawowym rodzajem neuronu. W przypadku małej liczby warstw i małej liczby neuronów w każdej warstwie, sieci te moga˛ spełniać jedynie funkcje klasyfikatora danych. Natomiast w przypadku dużej liczby warstw i neuronów - moga˛ dodatkowo przeprowadzać także operacj˛e ekstrakcji cech. W takim przypadku sa˛ one nazywane głebokimi sieciami neuronowymi (DNN - deep neural networks). Sieci DNN zacz˛eto używać w chwili kiedy komputery stały si˛e odpowiednio wydajne: szybkie oraz z dużym rozmiarem pami˛eci. Wcześniej do mniejszych ANN zacz˛eto dodawać specjalne bloki funkcyjne, odpowiedzialne za ektrakcj˛e cech metoda˛ splotu (convolution) “surowych” danych wejściowych ze specjalnymi wagami przetwarzajacymi/filtruj ˛ acymi ˛ (technika superpozycji liniowej). Wagi te trzeba było dobrać na etapie uczenia sieci. Ich użycie powodowało lokalne uśrednianie danych wejściowych (znajdowanie trendu) albo lokalne zróżniczkowanie (wydobycie kraw˛edzi/konturów). Sieci wykorzystujac˛ ˛ e t˛e technik˛e sa˛ znane jako CNN (Convolutional Neural Networks). 16.1 Wprowadzenie 323 16.1.3 Splotowe sieci neuronowe Splotowe sieci neuronowe (CNN - convolutional neural networks) charakteryzuja˛ si˛e budowa˛ hybrydowa˛ (patrz rys. 16.9: ich pierwsze warstwy o specyficznej strukturze realizuja˛ operacje automatycznej ekstrakcji cech i redukcji liczby danych, a dopiero za nimi znajduje si˛e właściwy, już prostszy (mniej wejść) klasyfikator ANN . Na poczatku ˛ sieci wyst˛epuja˛ warstwy filtrów splotowych o dopasowywanych współczynnikach wk oraz warstwy filtrów uogólniajacych ˛ (pooling), pozostawiaj ˛ acych ˛ jedynie lokalne wartości maksymalne. Warstw tych może być kilka i moga˛ one wyst˛epować naprzemiennie. Sieci CNN sa˛ stosowane przede wszystkim do macierzy danych, np. obrazów. Rysunek 16.9: Architektura splotowych sieci neuronowych: 1) poczatkowe ˛ warstwy filtrujace ˛ (splotowe i uogólnienia, może być ich kilka i moga˛ wyst˛epować naprzemienniw) działaja˛ na dużej liczbie surowych (raw) danych wejściowych xn i adaptuja˛ w procesie uczenia swoje współczynniki (wybór sposobu ekstrakcji i redukcji cech ck dokonuje si˛e automatycznie), 2) klasyfikacja i podejmowanie decyzji dk sa˛ wykonywane przez klasyczna˛ sieć ANN, majac ˛ a˛ struktur˛e podobna˛ do przedstawionej na rys. 16.8. Przyst˛epne graficzne wytłumaczenie działania CNN, połaczone z animacja,˛ jest przedstawione w [21] - kliknij tutaj. Na poczatku ˛ w sieciach CNN w kilku pierwszych warstwach splotowych jest wykonywana kaskadowo operacja splotu/filtracji 1D/2D/3D danych - jej równanie jest podane na rysunku 16.9. Wartości wyjściowe z filtrów, np. o wymiarach 3 × 3 albo 5 × 5 w przypadku 2D, sa˛ przetwarzane nieliniowo przez funkcj˛e decyzyjna˛ f (.), tak jak w ANN. Wartości wagowe filtrów splotowych wk sa˛ dobierane/dopasowywane adaptacyjnie do danych podczas uczenia - sa˛ stosowane takie same wagi splotowe dla wszystkich danych wejściowych konkretenej warstwy splotowej. Jest to pierwszy etap wst˛epnego przetwarzania danych: redukcji ich liczby oraz ekstrakcji cech. Po warstwach splotowych wyst˛epuja˛ warstwy łaczenia ˛ (pooling), w których sa˛ stosowane maksymalne filtry 2D, pozostawiajace ˛ tylko maksymalne wartości z lokalnych bloków danych. Jest to drugi, a zarazem ostatni etap redukcji i ekstrakcji cech. Ostatnie warstwy sieci CNN maja˛ struktur˛e identyczna˛ jak w ANN: one przetwarzaja˛ już dane 1D, a nie 2D albo 3D. Sa˛ to warstwy odpowiedzialne za rozpoznawanie obliczonych cech. Liczba neuronów w warstwie ostatniej/wyjściowej jest 324 16 Podstawy numeryczne sztucznej inteligncji równa liczbie rozpoznawanych klas. Jak widać na kolejnych etapach przetwarzania dane sa˛ “spłaszczane” pod wzgl˛edem ich liczby/rozmiaru (flattening). 16.1.4 Gł˛ebokie sieci neuronowe Gł˛ebokie sieci neuronowe (DNN - deep neural networks) to sieci o strukturze ANN, ale z bardzo duża˛ liczba˛ warstw i neuronów w każdej warstwie, które dzi˛eki swojej złożoności dokonuja˛ nie tylko operacji rozpoznawania/klasyfikacji, tak jak proste ANN, ale także automatycznej ekstrakcji cech. Z powodu swojej złożoności układowej wymagaja˛ one ucia˛żliwego, czasochłonnego uczenia bardzo dużymi zbiorami wzorców (ponieważ sieć ma dużo parametrów, gdyż jest g˛esta/gł˛eboka, to wymaga dużej liczby danych wejściowych aby nie była w stanie zapami˛etać wszystkich przykładów, czyli si˛e przeuczyć - nauczyć “na pami˛eć"). Z tego powodu sa˛ stosowane od niedawna (ostatnie 10 lat). DNN to kolejny krok w rozwoju sieci neuronowych. W ANN zakładano, że cechy już zostały poprawnie wybrane i obliczone. Sieć musiała dokonać tylko klasyfikacji danych (zdrowy/chory) - w tym celu musiała dobrać odpowiednie wartości wag podczas uczenia, a potem je stosować podczas rozpoznawania. W CNN zakładano, że na wejściu sieci sa˛ “surowe” (raw) dane. Sieć sama miała dokonać ekstrakcji cech - temu służyły warstwy splotowe oraz warstw łaczenia/uogólnienia. ˛ Za nimi wyst˛epowała klasyczna sieć ANN. Sieć DNN nie posiada oddzielnych, specjalizowanych warstw splotowych i łaczenia/uogólnienia, ˛ służacych ˛ do ekstrakcji cech. Ma ona struktur˛e ANN, ale z bardzo duża˛ liczba˛ wejść, warstw i elementów w każdej warstwie. Dlatego jest trudna do uczenia: wymaga ona przeprowadzenia zdecydowanie wi˛ekszej liczby obliczeń, dodatkowo o wiele bardziej wymagajacych ˛ pod wzgl˛edem dokładności numerycznej (np. w przypadku kaskadowego obliczania pochodnych czastkowych ˛ dużych macierzy zmiennych - poczytaj o vanishing gradients i exploding gradients oraz o znaczeniu użycia nienasycajacej ˛ si˛e funkcji aktywacji ReLU w tym aspekcie). Jednak komputery mamy coraz szybsze, dlatego takie nadmiarowe rozwiaza˛ nie brutal-force mimo wszystko sprawdza si˛e (“daje rad˛e”). A my mamy tylko jedna˛ “czarna˛ skrzynk˛e” i prosimy “stoliczku nakryj si˛e” sam. Na rysynku 16.2 podsumowano wzajemne relacje, wyst˛epujace ˛ pomi˛edzy opisanymi metodami sztucznej inteligencji. Koleje elementy teorii AI zostana˛ przedstawione podczas przykładów omawianych poniżej. 16.2 Uczenie maszynowe klasycznie Na rysunku 16.4 przedstawiono kolejne etapy/operacje, wyst˛epujace ˛ w klasycznym uczeniu maszynowym. W tym rozdziale opiszemy je na przykładach, w szczególnym przypadku rozwiazuj ˛ ac ˛ zadanie rozróżniania oddechu astmatycznego od normalnego. Przyjmiemy obecnie punkt widzenia inżyniera z zakresu technologii informatycznych, który chce szybko rozwiazać ˛ zadanie, integrujac ˛ różne dost˛epne narz˛edzia (funkcje biblioteczne) - w naszym przypadku dost˛epne w środowisku Matlab. 16.2 Uczenie maszynowe klasycznie 325 16.2.1 Program demonstracyjny Jak integracja istniejacych “cegiełek”, to integracja. Zaczniemy od prostego przykładu. Przyjmijmy, że losowo generujemy N punktów (x,y), leżacych ˛ na płaszczyźnie 2D w kwadracie o wierzchołkach w punktach (-1,-1) oraz (1,1). Nast˛epnie wybieramy funkcj˛e y = f (x) (parabola, sinusoida albo dowolna, zaproponowana przez nas) oraz punkty leżace ˛ powyżej jej krzywej zaliczamy do klasy 1, a pozostałe do klasy 0. Potem dzielimy zbiór punktów na dwa podzbiory (punkty o numerach nr=1:2:N oraz nr=2:2:N), teraz równoliczne. Pierwszy z nich stosujemy do nauki “maszynki” ML (funkcje fit, train), a drugi do jej testowania (funkcje predict, classify). Używamy klasyfikatora SVM. Otrzymujemy wynik przedstawiony po lewej stronie rysunku 16.10. Potem modyfikujemy program i dodajemy możliwość zdefiniowania klasy 1 jako punktów leżacych wewnatrz ˛ okr˛egu o zadanych parametrach, a klasy 0 - na zewnatrz ˛ okr˛egu. Ponownie uczymy i testujemy klasyfikator. Otrzymujemy wynik przedstawiony po prawej stronie rysunku 16.10. Na obu wykresach, lewym i prawym, narysowano czarna˛ lini˛e, rozgraniczajac ˛ a˛ obszary 1 (*) i 0 (*), oraz niebieskie okr˛egi, wskazujace ˛ punkty źle sklasyfikowane. Problem 16.1 ((L)(*)...(*) Testowanie i modyfikacja programu demonstracyjnego do uczenia maszynowego (rozpoznawania wzorców)). Zapoznaj si˛e z programem 16.1), uruchom go i sprawdź poprawność jego działania - program powinien szcz˛eśliwe si˛e zakończyć, a my powinniśmy zobaczyć jeden z wykresów, przedstawionych na rysunku 16.10. (*) Wybierz funkcj˛e paraboli. Kolejno ustaw wartości N=200, 1000, 2000, 5000, 10000, 20000 i uruchamiaj program. Sprawdź czy bład procentowy rozpoznawania zmniejsza si˛e, kiedy zbiór uczacy ˛ rośnie. Narysuj t˛e zależność. (*) Wybierz funkcj˛e paraboli. Ustaw N=10000 oraz zwi˛ekszaj liczb˛e punktów ucza˛ cych, kosztem punktów testowych, np. punkt testowy jest co 2-gi, 3-trzeci, 4-ty, 5-ty ... Sprawdź czy bład procentowy rozpoznawania zmniejsza si˛e, kiedy zbiór uczacy ˛ rośnie. Narysuj t˛e zależność. (*) Wybierz funkcj˛e okr˛egu. Ustaw N=10000. Uruchamiaj program i zwi˛ekszaj promień okr˛egu R=0.1,0.2,0.3,...,1.0. Sprawdź czy duża różnica w liczbie przykładów dla każdej klasy ma wpływ na procentowy bład ˛ rozpoznawania. Narysuj t˛e zależność. (*) Ustaw N=2000. W myfun() wybierz funkcj˛e sinusoidy. Uruchom program dla różnych wartości parametru P = 0.25, 0.5, 0.75, 1, 1.5, oznaczaja˛ cego liczb˛e okresów sinusoidy. Obserwuj liczb˛e i położenie bł˛edów, popełnionych podczas rozpoznawania. Powtórz eksperyment dla N=20000. Jaki wniosek możemy wyciagn ˛ ać? ˛ (*) W dowolnym z powyższych zadań sprawdź efektywność użycia różnych ’KernelFunction’ w procedurze fitcsvm() - porównaj liczb˛e popełnionych bł˛edów. (*) Znajdź i zastosuj dowolne zamienniki funkcji Matlaba fitcsvm(), predict(). Dla dowolnego z powyższych zadań porównaj liczb˛e popełnionych bł˛edów. (**) Zmodyfikuj program tak, aby rozpoznawał on dwie klasy punktów (1)(2), należace ˛ do dwóch rozłacznych ˛ albo nachodzacych ˛ na siebie okr˛egów. (***) Zmodyfikuj program tak, aby rozpoznawał on trzy różne klasy punktów (1)(2)(3), np. należace ˛ do trzech rozłacznych albo nachodzacych ˛ na siebie okr˛egów. 326 16 Podstawy numeryczne sztucznej inteligncji Wynik rozpoznawania (*) i bledne decyzje (o) 1 0.8 0.8 0.6 0.6 0.4 0.4 0.2 0.2 C2 C2 1 0 0 -0.2 -0.2 -0.4 -0.4 -0.6 -0.6 -0.8 -0.8 -1 -1 -0.5 0 C1 0.5 1 Wynik rozpoznawania (*) i bledne decyzje (o) -1 -1 -0.5 0 0.5 C1 Rysunek 16.10: Wynik działania programu 16.1 - rozpoznawanie czy punkt (x, y) = (c1 , c2 ) należy do klasy 1 (czerwony symbol “*” = powyżej paraboli albo wewnatrz ˛ okr˛egu) czy do klasy 0 (zielony symbol “*” = poniżej paraboli albo na zewnatrz ˛ okr˛egu). Czarna linia rozgranicza dwie klasy, niebieskie okr˛egi “o”oznaczaja˛ punkty niepopawnie przyporzadkowane/sklasyfikowane. ˛ Listing 16.1: Program Matlaba demostrujacy ˛ Testowanie wpływu rozkładu wartości badanej jednej cechy na jakość rozpoznawania metoda˛ progowania % ai_0_demo.m clear all; close all; rng(1); % inicjalizacja generatora liczb losowych % Generacja cech (normalnie obliacznie/ekstrakcja cech na podstawie danych) N = 2000; % liczba przykladow/wzorcow: 200, 2000, 20000 C = 2*(rand(N,2)-0.5); % N wierszy, 2 cechy/przyklad (2 kolumny) - liczby [-1...1] figure; plot(C(:,1),C(:,2),’.’); xlabel(’C1’); ylabel(’C2’); title(’Rozklad cech’); % Definicja klas danych klasa = zeros(N,1); % 0 = norma x = C(:,1); y = C(:,2); % 1 = patologia if(0) klasa( y > myfun(x) ) = 1; % nasza funkcja xg = -1 : 0.01 : 1; yg = myfun( xg ); % graniczna krzywa (xg,yg) else R = 0.75; x0 = 0; y0 = 0; % kolo o prom. R o srodku (x0,y0) klasa( sqrt( (x-x0).^2 + (y-y0).^2 ) < R ) = 1; % wnetrze kola to klasa 1 fi = 0:pi/100:2*pi; xg = x0+R*sin(fi); yg = y0+R*cos(fi); end % Uczenie nr = 1:2:N; svmStruct = fitcsvm( C(nr,:), klasa(nr), ’KernelFunction’,’RBF’); % Testowanie nr = 2:2:N; decyzja = predict( svmStruct, C(nr,:) ); % Bledy ind = find( decyzja~=klasa(nr) ); % indeksy blednych decyzji bledy = length( ind ), % liczba blednych decyzji procent = bledy / length( nr ) * 100, % procent blednych decyzji % Rysunek figure; ind1 = find( decyzja==1 ); ind0 = find( decyzja==0 ); plot(C(nr(ind1),1),C(nr(ind1),2),’r*’,C(nr(ind0),1),C(nr(ind0),2),’g*’); grid; axis([-1,1,-1,1]); axis square; hold on; xlabel(’C1’); ylabel(’C2’); title(’Wynik rozpoznawania (*)’); pause plot(xg,yg,’k-’, C(nr(ind),1), C(nr(ind),2), ’bo’,’LineWidth’,1); title(’Wynik rozpoznawania (*) i bledne decyzje (o)’); % ####################### 1 16.2 Uczenie maszynowe klasycznie 327 function [y] = myfun(x) y = x.^2 + 0.5*x - 0.5; % parabola % P=0.75; y = cos(P*2*pi*x); % cosinus: P=0.25, 0.5, 0.75, 1, 1.5, 2 end 16.2.2 Miary skuteczności rozpoznawania Za chwil˛e zbudujemy “programowa˛ maszynk˛e”, na wejście której podamy zapisy mikrofonowe ludzkiego oddechu, liczace ˛ kilkaset lub kilka tysi˛ecy liczb, i od której b˛edziemy oczekiwali podj˛ecia decyzji czy konkretny oddech jest astmatyczny (wynik pozytywny) czy normalny (wynik negatywny). Jak ocenić jej skuteczność? Jak można porównywać mi˛edzy soba˛ różne wersje naszej “maszynki”? Rysunek 16.11: Graficzne wytłumaczenie budowy macierzy pomyłek, popełnianych w procesie rozpoznawania okr˛egów (stan 1) od nieokr˛egów (stan 0), oraz podstawowych poj˛eć/definicji zwiazanych ˛ z uczeniem maszynowym: TP, TN, FP, FN, czułość (TPR), swoistość (TNR), prezycja (PPV) oraz NPR - patrz tabela 16.1 z wyjaśnieniem oznaczeń. Rysunek 16.11 ma nam pomoć w zrozumieniu metodyki i terminologii, zwiazanej ˛ z zagadnieniem rozpoznawania. Załóżmy, że rozpoznajemy nie-okr˛egi (u nas astma patologia) od okr˛egów (norma - porzadek). ˛ Po wyborze i implementacji odpowiednich algorytmów testujemy zbudowane urzadzenie. ˛ Podajemy na jego wejście nie-okr˛egi i okr˛egi oraz patrzymy jaka˛ decyzj˛e otrzymujemy z “maszynki”. Stwierdzamy wyst˛epowanie nast˛epujacych ˛ przypadków: • • • • TP (True-Positive): nie-okrag ˛ → nie-okrag, ˛ FN (False-Negative): nie-okrag ˛ → okrag, ˛ FN (False-Positive): okrag ˛ → nie-okrag, ˛ TN (True-Negative): okrag ˛ → okrag. ˛ Na podstawie wyników liczbowych budujemy kwadratowa˛ macierz pomyłek o wymiarach 2 × 2 (2 wejścia i 2 wyjścia), taka˛ jak na rysunku 16.11. Jej elementami sa˛ 328 16 Podstawy numeryczne sztucznej inteligncji wartości TP, FN, TN oraz FN. Na ich podstawie wyliczamy nast˛epujace ˛ miary jakości rozpoznawania: precyzj˛e (PPV), czułość (TPR), swoistość (TNR), dokładność (ACC) oraz F1 (patrz rys. 16.11 oraz tabela 16.1). Załóżmy, że mamy 100 nie-okr˛egów testowych i 1000 okr˛egów (zazwyczaj osób chorych (nie-okrag) ˛ jest wi˛ecej niż zdrowych (okrag)). ˛ Wówczas w wyniku testowania moglibyśmy otrzymać wynik, przedstawiony na rysunku 16.12. Rysunek 16.12: Przykład obliczania miar jakości rozpoznawania dla konkretnych wartości liczbowych przyj˛etych na rys. 16.11 - patrz tabela 16.1 z wyjaśnieniem oznaczeń. Jeśli rozpoznawalibyśmy cztery różne stany, to macierz/tablica pomyłek mogłaby przyjać ˛ nast˛epujac ˛ a˛ postać: 90 5 10 20 5 180 10 16 2 3 8 7 250 30 14 350 czułość1 = czułość2 = czułość3 = czułość4 = 90 90+5+2+3 180 180+5+8+7 250 250+10+10+30 350 350+20+16+14 90 precyzja1 = 90+5+10+20 180 precyzja2 = 180+5+10+16 250 precyzja3 = 250+2+8+14 350 precyzja4 = 350+3+7+30 Definicje najważniejszych miar jakości zebrano w tabeli 16.1. Która z nich jest najważniejsza? Dla klasyfikatora binarnego najważniejsza jest dokładność (accuracy) jako łaczna ˛ miara procentowa poprawności wszystkich wyników, zarówno “nieokr˛egów” jak i “okr˛egów”, definiowana jako stosunek sumy elementów macierzy pomyłek, leżacych ˛ na głównej przekatnej, ˛ do sumy wszystkich elementów tej macierzy. Natomiast dla klasyfikatora wielo-klasowego bardzo ważna jest miara F1, czyli średnia harmoniczna precyzji i czułości. W tym miejscu należy zwrócić uwag˛e, że do obliczonych wskaźników jakości rozpoznawania możemy “mieć zaufanie”, jeśli zostały one wyliczone w sytuacji, kiedy dysponowaliśmy duża˛ liczba˛ przykładów dla każdej z klas (balanced data set). W przeciwnym przypadku (imbalanced data set) moga˛ być nie niemiarodajne (np. dla 16.2 Uczenie maszynowe klasycznie 329 10000 osób zdrowych i 10 chorych, klasyfikacja wszystkich jako zdrowych to dokładność 99.9%). Tabela 16.1: Definicje miar skuteczności rozpoznawania zinterpretowane medycznie dla przykładu detekcji choroby - patrz https:// en.wikipedia.org/ wiki/ Sensitivity_and_ specificity Symbol Nazwa Definicja matematyczna Komentarz - interpretacja medyczna TP TN FP FN ACC PPV NPV TPR TNR F1 True Positive - prawdziwie dodatni True Negative - prawdziwie ujemny False Positive - fałszywie dodatni False Negative - fałszywie ujemny Accuracy - dokładność Positive Predictive Value, precision - precyzja Negative Predictive Value True Positive Rate, sensitivity, recall - czułość True Negative Rate, specificity - swoistość F-measure - F-miara – – – – osoba chora zdiagnozowana jako chora osoba zdrowa zdiagnozowana jako zdrowa osoba zdrowa zdiagnozowana jako chora osoba chora zdiagnozowana jako zdrowa jaka cz˛eść wszystkich wyników jest poprawna jaka cześć wyników dodatnich jest poprawna jaka cześć wyników ujemnych jest poprawna jaka cz˛eść wyników dodatnich została odkryta jaka cz˛eść wyników ujemnych została odkryta miara skuteczności detekcji prawdy/choroby T P+T N T P+T N P+N = T P+T N+FP+FN TP T P+FP TN T N+FN TP TP P = T P+FN TN TN = N T N+FP 2PPV ·T PR PPV +T PR Rozpatrzmy bardzo prosty przypadek: dokonujemy pomiaru markera jakiejś choroby. Dla osób zdrowych ma on wartość mała,˛ a dla chorych — duża.˛ Załóżmy, że kształt histogramu zmierzonej wartości jest w obu przypadkach opisany funkcja˛ Gaussa, tylko o różnych wartościach średnich, tak jak pokazano na dwóch górnych wykresach rysunku 16.13. W takim przypadku najprostsza˛ metoda˛ rozpoznania stanu chorobowego byłoby porównanie obliczonej wartości markera z progiem: wartość mniejsza od progu oznaczałaby stan “zdrowia”, a wi˛eksza - stan “choroby”. Czułość metody to stosunek pola cz˛eści czerwonej gaussoidy leżacej ˛ powyżej progu do jej całego pola, natomiast swoistość metody to stosunek pola cz˛eści niebieskiej gaussoidy leżacej ˛ poniżej progu do jej całego pola. Najlepiej, aby obie gaussoidy byłaby jak najbardziej odseparowane od siebie, a wartość progowa leżała +/- centralnie pomi˛edzy nimi. Kiedy zmieniamy monotonicznie wartość progu od liczby małej (np. -8) do dużej (np. +8), to otrzymujemy krzywe czułości i swoistości rozpoznawania metoda˛ progowania, pokazane na środkowych rysunkach: w przypadku wi˛ekszego odseparowania histogramów, przecinaja˛ si˛e one wyżej. Z tego powodu do wyboru metody rozpoznawania cz˛esto stosuje si˛e krzywa˛ ROC (Receiver Operating Characteristic), otrzymana˛ w wyniku narysowania czułości metody w funkcji (1-swoistość) (odejmowanie wartości swoistości od jedynki!) - patrz dolne wykresy na rysunku 16.13: ta cecha i metoda jest lepsza, dla której krzywa ROC szybciej pnie si˛e do góry. Na rysunku 16.14 sa˛ pokazane krzywe ROC, obliczone dla różnych cech, użytych do rozpoznawania oddechów astmatycznych metoda˛ progowania - patrz [13]. 330 16 Podstawy numeryczne sztucznej inteligncji 104 4 Histogramy dla cechy #1 3.5 Histogramy dla cechy #2 Zdrowy Chory 3.5 3 3 zdrowie próg Liczba przypadkow Liczba przypadkow 104 4 Zdrowy Chory choroba 2.5 2 1.5 2.5 2 1.5 1 1 0.5 0.5 0 -8 -6 -4 -2 0 2 4 6 0 -6 8 -4 -2 0 Wartosc cechy 1 6 8 0.8 0.8 0.7 0.7 0.6 0.5 0.4 0.3 0.6 0.5 0.4 0.3 0.2 0.2 0.1 0.1 0 -8 -6 -4 -2 0 2 4 6 Swoistosc Czulosc 0.9 Wartosc miary jakosci Wartosc miary jakosci 4 1 Swoistosc Czulosc 0.9 0 -6 8 -4 -2 Wartosc progu 0 2 4 6 Wartosc progu Krzywa ROC dla cechy #1 1 Krzywa ROC dla cechy #1 1 0.9 0.9 0.8 0.8 0.7 0.7 Czulosc / Sensitivity Czulosc / Sensitivity 2 Wartosc cechy 0.6 0.5 0.4 0.3 0.6 0.5 0.4 0.3 0.2 0.2 0.1 0.1 0 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 1-Swoistosc (1-Specificity) 0.8 0.9 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 1-Swoistosc (1-Specificity) Rysunek 16.13: Histogramy wartości dwóch cech obliczonych dla osób zdrowych i chorych (na górze), z zaznaczonym zmiennym progiem decyzyjnym zdrowy/chory, oraz obliczone dla nich krzywe czułości, swoistości oraz ROC, wyjaśniajace, ˛ dlaczego krzywa ROC szybciej pnie si˛e do góry w przypadku wi˛ekszej separacji histogramów. 0.9 1 16.2 Uczenie maszynowe klasycznie 331 Rysunek 16.14: Przykład krzywych charakterystyk ROC (Receiver Operating Characteristic), czyli czułości jako funkcji swoistości odj˛etej od liczby 1, dla różnych cech identyfikujacych ˛ astmatyczność dźwi˛eku oddechu - patrz [13]. Cecha majaca ˛ krzywa˛ szybciej pnac ˛ a˛ si˛e do góry jest “detekcyjnie” lepsza - idealna charakterystyka jest zaznaczona gruba,˛ ciagł ˛ a,˛ czerwona˛ linia˛ - lewy górny narożnik. Problem 16.2 (*(**) Testowanie użyteczności wybranych miar jakości rozpoznawania w przypadku użycia jednej cechy i progowania jako klasyfikatora). Zapoznaj si˛e z programem (16.2) i sprawdź poprawność jego działania. Uruchom go dla różnych wartości parametru bias. Dodaj możliwość ustawienia różnych wartości odchylenia standardowego w rozkładach Gaussa. Dodaj obliczanie i rysowanie dokładności oraz F-miary. Otrzymasz dodatkowe (**) jeśli rozbudujesz przykład do przypadku 2D: 1) dwie różne cechy c1 i c2 o rozkładach gaussoidalnych dla “zdrowia” i “choroby”, skupionych w dwóch różnych punktach, 2) klasyfikator lewo/prawo albo dół/góra na płaszczyźnie 2D, wykorzystujacy ˛ lini˛e prosta˛ c2 = a · c1 + b o wartości parametru a, dobranej przez ciebie - charakterystyki zależności od wartości progu wyznacz dla zmiennej wartości parametru b (tylko przesuni˛ecie prostej w pionie). Szukaj inspiracji ogladaj ˛ ac ˛ rysunek 16.6. Listing 16.2: Testowanie wpływu rozkładu wartości badanej jednej cechy na jakość rozpoznawania metoda˛ progowania %ai_1_roc.m clear all; close all; N = 100000; bias = 2; % bias = 3, 2.5, 2, ... 0.25 x1 = randn(1,N) - bias; [ h1, x1_arg ] = hist( x1, 50 ); % zdrowy x2 = randn(1,N) + bias; [ h2, x2_arg ] = hist( x2, 50 ); % chory figure plot(x1_arg, h1, ’b.-’, x2_arg, h2, ’r.-’ ); grid; xlabel(’Wartosc cechy’); ylabel(’Liczba przypadkow’); title(’Histogramy dla cechy #1’) legend(’Zdrowy’,’Chory’); pause lim = 1.5*(3+bias); iter = 1; for prog = -lim : 0.1 : lim 332 16 Podstawy numeryczne sztucznej inteligncji TN(iter) = numel( x1( x1 < prog ) ); FP(iter) = N - TN(iter); TP(iter) = numel( x2( x2 > prog ) ); FN(iter) = N - TP(iter); iter = iter + 1; % zdrowy uznany jako zdrowy (nizszy od progu) % zdrowy uznany jako chory (wyzszy od progu) % chory uznany jako chory (wyzszy od progu) % chory uznany jako zdrowy (nizszy od progu) end TPR = TP ./ ( TP+FN); % czulosc (True Positive Rate) TNR = TN ./ ( TN+FP); % swoistosc (True Negative Rate) figure prog = -lim : 0.1 : lim; plot( prog, TNR, ’b.-’, prog, TPR, ’r.-’); grid; title(’Ksztalt krzywych jakosci’); xlabel(’Wartosc progu’); ylabel(’Wartosc miary jakosci’); legend(’Swoistosc’,’Czulosc’); pause figure plot( 1-TNR, TPR, ’b.-’); grid; title(’Krzywa ROC dla cechy #1’); xlabel(’1-Swoistosc (1-Specificity)’); ylabel(’Czulosc / Sensitivity’); pause 16.2.3 Ekstrakcja cech I teraz dochodzimy do bardzo istotnego pytania w klasycznym uczeniu maszynowym: ile cech zastosować i jakie? Sytuacja kiedy na wejściu “maszynki” mamy tylko kilka liczb i na ich podstawie musimy podjać ˛ decyzj˛e, obecnie nie jest już taka cz˛esta - albo inaczej: mamy apetyt na o wiele wi˛ecej. Jesteśmy zalewani ciagłymi ˛ strumieniami liczb z mikrofonów, kamer, ... różnych czujników/sensorów. Czy każda˛ osobna˛ liczb˛e należy traktować jako osobna˛ cech˛e i szukać rozwiazania ˛ w przestrzeniach wielowymiarowych? Takie podejście w przeszłości było odrzucane z powodu ograniczonych możliwości obliczeniowych/sprz˛etowych. Od jakiegoś czasu jest to już jednak możliwe w przypadku użycia głebokich sieci neuronowych - o czym powiemy później. Jeśli liczb wejściowych jest dużo, a cech rozróżniajacych ˛ różne stany wektorów/macierzy liczb wejściowych ma być mało, to osoba projektujaca ˛ układ rozpoznawania maszynowego musi rozumieć mechanizm generacji liczb wejściowych i jego wpływ na wartości tych liczb. Przykładowo krwawienie to wi˛ecej koloru czerwonego w macierzy liczb obrazu, a świst astmatyczny to wi˛ecej sinusoid w wektorze liczb z mikrofonu. Jeśli nie mamy wiedzy o wytłumaczeniu fizyko-chemicznym pochodzenia wejściowych liczb, to najcz˛eściej obliczamy wiele prostych deskryptorów opisujacych ˛ jakieś właściwości badanych wektorów/macierzy liczb, np. wartość średnia, maksymalna, wariancja, ... itd., a nast˛epnie badamy jak te deskryptory/cechy różnia˛ si˛e dla różnych stanów liczb: chcielibyśmy otrzymać maksymalnie od siebie odseparowane chmury punktów w przestrzeni wielowymiarowej. Jeśli jakaś cecha nie wpływa na zwi˛ekszenie odległości pomi˛edzy punktami skupień, to zostaje usuni˛eta (czyli jest wykonywana redukcja liczby cech). W jakimś sensie budujemy drzewa decyzyjne i usuwamy z nich nic nie wnoszace ˛ gał˛ezie. Na rysunku 16.15 zilustrowano przykład wyboru i redukcji cech w zadaniu rozpoznawania świstów astmatycznych. Dźwi˛ek normalnego oddechu ma charakter szumowy, natomiast w dźwi˛eku świstu dodatkowo wyst˛epuja˛ składowe tonalne, czyli sinusoidy w zakresie od 100 do 1200 herców (orientacyjnie). Na rysunku w lewym górnym rogu sa˛ pokazane zapisy czasowe nagranych sygnałów (8000 próbek na sekund˛e, analizowane wektory maja˛ tylko 1024 elementów - ok. 81 sekundy). Na rysunku w prawym górnym roku sa˛ przedstawione dwie macierze o wymiarach 25 × 25 = 625 elementów, pokazujace ˛ przykładowa˛ zmian˛e w czasie zawartości cz˛estotliwościowej świstu i normalnego oddechu - osiagni˛ ˛ eto redukcj˛e liczby cech z 1024 16.2 Uczenie maszynowe klasycznie 333 do 625 oraz zwi˛ekszono różnic˛e pomi˛edzy nimi dla dwóch analizowanych stanów (czy też tak uważasz?). Na rysunku w lewym dolnym rogu wykonano kolejny krok: zamiast obliczać 25 widm cz˛estotliwościowych po 25 punktów i potem je porównywać, obliczano jedno 35-elementowe, średnie widmo cz˛estotliwościowe dla 1024elementowego wektora oryginalnych próbek wejściowych (lewa góra) i je potraktowano jako 35-elementowy wektor cech. Na końcu, po dłuższych badaniach, zaproponowano tylko dwie cechy, charakteryzujace ˛ analizowane sygnały: długość obwiedni uśrednionego widma cz˛estotliwościowego (ASE - Audio Spectral Envelope) oraz indeks tonalności (TI - Tonality Index). Analizowano 130 sygnałów z każdej klasy. Otrzymano rozkład punktów w przestrzeni ASE-TI (cecha 1 - cecha 2), przedstawiony na prawym dolnym rysunku i dokładność rozpoznawania około 95%. Czy było warto tak si˛e m˛eczyć? Jak pokaża˛ kolejne przykłady zastosowanie głebokiej sztucznej sieci neuronowej “od r˛eki” daje podobna˛ dokładność: układ decyzyjny jest tu co prawda bardziej złożony, ale zawiera on w sobie także obliczanie “jakichś"cech, które sieć sama wcześniej automatycznie znalazła/dobrała w procesie uczenia. Norma 5 5 10 10 Nr czasu Nr czasu Astma 15 20 20 25 25 5 Widma Astmy 1 Widma Normy 1 0.9 15 10 15 20 25 5 10 15 20 25 1.4 Norma/dobre Astma/zle 0.9 1.2 0.8 0.7 0.7 0.6 0.6 0.5 0.5 0.4 0.4 0.3 0.3 0.2 0.2 0.1 0.1 1 Cecha 2 - TI 0.8 0.8 0.6 0.4 0.2 0 0 0 0 10 20 30 40 0 10 20 30 40 1 1.5 2 2.5 3 3.5 Cecha 1 - ASE Rysunek 16.15: Przykład danych/cech wejściowych do algorytmu rozpoznawania świstów astmatycznych (wierszami, od lewej do prawej): a) oryginalne, długie wektory 1000-elementowe, zawierajace ˛ wiele próbek czasowych zarejestrowanych sygnałów oddechowych (po usuni˛eciu jednego, niebieskiego sygnału Astmy okazałoby si˛e, że pozostałe sygnały Astmy sa˛ bardzo podobne do Normy), b) obliczone mniejsze macierze 25 × 25 = 625-elementowe, pokazujace ˛ zmienność czestotliwości składowych sygnałów oddechowych w czasie, c) obliczone bardzo krótkie 36-elementowe wektory, zawierajace ˛ fragmenty uśrednionych widm cz˛estotliwościowych sygnałów, d) obliczone bardzo krótkie 2-elementowe wektory tylko z dwiema cechami (ASE, TI), zaproponowanymi przez nas. 4 4.5 5 334 16 Podstawy numeryczne sztucznej inteligncji Kończac ˛ ten podrozdział, rzućmy jeszcze okiem na rysunek 16.16, przedstawiajacy ˛ przykładowe sygnały z trzech różnych stanów pracy serca (128 próbek na sekund˛e): normalnego, arytmii i niewydolności zastoinowej. Kto z nas powie teraz jakie cechy należy obliczyć/zastosować dla tych sygnałów? Nikt? I to jest właśnie główny dylemat wczesnego etapu uczenia maszynowego! Obecnie rozwiazaniem ˛ problemu doboru cech byłoby zastosowanie splotowych albo gł˛ebokich sieci neurowych, które same dobierajace ˛ wartości współczynników ekstrakcji cech oraz klasyfikatora (patrz wprowadzenie do tego laboratorium). Normalny rytm pracy serca 3 2 1 0 -1 0 500 1000 1500 2000 2500 2000 2500 2000 2500 nr probki Arytmia pracy serca 1 0 -1 0 500 1000 1500 Niewydolnosc pracy serca 1 0 -1 0 500 1000 1500 Rysunek 16.16: Przykład zapisów trzech różnych rodzajów pracy serca: normalego, arytmii i niewydolności zastoinowej. 16.2.4 Wybór klasyfikatora W uczeniu maszynowym klasyfikatorem jest operacja: 1. przypadek 1-D — progowania wartości obliczonej, jednej cechy (poniżej/powyżej progu dla dwóch stanów albo pomi˛edzy dwoma progami dla wi˛ekszej liczby K stanów), 2. przypadek 2-D — przyporzadkowania ˛ punktu o współrz˛ednych (c1 , c2 ) do obszaru płaszczyzny 2-D, uznanego za “terytorium” jednego z K stanów z użyciem obliczonych linii prostych/krzywych, rozgraniczajacych ww. “terytoria”, 3. przypadek multi-D — przyporzadkowania ˛ punktu o współrz˛ednych (c1 , ..., cM ) do obszaru (“obłoku”) w przestrzeni M-wymiarowej, uznanego za “terytorium” jednego z K stanów. Obecnie problem klasyfikacji potraktujemy pobieżnie. W środowiskach programowych, ukierunkowanych na rozpoznawanie maszynowe, istnieja˛ gotowe funkcj˛e, które umożliwiaja˛ wybranemu klasyfikatorowi: 1. nauczenia si˛e wartości współczynników linii/krzywych/powierzchi/... rozdzielajacych ˛ różne stany, z wykorzystaniem danych treningowych, 2. podj˛ecia decyzji do jakiego obszaru przestrzeni cech, należy zaliczyć konkretny zestaw cech wejściowych (np. zdrowy/chory). 16.2 Uczenie maszynowe klasycznie 335 Najpopularniejsze klasyfikatory, to: • K-najbliższych sasiadów: ˛ “z kim przebywasz tak si˛e nazywasz”; • liniowy: ograniczenie obszaru hiperpłaszczyznami w przestrzeniach wielowymiarowych - prostymi w 2-D, płaszczyznami w 3-D, ...; • SVM (Support Vector Machines) - maszyna wektorów nośnych: krzywe/płaszczyzny rozdzielajace ˛ maja˛ bardziej skomplikowane kształty, które wynika˛ z doboru (w procesie uczenia) odpowiednich wartości punktów i wektorów nośnych dla przyj˛etych bazowych funkcji kształtu (np. RBF - Radial Basis Functions). 16.2.5 Przykład 1 - prosty W tej cz˛eści zostanie przez nas przeanalizowany program 16.3, który jest wynikiem badań, opisanych w [13], w których analizowano 130 przykładowych sygnałów dźwi˛ekowych oddechu astmatycznego oraz 130 odechu normalnego, razem 260 nagrań/zapisów. Z powodu swojej długości program 16.3 robi wrażenie bardzo skomplikowanego. Ale przeanalizujmy go szybko: 1. na poczatku sa˛ wybierane/ustawiane wartości parametrów analizy: rodzaj klasyfikatora (liniowy albo SVM), liczba powtórzeń cykli [uczenie → testowanie] na losowo wybranych zbiorach danych, użyta kombinacja trzech cech (np. [1], [2], [1,2], [2,3], [1,2,3], gdzie np. [1,2] oznacza użycie cechy #1 oraz cechy #2), ułamek próbek użytych do uczenia (pozostałe do rozpoznawania); 2. potem sa˛ wczytywane i wizualizowane analizowane sygnały, zawierajace ˛ po 130 przykładów normalnego i astmatycznego oddechu; 3. opcjonalnie usuwamy trudne do interpretacji sygnały astmy i normy - ich indeksy sa˛ podane w kolejności od przypadku najtrudniejszego do najłatwiejszego; 4. opcjonalnie normujemy pozostawione sygnały, tzn. dzielimy je przez wartość maksymalna; ˛ 5. nast˛epnie jest wywołana funkcja ekstracji cech, która dla każdego sygnału oblicza zbiór kilku liczb, u nas trzech (ASE, TI, JA-TY) - tutaj mamy miejsce do wykazania si˛e w przypadku trzeciej cechy; opcjonalnie sa˛ rysowane rozkłady wartości cech (histogramy) dla sygnałów osób zdrowych i chorych - możemy si˛e przekonać czy wartości dla stanów astma/norma sa˛ od siebie dobrze odseparowane; 6. przed p˛etla˛ główna˛ inicjalizujemy liczniki zwiazane ˛ ze wskaźnikami jakości: TP_n, TN_n,..., SPE; 7. p˛etl˛e główna˛ powtarzamy Ktestow razy: a. losowo przestawiamy numery sygnałów i M1u, M2u pierwszych z nich wykorzystujemy jako indeksy sygnałów uczacych, ˛ zaś pozostałe - jako indeksy sygnałów testowych; b. dokonujemy ekstrakcji cech dla sygnałów uczacych (u) i testowych (t) oddechu normalnego (numer 1) oraz oddechu astmatycznego (numer 2); c. najważniejsza cz˛eść: uczymy-trenujemy klasyfikator oraz sprawdzamy otrzymany wynik 1) zastosowana jest tylko jedna funkcja classify(), albo 2) dwie osobne funkcje: jedna funkcja służaca ˛ do dopasowania (fitowania) współczynników modelu klasyfikatora do danych), np. fitcsvm() (alternatywnie: fitcdicr(), fitcnb(), fitctree()), oraz druga funkcja do testowania już “nastrojonego fortepianu” predict(); d. aktulizujemy wartości wskaźników miar jakości rozpoznawania; 8. wyświetlamy otrzymany wynik końcowy. Rzućmy teraz okiem na program 16.3. Uff ... 130 linijek. Spokojnie, spokojnie, ... jest w nim wiele “sosu”. 336 16 Podstawy numeryczne sztucznej inteligncji Listing 16.3: Prosty program do rozpoznawania świstów astmatycznych na podstawie cech ASE i TI % ai_2_simple_astma.m % Rozpoznawanie swistow astmatycznych (normalny oddech vs patologiczny) clear all; close all; %% Parametry klasyfikator = 2; Ktestow = 100; C = [ 1, 2 ]; Ncech = length(C); P = 0.8; % 1 = liniowy, 2 = SVM % liczba wszystkich testow: 10, 20, 30, 40, 50, 100 % ktore cechy w zbiorze cech: 1=ASE, 2=TI, 3=NASZA, np. [1,2] % liczba cech w zestawie cech % ulamek probek uzytych do uczenia %% Wczytanie sygnalow load sygnaly_astma.mat % 130 wektorow (sygnalow) 1024-elementowych dla swistow i normy % 8000 probek sygnalu na sekunde sygnaly1 = oddechNorma; clear oddechNorma; % naturalny oddech: 1024x130 sygnaly2 = oddechAstma; clear oddechAstma; % patologia, swist astmatyczny: 1024x130 figure % sygnaly sa w kolumnach dwoch macierzy: : 130 kolumn po 1024 elementy subplot(121); plot( sygnaly1 ); grid; title(’Sygnaly normy (~szumy)’); subplot(122); plot( sygnaly2 ); grid; title(’Sygnaly patologii (~tony)’); pause %% Opcjonalne usuwanie "najtrudniejszych" sygnalow % Numery od najtrudniejszego do najlatwiejszego, pierwszych 20 przypadkow % ind1 = [41,47,37,46,18,22,36,20,50,11,53,39,99,49,79,127,1,7,63,12]; % norma % ind2 = [100,117,96,119,123,126,107,92,113,101,83,105,130,109,111,108]; % patologia % Usuwanie pierwszych Nout=? sygnalow % sygnaly1(:,ind1(1:Nout))=[]; % sygnaly2(:,ind2(1:Nout))=[]; % Tyle sygnalow nam zostalo [ N1, M1 ] = size( sygnaly1 ); % N=1024 - dlugosc sygnalow (liczba probek) [ N2, M2 ] = size( sygnaly2 ); % M=130 - liczba sygnalow %% Normalizacja - opcjonalne przetwarzanie wstepne sygnaly1 = sygnaly1 ./ max(abs( sygnaly1 )); % podziel kazda kolumne przez max(ab()) sygnaly2 = sygnaly2 ./ max(abs( sygnaly2 )); %% Wstepne obliczenie/ekstrakcja trzech cech: ASE (C1), TI (C2), JA (C3) [ C_s1 ] = ekstrakcja_cech_astma( sygnaly1 ); % dla normy (sygnaly1) [ C_s2 ] = ekstrakcja_cech_astma( sygnaly2 ); % dla astmy (sygnaly2) rys1_ai_2_astma % program z opcjonalnymi rysunkami % Inicjalizacja wskaznikow jakosci rozpoznawania % https://en.wikipedia.org/wiki/Sensitivity_and_specificity work = zeros( Ktestow ); TP_n = work; % true positive: patologia zdiagnozowana jako patologia TN_n = work; % true negative: norma zdiagnozowana jako norma FP_n = work; % false positive: norma zdiagnozowana jako patologia FN_n = work; % false negative: patologia zdiagnozowana jako norma ACC = work; PRE = work; NPV = work; SEN = work; SPE = work; F1=work; % pozostale % ######################################################################### % Procedura: 1) wielokrotne uczenie i testowanie roznymi zestawami danych % 2) obserwowanie zmiennosci charakterystych jakosci rozpoznawania % ######################################################################### M1u = round( P*M1 ); % liczba przykladow uzytych do uczenia normy M2u = round( P*M2 ); % liczba przykladow uzytych do uczenia patologii M1t = M1 - M1u; % liczba przykladow uzytych do testowania normy 16.2 Uczenie maszynowe klasycznie M2t = M2 - M2u; 337 % liczba przykladow uzytych do testowania patologii for iTest = 1 : Ktestow %% Wybor sygnalow do: uczenia i testowania ind1 = randperm(M1); ind2 = randperm(M2); s1_u = sygnaly1(: , ind1( 1 : M1u ) ); s2_u = sygnaly2(: , ind2( 1 : M2u ) ); s1_t = sygnaly1(: , ind1( M1u+1 : M1 ) ); s2_t = sygnaly2(: , ind2( M2u+1 : M2 ) ); % losowa kolejnosc liczb [1,...,M1] % losowa kolejnosc liczb [1,...,M2] % wybor sygnalow 1 do uczenia % wybor sygnalow 2 do uczenia % wybor sygnalow 1 do testowania % wybor sygnalow 2 do testowania %% OBLICZANIE CECH X1_u = ekstrakcja_cech_astma( s1_u ); X2_u = ekstrakcja_cech_astma( s2_u ); X1_t = ekstrakcja_cech_astma( s1_t ); X2_t = ekstrakcja_cech_astma( s2_t ); x1_u = X1_u(:, C(1:Ncech)); x2_u = X2_u(:, C(1:Ncech)); x1_t = X1_t(:, C(1:Ncech)); x2_t = X2_t(:, C(1:Ncech)); % dla uczenia normy % dla uczenia patologii % dla testowania normy % dla testowania patologii % tylko wybrane cechy % j.w. % j.w. % j.w %% W wierszach zespoly cech, najpierw norma, potem astma v_nauka = [ x1_u; x2_u ]; % cechy do uczenia v_testy = [ x1_t; x2_t ]; % cechy do testowania %% Informacja w group "co jest co" podczas uczenia: 0 = norma, 1 = astma group( 1 : M1u ) = zeros( M1u, 1 ); % 0 = norma group( M1u+1 : M1u+M2u ) = ones(M2u,1); % 1 = astma %% Najpierw uczenie ("fitting"), potem rozpoznawanie ("predict") if( klasyfikator == 1 ) % liniowy classes = classify( v_testy, v_nauka, group ); else % SVM svmStruct = fitcsvm( v_nauka, group, ’KernelFunction’,’RBF’); classes = predict( svmStruct, v_testy ); end TP = 0; TN = 0; FP = 0; FN = 0; for i = 1 : M1t % sprawdzenie poprawnosci rozpoznania normy if( classes(i)==0 ) TN = TN+1; else FP = FP+1; end end for i = 1 : M2t % sprawdzenie poprawnosci rozpoznania astmy if( classes(M1t+i)==1 ) TP = TP+1; else FN = FN+1; end end TP_n( iTest ) = TP; % true positive TN_n( iTest ) = TN; % true negative FP_n( iTest ) = FP; % false positive FN_n( iTest ) = FN; % false negative ACC( iTest ) = (TP+TN) / (TP+TN+FP+FN); % accuracy (dokladnosc) PRE( iTest ) = TP / ( TP+FP ); % positive predictive value (precision) NPV( iTest ) = TN / ( TN+FN ); % negative predictive value SEN( iTest ) = TP / ( TP+FN ); % sensitivity (czulosc), recall SPE( iTest ) = TN / ( FP+TN ); % specificity (swoistosc), selectivity F1( iTest ) = 2*PRE(iTest)*SEN(iTest) / ( PRE(iTest) + SEN(iTest) ); % F1 end % ######################################################################### % Koniec petli ############################################################ % ######################################################################### %% Koncowe rysunki 338 16 Podstawy numeryczne sztucznej inteligncji figure; Kt=Ktestow; subplot(221); plot(TP_n/M2t*100); title(’True-Positive / Pos ’); subplot(222); plot(TN_n/M1t*100); title(’True-Negative / Neg ’); subplot(223); plot( ACC*100); title(’Accuracy’); subplot(224); plot( F1*100 ); title(’F1’); Problem 16.3 (**(**) Przykład programu do rozpoznawania jednego z dwóch stanów zawartych w wektorach/macierzach liczb z użyciem od jednej do trzech cech - wcześniej obliczonych). Zapoznaj si˛e z programem (16.3) i sprawdź poprawność jego działania. Powinieneś, m.in., zobaczyć: • rysunek 16.17, pokazujacy ˛ rozkład wartości cech ASE i TI dla oddechu normalnego i astmatycznego (całkiem dobra separacja prawo-lewo); • rysunek 16.15 (prawy-dolny) - przedstawiajacy ˛ położenie punktów (c1 , c2 ) = (ASE,TI) w przestrzeni 2D (w wi˛ekszości nie zachodzace ˛ na siebie “placki”); • rysunek 16.18 - ilustrujacy ˛ jak zmieniały si˛e wskaźniki jakości otrzymanego systemu AI/ML dla kolejnych powtórzeń sekwencji [uczenie→rozpoznawanie] na innych, losowo wybranych zbiorach sygnałów uczacych ˛ i testowych (widzisz! nie ma lekko! wielkości procentowe zmieniaja˛ si˛e w zakresie od 85% do 100% i silnie zależa˛ od użytego klasyfikatora - dla SVM sa˛ lepsze niż dla LIN; wnioski: 1) oj, trzeba być ostrożnym w wyciaganiu ˛ wniosków, 2) o jakości rozpoznawania informuje nas średni wynik i jego rozrzut, 3) lepiej mieć duża˛ liczb˛e różnorodnych przykładów dla każdej klasy/stanu (dobre zbalansowanie), gdyż wówczas podział sygnałów na zbiór uczacy ˛ i testowy jest mniej krytyczny); Uruchom program dla różnych wartości parametrów, podanych na poczatku ˛ programu. Sprawdź jak b˛edzie zmieniała si˛e skuteczność rozpoznawania kiedy zaczniesz usuwać sygnały najbardziej problematyczne. Zmień KernelFunction w funkcji fitcsvm(.) na inna˛ opcj˛e niż jest ustawiona obecnie. Zamień kod cechy numer trzy w funkcji ekstrakcja_cech_astma.m na inny: działajacy ˛ bezpośrednio na próbkach sygnałów, a nie na ich widmach cz˛estotliwościowych. Otrzymasz dodatkowe (**) jeśli do funkcji ekstrakcja_cech_astma.m dodasz jeszcze jedna˛ cech˛e (teraz sa˛ trzy: C1=ASE, C2=TI i C3=JA) oraz tak zmodyfikujesz program główny, aby podczas rozpoznawania możliwy był wybór zestawu kilku 2- i 3-elementowych kombinacji z dost˛epnych 4 cech. Histogram dla ASE 100 Histogram dla TI 140 Norma Patologia 90 Norma Patologia 120 80 100 liczba przypakow liczba przypakow 70 60 50 40 30 80 60 40 20 20 10 0 0 1 1.5 2 2.5 3 wartosc ASE 3.5 4 4.5 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 wartosc TI Rysunek 16.17: Histogram wartości cech ASE (po lewej) oraz TI (po prawej), obliczonych dla sygnałów normalnego i astmatycznego (patologicznego) oddechu przez funkcj˛e ekstrakcja_cech_astma() w programie 16.3. 1.8 16.2 Uczenie maszynowe klasycznie 100 339 LIN: True-Positive / Pos 100 [%] 95 [%] 95 LIN: True-Negative / Neg 90 90 85 85 20 40 60 80 100 20 LIN: Accuracy 100 60 80 100 80 100 LIN: F1 100 [%] 95 [%] 95 40 90 90 85 85 20 40 60 80 100 20 40 iter 100 60 iter SVM: True-Positive / Pos 100 [%] 95 [%] 95 SVM: True-Negative / Neg 90 90 85 85 20 40 60 80 100 20 SVM: Accuracy 100 60 80 100 80 100 SVM: F1 100 [%] 95 [%] 95 40 90 90 85 85 20 40 60 iter 80 100 20 40 60 iter Rysunek 16.18: Porównanie zastosowania klasyfikatora liniowego LIN (powyżej) oraz klasyfikatora SVM (poniżej) do rozpoznawania dźwi˛eków astmatycznych za pomoca˛ oliczonych cech ASE (Audio Spectral Envelope) i TI (Tonality Index). Klasyfikator SVM ma lepsza˛ czułość (TP/P) i dokładność (ACC). Swoistość (TN/N) obu metod jest podobna. Problem 16.4 ((*)(**)(***) Zadania dodatkowe). (*) Dodaj do programu (16.3) możliwość wywołania funkcji Matlaba, realizujacej ˛ klasyfikacj˛e metoda˛ Knajbliższych sasiadów. ˛ (dodatkowe **) Dla przypadku pary cech: dodaj do programu 340 16 Podstawy numeryczne sztucznej inteligncji kod, umożliwiajacy ˛ narysowanie w płaszczyźnie 2-D krzywej rozdzielajacej ˛ obszary przyporzadkowane ˛ przez klasyfikator sygnałom dwóch różnych klas (astma/norma). Podpowiedź: wywołaj wybrany, już nauczony klasyfikator na g˛estej siatce punktów w 2-D i zaobserwuj rozkład podj˛etych decyzji. (dodatkowe ***) Zmodyfikuj program (16.3) i zastosuj go do rozpoznawania innych sygnałów pobranych z Internetu, np. śpiewu ptaków od wycia wilków lub różnych stanów pracy serca. Problem 16.5 ((***)(*****) Operacja na otwartym sercu, czyli jazda bez trzymanki). I teraz, po wykonaniu ostatnich zadań, przychodzi nam do głowy myśl, czy same kolejne próbki sygnału nie mogłyby być potraktowane jako kolejne cechy obserwowanych zjawisk? Ponieważ świsty to sinusoidalne tony o cz˛estotliwościach z przedziału 100-1200 Hz, to może jakbyśmy podzielili 8000 próbek na sekund˛e przez 100 (najmniejsza cz˛estotliwość powtarzania si˛e sinusoidy świstu w ciagu ˛ jednej sekundy), otrzymali 80 i wzi˛eli pierwszych 80 próbek z każdego zapisu sygnału dźwi˛ekowego oddechu, to może 80-wymiarowe wektory cech dla astmy i normy same tworzyłyby odseparowane od siebie obłoki punktów w przestrzeni 80-wymiarowej. Zmodyfikuj program 16.4 i sprawdź czy taki scenariusz rozpoznawania sprawdzi si˛e. A może zastosować wektory 40-punktowe odpowiadajace ˛ połowie okresu najwolniejszej sinusoidy świstu? Dlaczego nie poddajemy si˛e? Ponieważ chcemy za wszelka˛ cen˛e uniknać ˛ czasochłonnego poszukiwania najlepszych cech w labiryncie istniejacych ˛ możliwości. A może sam zaproponujesz jakieś proste rozwiazanie ˛ tego problemu? W przypadku sukcesu (***** BINGO!) jest Twoje. 16.2.6 Przykład 2 - K-fold Ten przykład stanowi rozwini˛ecie poprzedniego i może być opuszczony przy pierwszym czytaniu tego rozdziału, a nawet ... przy drugim. Należy go traktować jako wprowadzenie do ewentualnego projektu. Szczególna˛ uwag˛e zwrócono w tym przykładzie na zastosowanie walidacji krzyżowej K-fold. Ponieważ dysponujemy mała liczba˛ zapisów dla astmy i normy, tylko po 130 przykładowych sygnałów dla obu przypadków (razem 260), dlatego dzielimy każdy zbiór losowo na K = 10 podzbiorów (w programie parametr Kblokow), a nast˛epnie po kolei rozpoznajemy sygnały jednego z nich (1 × 13 sygnałów), używajac ˛ pozostałych (9 × 13 = 117 sygnałów) do nauki klasyfikatora. Ustawienie wartości zmiennej (Ktestow=30) razy oznacza, że opisana˛ powyżej operacj˛e rozpoznawania 13-stu sygnałów na podstawie 117-stu sygnałów uczacych ˛ chcemy powtórzyć 30 razy. W takim przypadku po każdych K = 10 testach ponownie dokonujemy losowej zmiany kolejności sygnałów oraz podziału sygnałów na bloki 13-elementowe. Ponownie jak poprzednio, z powodu swojej długości, program 16.4 robi wrażenie bardzo skomplikowanego. Ale przeanalizujmy go szybko: 1. na poczatku sa˛ wybierane/ustawiane wartości parametrów analizy - jak poprzednio; 2. potem sa˛ wczytywane i wizualizowane analizowane sygnały, zawierajace ˛ po 130 przykładów normalnego i astmatycznego oddechu; opcjonalnie sa˛ one normowane, tzn. dzielone przez wartość maksymalna,˛ 16.2 Uczenie maszynowe klasycznie 341 3. nast˛epnie jest wywołana funkcja ekstracji cech, która dla każdego sygnału oblicza zbiór kilku liczb - tutaj mamy miejsce do wykazania si˛e; opcjonalnie sa˛ rysowane rozkłady wartości cech dla sygnałów osób zdrowych i chorych - możemy si˛e przekonać czy wartości dla stanów astma/norma sa˛ od siebie dobrze odseparowane; 4. teraz przyst˛epujemy do obliczenia wartości wybranych miar jakości rozpoznawania; na poczatku ˛ wybieramy, które cechy lub równo-liczne zestawy kilku cech maja˛ być testowane - w tym celu jest wykorzystywana zmienna C: przykładowo ustawienie C=[ 1, 2; 1, 3; 2, 3] oznacza, że chcemy przetestować użycie nast˛epujacych ˛ par cech: 1+2; 1+3; 2+3 (średnikiem sa˛ oddzielone zestawy, przecinkiem poszczególne cechy); 5. przed p˛etla˛ główna˛ inicjalizujemy liczniki zwiazane ˛ ze wskaźnikami jakości: TP_n, TN_n,..., SPE; 6. p˛etl˛e główna˛ powtarzamy Ktestow razy: a. jeśli od ostatniego losowego przestawiania i podziału sygnałów na bloki wykonaliśmy już Kblokow testów, to ponownie wykonujemy przestawianie i podział; b. teraz wybieramy jeden blok z sygnałami, które b˛eda˛ rozpoznawane (po kolei jeden blok z Kblokow) - sygnały z pozostałych bloków zostana˛ użyte do nauki klasyfikatora; c. najważniejsza cz˛eść: uczymy-trenujemy klasyfikator oraz sprawdzamy otrzymany wynik - jak poprzednio : 1) zastosowana jest tylko jedna funkcja classify(), albo 2) dwie osobne funkcje: jedna funkcja służaca ˛ do dopasowania (fitowania) współczynników modelu klasyfikatora do danych), np. fitcsvm() (alternatywnie: fitcdicr(), fitcnb(), fitctree()), oraz druga funkcja do testowania już “nastrojonego fortepianu” predict(); d. aktulizujemy wartości wskaźników miar jakości rozpoznawania; 7. wyświetlamy otrzymany wynik końcowy. Listing 16.4: Program do rozpoznawania świstów astmatycznych na podstawie cech ASE i TI stosujacy ˛ walidacj˛e krzyżowa˛ % ai_2_svm_kfold_astma.m % Rozpoznawanie swistow astmatycznych (normalny oddech vs patologiczny) clear all; close all; %% Parametry klasyfikator = 1; Kblokow = 10; Ktestow = 25; Nout = 0; trybpracy = 2; % 1 = liniowy, 2 = SVM % liczba blokow sygnalu do cross-walidacji "k-fold": 5, 10 % liczba wszystkich testow: 10, 20, 30, 40, 50 % 0, 10, 20 - liczba usunietych "najtrudniejszych" sygnalow % 1 = osobno cechy ASE, TI, MOJE % 2 = cechy parami: ASE+TI, ASE+MOJE, TI+MOJE % 3 = wszystkie cechy razem %% Wczytanie sygnalow load sygnaly_astma.mat % 130 wektorow (sygnalow) 1024-elementowych dla swistow i normy % 8000 probek sygnalu na sekunde sygnaly1 = oddechNorma; sygnaly2 = oddechAstma; clear oddechNorma; clear oddechAstma; % naturalny oddech % patologia, swist astmatyczny figure % sygnaly sa w kolumnach dwoch macierzy subplot(121); plot( sygnaly1 ); grid; title(’Sygnaly normy (~szumy)’); subplot(122); plot( sygnaly2 ); grid; title(’Sygnaly patologii (~tony)’); pause %% Opcjonalne usuwanie "najtrudniejszych" sygnalow 342 16 Podstawy numeryczne sztucznej inteligncji % ... % Tyle sygnalow nam zostalo [ N1, M1 ] = size( sygnaly1 ); % N=1024 - dlugosc sygnalow (liczba probek) [ N2, M2 ] = size( sygnaly2 ); % M=130 - liczba sygnalow %% Normalizacja - opcjonalne przetwarzanie wstepne if(1) sygnaly1 = sygnaly1 ./ max(abs( sygnaly1 )); % podziel kazda kolumne przez max(ab()) sygnaly2 = sygnaly2 ./ max(abs( sygnaly2 )); end %% Obliczenie/ekstrakcja trzech cech: ASE (C1), TI (C2), JA (C3) [ C_s1 ] = ekstrakcja_cech_astma( sygnaly1 ); % dla normy (sygnaly1) [ C_s2 ] = ekstrakcja_cech_astma( sygnaly2 ); % dla astmy (sygnaly2) %% Rysunki - opcjonalnie, usun wstawiajac z przodu "%" rys1_ai_2_astma % program z opcjonalnymi rysunkami %% Wybor trybu pracy i cech do testowania (obecnie tylko trzy) if( trybpracy == 1 ) % rozpoznawanie pojedynczymi cechami, podajemy ich numery C = [ 1; 2; 3 ]; lbl_char = {’ASE’; ’TI’; ’JA’}; elseif( trybpracy == 2 ) % rozpoznawanie parami cech, ich numery w kolejnych wierszach C = [ 1, 2; 1, 3; 2, 3 ]; lbl_char = {’ASE + TI’, ’ASE + JA’, ’TI + JA’}; elseif( trybpracy == 3 ) C = [ 1, 2, 3 ]; lbl_char = {’ASE + TI + JA’}; end [ Nzestawow, Ncech ] = size(C); % liczba zestawow cech i liczba cech w zestawie % Inicjalizacja wskaznikow jakosci rozpoznawania % https://en.wikipedia.org/wiki/Sensitivity_and_specificity work = zeros(Nzestawow, Ktestow); TP_n = work; % true positive: patologia zdiagnozowana jako patologia TN_n = work; % true negative: norma zdiagnozowana jako norma FP_n = work; % false positive: norma zdiagnozowana jako patologia FN_n = work; % false negative: patologia zdiagnozowana jako norma ACC = work; PPV = work; NPV = work; SEN = work; SPE = work; % pozostale % ######################################################################### % Procedura "K-fold": uczenie (Kfold-1) blokami, testowanie jednym blokiem % ######################################################################### indices = crossvalind(’Kfold’, Ktestow, Kblokow-1); % numery blokow do rozpoznawania M1_block = M1 / Kblokow; % liczba sygnalow normalnych w jednym z Kblokow blokow M2_block = M2 / Kblokow; % liczba sygnalow patologicznych w jednym z Kblokow blokow i_rand = 1; for iTest = 1 : Ktestow iTest, if( (iTest ~= 1) && ( mod(iTest-1, Kblokow) == 0) ) i_rand = i_rand + 1 ind_1 = randperm(M1); % sortowanie po pelnym "obrocie" K-fold ind_2 = randperm(M2); sygnaly1 = sygnaly1(:, ind_1); sygnaly2 = sygnaly2(:, ind_2); end M2_vec = false( M2, 1 ); % zerowanie maski do wyboru bloku sygnalow astmy M1_vec = false( M1, 1 ); % zerowanie maski do wyboru bloku sygnalow astmy % ustawienie maski na sygnaly do rozpoznania M2_vec( indices(iTest)*M2_block : indices(iTest)*M2_block + M2_block-1) = true; % M1_vec( indices(iTest)*M2_block : indices(iTest)*M2_block + M2_block-1) = true; % s1u = sygnaly1(: , ~M1_vec ); % wybor sygnalow do nauczania (~maska) s1t = sygnaly1(: , M1_vec ); % wybor sygnalow do rozpoznawania s2u = sygnaly2(: , ~M2_vec ); % wybor sygnalow do nauczania (~maska) s2t = sygnaly2(: , M2_vec); % wybor sygnalow do rozpoznawania 16.2 Uczenie maszynowe klasycznie 343 %################ % OBLICZANIE CECH %################ X1_u = ekstrakcja_cech_astma( s1u ); X2_u = ekstrakcja_cech_astma( s2u ); X1_t = ekstrakcja_cech_astma( s1t ); X2_t = ekstrakcja_cech_astma( s2t ); % dla uczenia normy % dla uczenia patologii % dla testowania normy % dla testowania patologii for iZ = 1 : Nzestawow % iZ x1_u = X1_u(:, C(iZ,1:Ncech)); % stan 1 - norma x2_u = X2_u(:, C(iZ,1:Ncech)); % stan 2 - astma x1_t = X1_t(:, C(iZ,1:Ncech)); % stan 1 - norma x2_t = X2_t(:, C(iZ,1:Ncech)); % stan 2 - astma v_nauka = [ x1_u; x2_u ]; v_testy = [ x1_t; x2_t ]; group = zeros( length(x1_u)+length(x2_u), 1 ); group( length(x1_u)+1 : length(x1_u)+length(x2_u), 1 ) = 1; % Najpierw uczenie ("fitting"), potem rozpoznawanie ("predict") if( klasyfikator == 1 ) % liniowy classes = classify( v_testy, v_nauka, group ); else % SVM svmStruct = fitcsvm( v_nauka, group, ’KernelFunction’,’RBF’); classes = predict( svmStruct, v_testy ); CLS( :, iZ, iTest ) = classes; end TP = 0; FP = 0; FN = 0; TN = 0; for i = 1 : length( x1_t ) if( classes(i)==0 ) TN = TN+1; else FP = FP+1; end end [ln dummy]= size( X1_t ); for i = 1 : length( x2_t ) if( classes(ln+i)==1 ) TP = TP+1; else FN = FN+1; end end TP_n( iZ, iTest ) = TP; % true positive TN_n( iZ, iTest ) = TN; % true negative FP_n( iZ, iTest ) = FP; % false positive FN_n( iZ, iTest ) = FN; % false negative ACC( iZ, iTest ) = (TN+TP) / (TN+TP+FP+FN); % accuracy (dokladnosc) PPV( iZ, iTest ) = TP / ( TP+FP ); % positive predictive value (precision) NPV( iZ, iTest ) = TN / ( TN+FN ); % negative predictive value SEN( iZ, iTest ) = TP / ( TP+FN ); % sensitivity (czulosc), recall SPE( iZ, iTest ) = TN / ( FP+TN ); % specificity (swoistosc), selectivity end end % ######################################################################### % Koniec procedury "K-fold" ############################################### % ######################################################################### %% Koncowe rysunki rys2_ai_2_svn_kfold_astma % program z koncowymi rysunkami 344 16 Podstawy numeryczne sztucznej inteligncji Problem 16.6 (**(**) Przykład programu do rozpoznawania jednego z dwóch stanów zawartych w wektorach/macierzach liczb z użyciem techniki K-fold). Wykonaj zadania z problemu 16.3, które pasuja˛ do metody k-fold. Problem 16.7 ((*)(**)(***) Zadania dodatkowe dla techniki K-fold). Wykonaj zadania z problemu 16.4, które pasuja˛ do metody k-fold. Problem 16.8 ((***)(*****) Operacja na otwartym sercu, czyli jazda bez trzymanki dla techniki K-fold). Wykonaj zadania z problemu 16.5, które pasuja˛ do metody k-fold. 16.3 Regresja liniowa Niektóre osoby pomagajace ˛ nam w edycji tego rozdziału z pełnym przekonaniem twierdziły, że ten podrozdział powinien być pierwszym po wprowadzeniu. I z matematycznego punktu widzenia miały racj˛e. Ale czy wi˛ekszość z Czytelników nie zniech˛eciłaby si˛e widzac ˛ poniższe wzory? Teraz, już po zobaczeniu mrożacego ˛ krew w żyłach przedstawienia “AI in Action”, mamy nadziej˛e, że wi˛ekszość Czytelników z zainteresowaniem podejmie wysiłek zrozumienia matematycznego wytłumaczenia jak i dlaczego AI działa. Ale wróćmy do oryginalnego tekstu ... Teraz wiemy już troch˛e o tym, czym zajmuje si˛e uczenie maszynowe i jak wyglada ˛ proces konstruowania automatów rozpoznajacych: ˛ prawda-czy-fałsz, chory-czyzdrowy, astma-czy-norma, ... Nadszedł wi˛ec moment, aby przyjrzeć si˛e zagadnieniu nie jako użytkownik istniejacego ˛ oprogramowania, ale jako jego twórca. Co znajduje si˛e w środku funkcji, których używamy? Jak to wszystko algorytmicznie/programowo działa? Z tego powodu musimy opisać rozwiazywane ˛ zadania j˛ezykiem matematycznym (najprostszym!) oraz je rozwiazać, ˛ także matematycznie (również najprościej jak tylko si˛e da!). Dlatego zaczynamy powolna˛ wspinaczk˛e na szczyt. Pewnie do niego nie dojdziemy, ale i tak lepiej b˛edziemy rozumieć co nas otacza patrzac ˛ z góry. Zaczniemy od regresji liniowej. “Tu mówi kapitan samolotu. Prosz˛e zapiać ˛ pasy! ..." Wprowadzeniem do maszyn samouczacych ˛ si˛e sa˛ maszyny, które: 1. dysponuja˛ danymi z przeszłości, 2. wykorzystuja˛ je do obliczenia/identyfikacji wartości parametrów modelu matematycznego, opisujacego ˛ rozpatrywany obiekt/proces, 3. prognozuja˛ wartość wyjściowa˛ z obiektu/procesu dla nowych danych wejściowyh. Jako przykład takiego “inteligentnego” wnioskowania matematycznego rozpatrzymy problem przewidywania ceny wynajmu mieszkania przez studentów, na podstawie powierzchni mieszkania (pierwszy argument funkcji matematycznej x1 ) oraz liczby pokoi (drugi argument x2 ). Najprostszym stosowanym modelem jest regresja liniowa, w której wyjście jest liniowa˛ superpozycja˛ (suma) ˛ przeskalowanych wejść plus przesuni˛ecie: 16.3 Regresja liniowa 345 M yb = w0 + w1 x1 + w2 x2 + . . . + wM xM = w0 + ∑ wm xm (16.4) m=1 gdzie, w naszym przypadku: yb - prognoza miesi˛ecznego kosztu wynajmu, x1 - powierzchnia mieszkania w metrach kwadratowych, x2 - liczba pokoi, x3 , ..., xM - jakieś dodatkowe parametry (np. pi˛etro, dzielnica), w1 , w2 , ..., wM - współczynniki wagowe/skalujace, ˛ w0 - współczynnik przesuni˛ecia. Załóżmy, że dysponujemy danymi z przeszłości i znamy wyniki dla N transakcji: {xn,1 , xn,2 , yn }, n = 1, 2, 3, ..., N. Wówczas możemy równanie (16.4) zapisać w postaci macierzowej: w yb1 1 x1,1 x1,2 . . . x1,M 0 yb2 1 x2,1 x2,2 . . . x2,M w1 b y = Xw (16.5) .. = .. .. .. .. .. w2 , . . . . . . . .. ybN 1 xN,1 xN,2 . . . xN,M wM i postawić sobie za cel znalezienie takich wartości elementów wektora w, które b˛eda˛ minimalizowały sum˛e kwadratów bł˛edów en pomi˛edzy znanymi, rzeczywistymi kosztami wynajmu yn , a tymi prognozowanymi przez model ybn : J(w) = 1 1 1 N 2 1 N y − y) = (Xw − y)T (Xw − y). y − y)T (b ∑ en = 2 ∑ (byn − yn )2 = 2 (b | {z } | {z } 2 n=1 2 n=1 e eT (16.6) gdzie y = [y1 , y2 , ..., yN ]T . Ww. wartości elementów wektora w wyznaczamy w nast˛epujacy ˛ sposób: 1. obliczamy pochodne czastkowe ˛ minimalizowanej funkcji bł˛edu/kosztu J wzgl˛edem wektora wag w: dJ(w) = XT (Xw − y) = XT e; | {z } dw (16.7) e 2. przyrównujemy otrzymana˛ zależność do zera i ja˛ inaczej zapisujemy: XT (Xw − y) ≡ 0 → XT Xw = XT y; (16.8) 3. rozwiazujemy ˛ ostatnie równanie ze wzgl˛edu na wektor w (układ N równań z M niewiadomymi, N ≧ M): w = (XT X)−1 XT y. (16.9) Im wi˛ekszy zbiór danych jest użyty, tym wyznaczone współczynniki modelu sa˛ lepiej dopasowane do rzeczywistości. Dlatego zawsze jesteśmy zainteresowani uzupełnianiem posiadanych danych, przykładowo im wi˛ecej pacjentów uwzgl˛ednimy, tym 346 16 Podstawy numeryczne sztucznej inteligncji lepsza zostanie postawiona diagnoza. Aby jednak ciagle ˛ nie nie rozwiazywać ˛ równania macierzowego o coraz wi˛ekszych wymiarach, korzystne jest opracowanie algorytmu rekurencyjnego, w którym wartości współczynników modelu b˛eda˛ adaptacyjnie modyfikowane/korygowane wraz z napływem nowych danych. W rozwiazaniu ˛ adaptacyjnym opisywanego problemu regresji liniowej, w sposób losowy inicjalizuje si˛e poczatkowy ˛ wektor wag w, a nast˛epnie tak modyfikuje si˛e jego wartości, aby poda˛żać w kierunku przeciwnym do gradientu (kierunku przyrostu) funkcji kosztu/bł˛edu, czyli w stron˛e jej minimum: wn+1 = wn − µ dJ(wn ) = wn − µXT e, dwn (16.10) tzn. (n + 1)-sza, nowa wersja wektora wag (wn+1 ) jest równa n-tej wersji wektora wag (wn ), czyli starej/poprzedniej, plus jej zmiana, proporcjonalna do wartości gradientu funkcji w danym punkcie, ale ze znakiem minus (µ to dodatkowy współczynnik wpływajacy ˛ na szybkość adaptacji i dojścia do poprawnych nastaw wag). Prawa strona równania (16.10) jest poprawna dla funkcji kosztu (16.6) sumy kwadratów bł˛edów czastkowych, ˛ gdyż uwzgledniono w niej analitycznie obliczona˛ pochodna.˛ Dla funkcji kosztu postaci sumy wartości bezwzgl˛ednych bł˛edów czastkowych ˛ mamy problem, ponieważ pochodna jest nieciagła ˛ w punkcie 0. Metoda iteracyjna, opisana równaniem (16.10), w porównaniu do metody macierzowej (16.9), jest w praktyce: 1. szybsza, gdyż nie trzeba "odwracać"macierzy, być może dużej; 2. mniej poddatna na bł˛edy numeryczne, gdyż dokładne obliczenie macierzy odwrotnej dla dużej macierzy z zaszumionymi elementami nie jest trywialne; 3. mniej pami˛eciożerna (szukaj w Internecie SGD algorithm with batch/mini-batch). Na rysunku 16.19 przedstawiono wyniki dopasowania linii i płaszczyzny do zebranych danych, dotyczacych ˛ wynajmu mieszkania przez grup˛e studentów. Przedstawiono model zależności jednowymiarowej (wykres po lewej stronie - koszt wynajmu jako funkcja 1D powierzchni mieszkania) oraz dwuwymiarowej (wkres po prawej stronie - koszt wynajmu jako funkcja 2D powierzchni mieszkania i liczby pokoi). Na rysunku 16.19 pokazano jak w obu przypadkach zmieniała si˛e wartość funkcji kosztu/bł˛edu podczas kolejnych iteracji algorytmu adaptacji współczynników wagowych. y = funkcja( x ) 8000 Koszt wynajmu [zlote] 7000 6000 5000 4000 3000 2000 1000 0 20 40 60 80 100 120 Powierzchnia [metry2 ] Rysunek 16.19: Przykład dopasowania modelu regresji liniowej do danych eksperymentalnych: koszt wynajmu mieszkania w złotych w funkcji jego powierzchni (po lewej, wagi: w0 = 784.7, w1 = 59.1951) albo powierzchni i liczby pokoi (po prawej, wagi: w0 = 990.1, w1 = 61.4, w2 = −99.5). 16.3 Regresja liniowa 105 7.5 347 J( iter ) 106 2.2 J( iter ) 2 7 Wartosc funkcji kosztu Wartosc funkcji kosztu 1.8 6.5 6 5.5 1.6 1.4 1.2 1 0.8 5 0.6 4.5 0.4 0 50 100 150 200 250 0 50 Numer iteracji 100 150 200 250 Numer iteracji Rysunek 16.20: Przykładowa zmienność wartości funkcji kosztu/bł˛edu podczas adaptacyjnego/iteracyjnego wyznaczania współczynników wagowych linii prostej (po lewej) i płaszczyzny (po prawej), przedstawionych na rysunku 16.19. Dowód. Dla ambitnych. Zajmijmy si˛e jeszcze dokładniejszym wytłumaczeniem przejścia od równania (16.6) do równania (16.7). Obliczmy pochodna˛ czastkow ˛ a˛ funkcji kosztu wzgl˛edem tylko jednej, dowolnej wagi wk , 0 ≦ k ≦ M: dJ(w) ∂ = ∂ wk 1 2 ! N ∂ ∑M 1 N ∂ en ∑Nn=1 e2n m=0 wm xn,m − yn = ∑ 2en = ∑ en = ∂ wk 2 n=1 dwk ∂ wk n=1 e1 N e2 = ∑ en xn,k = x1,k x2,k . . . xN,k · . . (16.11) .. n=1 eN Powtarzajac ˛ t˛e opercj˛e dla wszystkich wag k = 0, 1, ..., M oraz zapisujac ˛ M + 1 otrzymanych równań potaci (16.11) w postaci macierzowej otrzymujemy: 1 1 ... 1 e1 x1,1 x2,1 . . . xN,1 e2 dJ(w) T = (16.12) . = X e, x1,2 x2,2 . . . xN,2 · dw . . . . . . . . . . . . .. eN x1,M x2,M . . . xN,M czyli zależność (16.7) na pochodna˛ funkcji kosztu/bł˛edu. W przypadku regresji liniowej z wieloma argumentami, aby zapobiec nadmiernemu dopasowaniu krzywej aproksymujacej do danych o dużym rozrzucie, mimimalizuje si˛e funkcj˛e kosztu z dodanym składnikiem regularyzujacym, który wpływa na wygładzenie/stabilizowanie otrzymywanego rozwiazania ˛ (tzw. Lasso regression). W przypadku minimalizacji sumy kwadratów bł˛edów, modyfikuje si˛e funkcj˛e kosztu, opisana˛ równaniem (16.6), do nast˛epujacej ˛ postaci: 1 λ J(w) = eT e + wT w. 2 2 (16.13) gdzie λ oznacza współczynnik regularyzacji, a wT w to energia współczynników wagowych. Ponieważ pochodna tej funkcji wzgl˛edem wag w jest równa (odpowiednik równania (16.7)): 348 16 Podstawy numeryczne sztucznej inteligncji dJ(w) = XT e − λ w, (16.14) dw dlatego równanie adaptacji przyjmuje nast˛epujac ˛ a˛ postać w przypadku zastosowania regularyzacji (odpowiednik równania (16.10)): wn+1 = wn − µ dJ(wn ) = wn − µ XT e − λ wn = (1− µλ )wn − µXT e. (16.15) dwn Problem 16.9 ((L) *(**) Regresja liniowa - koszt wynajmu mieszkania jako funkcja jego powierzchni i liczby pokoi). Zapoznaj si˛e z programem (16.5) i sprawdź poprawność jego działania. Na ekranie monitora powinieneś zobaczyć wykresy 1D i 2D, podobne do przedstawionych na rysunku 16.19 - program dostarczony w wersji elektronicznej zawiera kod wizualizacji wyników. Znajdź linie programu, w których zostały zaimplementowane równania (16.9) i (16.10). Zwróć uwag˛e na normalizacj˛e danych, wykonana˛ przed zastosowaniem adaptacyjnego znajdowania rozwiaza˛ nia, oraz denormalizacj˛e obliczonych współczynników wagowych, przeprowadzona˛ po zakończeniu adaptacji. Sprawdź czy jest ona potrzebna (na chwil˛e ja˛ usuń). Zobacz jak jest istotny punkt startowy w procesie adaptacji (zastosuj wartości zerowe, losowe albo rozwiazanie ˛ równania normalnego o najmniejszym wymiarze). Korzystajac ˛ z rysunku 16.20 (zmiana wartości funkcji kosztu podczas adaptacji wag), znajdź najlepsze według ciebie wartości dla stałej szybkości adaptacji µ (mi) oraz stałej regularyzacji zadania obliczeniowego λ (lambda). Otrzymasz dodatkowe (**) jeśli zmodyfikujesz program i zastosujesz go do rozwiazania ˛ innego problemu (dane sam znajdź w Internecie). Listing 16.5: Przykład rozwiazania ˛ zadania regresji liniowej w j˛ezyku Matlab % ai_1_linreg_kwatera.m close all; clear all; load dane_kwatera.txt dane = dane_kwatera; clear dane_kwatera [N,M] = size(dane), % N = liczba zestawow danych, M = liczba zmiennych XX(:,1) = ones(N,1); XX(:,2) = dane(:,1); XX(:,3) = dane(:,2); y = dane(:,3); % inicjalizacja: c0=1 zawsze % kolumna 1 danych = powierzchnia w m^2 % kolumna 2 danych = liczba pokoi % kolumna 3 danych = koszt wynajmu w zlotych %% Jeden argument - wplyw tylko powierzchni mieszkania (x1) na koszt (y) % y = w0 + w1*x1 = [ 1 x1 ] * [ w0; % w1 ] X = XX(:,1:2); % 1 = jedynka, 2 = powierzchnia (x1) w1 = inv(X’*X)*X’*y, % macierzowe obliczenie wspolczynnikow wagowych w0, w1 w2 = train_linear_regress( X, y ), % adaptacyjne trenowanie %% Dwa argumenty - wplyw powierzchni mieszkania (x1) i liczby pokoi (x2) na koszt (y) % y = w0 + w1*x1 + w2*x2 = [ 1 x1 x2 ] * [ w0; % w1; % w2 ] X = XX(:,1:3); % 1 = jedynka, 2 = powierzchnia (x1), 3 = liczba pokoi (x2) 16.3 Regresja liniowa 349 w1 = inv(X’*X)*X’*y, % macierzowe obliczenie wspolczynnikow wagowych w0, w1 w2 = train_linear_regress( X, y ), % adaptacyjne trenowanie % ################################################## function w = train_linear_regress( X, y ) % adaptacja LMS wag w dla y = w0 + w1*x1 + w2*x2 + ... % X - macierz NxM cech (N przykladow (wierszy), M-1 cech (koulmn)); pierwsza kolumna jedynek dla w0) % y - wektor Nx1 % tak jak w przykladzie ai_1_kwatera.m [N,M] = size(X); Niter = 250; mi = 0.025; lambda = 0.; % liczba cykli uczenia, tzw. epoch % wsp. szybkosci uczenia % wsp. regularyzacji % Normalizacja wartosci kazdej cechy - bez jedynek zwiazanych ze wspolczynnikiem w0 Xmean = mean( X(:,1:M) ); % oblicz srednia kazdej cechy (kolumny) Xstd = std( X(:,1:M) ); % oblicz odch.std. kazdej cechy (kolumny) X(:,2:M) = X(:,2:M) - Xmean(2:M); % odejmij srednie w kolumnach X(:,2:M) = X(:,2:M) ./ Xstd(2:M); % podziel przez odchylenia standardowe w kolumnach % Adapatacja wartosci wag % w = zeros(M,1); % wartosci poczatkowe - same zera w = pinv(X(1:M,1:M))*y(1:M,1); % wartosci poczatkowe - 1-sza estymata for n = 1 : Niter % POCZATEK PETLI ################ err = X*w - y; % wektor roznic/bledow w = w - mi*(X’*err)/N; % adaptacja wag bez regularyzaci % w = w*(1-mi*lambda/N) - mi*(X’*err)/N; % adaptacja wag z regularyzacja err_hist(n) = err’ * err / N; % zapamietanie bledu - wartosci f. kosztu end % KONIEC PETLI ################# figure; plot(err_hist); title(’err_{history}( iter )’); pause % rysunek % Denormalizacja wspolczynnikow, kolejno w0, w1, w2 Xmean = Xmean’; Xstd = Xstd’; % transpozycja wektorow w(1) = w(1) - sum( w(2:end) .* Xmean(2:end) ./ Xstd(2:end) ); w(2:end) = w(2:end) ./ Xstd(2:end); Podstawowym ograniczeniem przedstawionej powyżej metody regresji liniowej, w jej obecnej postaci, jest możliwość zamodelowania tylko zależności liniowych: z użyciem linii w 2-D, płaszczyzny w 3-D oraz , hiperpłaszczyzny w N-D. Ale można metodzie regresji liniowej pomóc i uczynić z niej narz˛edzie bardziej uniwersalne. W takim przypadku y jest liniowa˛ kombinacja˛ nieliniowych składników, utworzonych z danych wejściowych x1 , x2 , ..., xM , przykładowo dla naszego przypadku kosztu wynajmu mieszkania w zależności od powierzchni (x1 ) i liczby pokoi (x2 ) w nast˛epujacy, ˛ alternatywny, wielomianowy sposób: y = w0 + w1 (x1 ) + w2 (x12 ) + w3 (x13 ) + ... + wP (x1P ) y = w0 + w1 (x1 ) + w2 (x2 ) + w3 (x12 ) + w4 (x22 ) + w5 (x1 x2 ) + w6 (x13 )+ + w7 (x23 ) + w8 (x12 x2 ) + w9 (x1 x22 ) + ... (16.16) (16.17) Na rysunku 16.21 przedstawiono wynik przykładowej aproksymacji wielomianowej. Wykorzystamy teraz ten rysunek do wytłumaczenia efektu/problemu tzw. przeuczenia, w tym przypadku metody regresji. 350 16 Podstawy numeryczne sztucznej inteligncji Efekt przeuczenia. Kiedy równania (16.16) i (16.17) maja˛ wiele składników, ogólnie kiedy metoda AI ma wiele parametrów, wówczas w przypadku małej liczby przykładów uczacych ˛ jest ona w stanie dopasować wartości tych parametrów do tych danych uczacych ˛ i utracić zdolność do uogólniania/generalizacji. W takim przypasku już “nauczona” metoda idealnie podejmie decyzj˛e dla przykładów, na których była uczona, natomiast b˛edzie miała bardzo duże problemy z nowymi przykładami. W przypadku regresji liniowej duży stopień wielomianu powoduje oscylacyjny charakter krzywej aproksymujacej, ˛ która może być na tyle skomplikowana aby przejść przez wszystkie punkty uczace. ˛ Czyli np. rozponajemy jabłko, gruszk˛e i śliwk˛e, a nie owoc. y = funkcja( x ) 15000 Koszt wynajmu [zlote] Rysunek 16.21 Przykład dopasowania modelu regresji liniowej do danych eksperymentalnych (koszt wynajmu mieszkania jako funkcja jego powierzchni) z użyciem wielomianów (16.16) do szóstego stopnia włacznie ˛ (P = 6). Obserwujemy efekt przeuczenia metody, czyli poda˛żania za danymi uczacymi. ˛ 10000 5000 0 10 20 30 40 50 60 70 80 90 100 110 120 Powierzchnia [metry2 ] Problem 16.10 (*** Od regresji wielomianowej 1D do 2D). Zapoznaj si˛e z programem 16.6. Uzupełnij go o przypadek opisany równaniem (16.17): w macierzy, wyst˛epujacej ˛ w równaniu (16.12), powinieneś dodać nowe kolumny, zawierajace ˛ składniki “wielomianowe” - teraz sa˛ tam tylko osobne cechy. Jak to zrobić? Na przykład tak: X=[x1, x2, x1.ˆ2, x2.ˆ2, x1.*x2, x1.*(x2.ˆ2)], gdzie x1 i x2 to wektory pionowe. Oblicz współczynniki wk oraz narysuj wynikajac ˛ a˛ z nich powierzchni˛e funkcji y = f (x1 , x2 ). Jak to zrobić? Oblicz wartości funkcji y = f (.) dla g˛estej siatki punktów (x1 , x2 ), a nast˛epnie wyświetl otrzymana˛ macierz Y za pomoca˛ funkcji mesh(Y), surf(Y), contour(Y), ... lub innej. Nie zapomnij opisać osi! Listing 16.6: Przykład rozwiazania ˛ zadania regresji liniowej w j˛ezyku Matlab % ai_1_linreg_kwatera_wielomian.m % Przyklad aproksymacji funkcji wielomianem wyzszego rzedu, a nie linia prosta. % Jeden argument: wplyw tylko powierzchni mieszkania (x) na jego koszt (y): % y = w0 + w1*x^1 + w2*x^2 + w3*x^3 + wK*x^K clear all; close all; load dane_kwatera.txt; dane = dane_kwatera; clear dane_kwatera K = 6; % maksymalny stopien wielomianu aproks., min 1 [N,M] = size(dane), % N = liczba zestawow danych, M = liczba zmiennych x = dane(:,1); % kolumna 1 danych = powierzchnia w m^2 y = dane(:,3); % kolumna 3 danych = koszt wynajmu w zlotych 16.4 Regresja logistyczna 351 figure; plot( x, y,’bo’); grid; xlabel(’Powierzchnia [metry^2]’); ylabel(’Koszt wynajmu [zlote]’); title(’y = funkcja( x )’); axis([10,120,0,15000]) hold on; xi = (10 : 1 : 120)’; % argumenty funkcji gesto sprobkowane X = ones( N, 1 ); % wartosci pierwszej kolumny macierzy Vandermonde’a Xi = ones( length(xi), 1 ); % j.w. tylko dla gestego probkowania for k = 1 : K % dla kolejnych stopni wielomianu X = [ X x.^k ]; % macierz Vandermonde’a wyzszego stopnia w = inv(X’*X)*X’*y, % macierzowe obliczenie wsp. wagowych wielomianu Xi = [ Xi xi.^k ]; yi = Xi * w; plot( xi, yi ); hold on; pause % macierz Vandermonde’a wyzszego stopnia dla aproksymscji % obliczenie funkcji aproksymujacej % dodanie do rysunku funkcji aproks. wyzszego stopnia % end 16.4 Regresja logistyczna Regresja logistyczna jest rozwini˛eciem matematycznym regresji liniowej. Jej proste wytłumaczenie można znaleźć w [16], czyli tutaj. W zadaniu regresji liniowej chcieliśmy przewidzieć wartość rzeczywista˛ y na podstawie kilku (-nastu, -dziedzi˛eciu) znanych wartości xm , m = 1, 2, ..., M. Na przykład koszt wynajmu mieszkania na podstawie jego cech: powierzchni, liczby pokoi, pi˛etra, dzielnicy, ... A jakby to zadanie zmodyfikować i przewidywać czy mieszkanie o zdanych paramatrach znajdzie w ogóle ch˛etnego czy też nie. Sprowadzi si˛e to do prognozowania wartości y ze zbioru dwuelementowego {1, 0} (b˛edzie wynaj˛ete albo pozostanie niewynaj˛ete). Podobnie możemy sobie zadawać pytanie czy osoba majaca ˛ takie-i-takie oceny z matury dostanie si˛e na takie-i-takie studia czy też nie, albo czy osoba majaca ˛ takie-i-takie wyniki morfologii krwi jest chora na coś czy też nie. Uogólniajac, ˛ czyli patrzac ˛ szerzej, możemy obliczać prawdopodobieństwo zajścia “czegoś”, czyli mówić o “statystycznym” aspekcie uczenia maszynowego. Jak widać coraz bardziej zaczyna si˛e “roznosić w okolicy zapach” sztucznej inteligencji. Jak rozwiazuje ˛ si˛e zadania tego typu? W sposób nast˛epujacy. ˛ Dalej mnoży si˛e liczby xm przez wagi wk , które trzeba dobrać, oraz dodaje si˛e wyniki mnożeń razem z przesuni˛eciem w0 : 1 M x 1 z = w0 + ∑ wm xm = w0 w1 . . . wM · . = wT x = g(x), (16.18) . . m=1 xM ale potem otrzymana˛ liczb˛e rzeczywista˛ z przedziału (−∞, +∞) (oznaczyliśmy ja˛ przez z) traktuje si˛e jako argument funkcji nieliniowej f (z): py = f (z), np. f (z) = 1 , 1 − e−z (16.19) przyjmujacej ˛ wartości rzeczywiste z przedziału [0, 1]. Wynik tej funkcji możemy interpretować jako prawdopodobieństwo py zajścia konkretego stanu y. Przykładowo: 0 to niedostanie si˛e na studia, 1 to dostanie, a 0.5 - to “na dwoje Babka wróżyła”. Ilustracja˛ 352 16 Podstawy numeryczne sztucznej inteligncji tego podejścia jest rysunek 16.7, przedstawiajacy ˛ budow˛e sztucznego neuronu obliczeniowego. Najlepiej kiedy funkcja py = f (z) jest gładka, monotoniczna i różniczkowalna w każdym punkcie, np. patrz https:// pl.wikipedia.org/ wiki/ Funkcja_aktywacji. Najcz˛eściej stosuje si˛e funkcje sigmoidalne: unipolarna˛ i bipolarna˛ (tangens hiperboliczny). Unipolarna funkcja sigmoidalna jest zdefiniowana rówaniem (16.19) i ma kształt zbliżony do pokazanego na rysunku 16.74 . Załóżmy teraz, że zebraliśmy N punktów pomiarowych/eksperymentalnych (wejścia x i wyjście y dla n = 1, 2, 3, ..., N): (xn , yn = {0, 1}, ) (16.20) i że chcemy nauczyć nimi nasza˛ funkcje aktywacji f (z) podejmowania najlepszej decyzji (mieszkanie zostanie wynajete, kandydat dostanie si˛e na studia, pacjent jest zdrowy - myślmy pozytywnie). W tym celu zapisujemy równania (16.18)(16.19) dla każdego przypadku ze zbioru uczacego ˛ (n = 1, 2, 3, ..., N): pyn = 1 , 1 − e−zn zn = g(x1 , ..., xM ) = wT xn = w0 + w1 x1 + w2 x2 + ... + wM xM , (16.21) i chcemy znaleźć wartości wag w, które maksymalizuja˛ łaczne ˛ prawdopodobieństwo podj˛ecia poprawnych decyzji dla zbioru uczacego ˛ (dokładnie: maksymalizuja˛ logarytm naturalny z iloczynu wszystkich prawdopodobieństw, obliczonych dla konkretnych wartości wektora wag w): ! h i yn (1−yn ) J(w) = ln ∏ (pyn ) (1 − pyn ) = N n=1 N ∑ [yn ln(pyn ) + (1 − yn ) ln(1 − pyn )]. n=1 (16.22) Ostatni wzór wyglada “kosmicznie”. Ale “rozbieżmy go na cz˛eści”. Ponieważ yn = 0 ALBO yn = 1, dlatego elementami iloczynu ∏ [.] sa˛ tylko wartości pyn dla yn = 1 (gdyż wówczas (1 − yn ) = 0) oraz wartości (1 − pyn ) dla yn = 0 (ponieważ wtedy (1 − yn ) = 1). Prawa strona wzoru jest już wyłacznie ˛ konsekwencja˛ lewej strony. A teraz tylko pozostaje nam obliczyć pochodna˛ naszej funkcji kosztu wzgl˛edem dowolnej wagi i zmieniać wartość tej wagi proporcjonalnie do wartości pochodnej, czyli w kierunku najszybszego wzrostu funkcji kosztu (w przypadku zastosowania bibliotecznych funkcji minimalizujacych ˛ negujemy funkcj˛e kosztu i poda˛żamy w kierunku jej najszybszego spadku). A wi˛ec do dzieła (patrz równanie (16.21): pyn = f (zn ) = f (wT xn ): N ∂ J(w) =∑ ∂ wk n=1 N = ∑ n=1 N = yn 1 − yn + pyn 1 − pyn ∂ pyn = ∂ wk yn 1 − yn + pyn 1 − pyn ∂z pyn (1 − pyn ) = ∂ wk ∑ [(yn (1 − pyn ) − (1 − yn )pyn ) xk ] = n=1 N = ∑ [(yn − pyn ) xk ] (16.23) n=1 4 W sieciach ANN z logistic regression tylko ostatnia warstwa (wyjściowa) ma funkcj˛e aktywacji sigmoidalna,˛ zaś wcześniejsze warstwy używaja˛ zazwyczaj funkcji ReLU. Sigmoida musi być na końcu aby otrzymać prawdopodobieństwo 16.4 Regresja logistyczna 353 Powyżej zastosowaliśmy nast˛epujace ˛ wzory na pochodne funkcji (patrz https:// pl. wikipedia.org/ wiki/ Pochodna_funkcji)(zwróćmy uwag˛e, że zwyczajowo w matematyce ln(), log(), log2 () oznaczaja˛ logarytm naturalny, dziesi˛etny i logarytm przy podstawie 2, w Matlabie odpowiednio funkcje log(),log10(),log2()): ′ 1 (ln(x)) = x ′ 1 1 1 1 −x f (x) = = 1 − = f (x)(1 − f (x)). e = 1 + e−x 1 + e−x 1 + e−x (1 + e−x )2 Podsumowanie. Ponieważ do obliczenia wag w regresji logistycznej chcemy stosować technik˛e minimalizacji a nie maksymalizacji, dlatego negujemy kryterium (16.22). Dodatkowo chcac ˛ otrzymać stabilny algorytm adaptacyjny, dodajemy do zanegowanego równania składnik regularyzacyjny (ale nie uwzgl˛edniajacy ˛ wagi w0 ). W zwiazku ˛ z powyższym otrzymujemy: N J(w) = λ M ∑ [−yn ln(pyn )−(1 − yn ) ln(1 − pyn )] + 2N ∑ w2m . (16.24) m=1 n=1 Podobnie post˛epujemy z obliczonym wzorem (16.23) na pochoda˛ funkcji kosztu (negacja oraz dodanie składnika regularyzacyjnego do wszystkich pochodnych k = 1, ..., M oprócz pochodnej wzgl˛edem w0 ): ∂ J(w) λ 1 N = ∑ [(−yn +pyn ) xk ] + wk . ∂ wk N n=1 N (16.25) W zwiazku ˛ z tym równanie adaptacji wartości pojedynczej wagi w zadaniu regresji logistycznej ma dla algorytmu optymalizacyjnego najwi˛ekszego spadku nast˛epujac ˛ a˛ postać (odpowiednik równania (16.15) regresji liniowej, zanegowanie pochodnej ponieważ chcemy poruszać si˛e w kierunku zmniejszania si˛e, a nie w kierunku wzrostu wartości funkcji kosztu): wk (n + 1) = wk (n) − µ ∂ J(w) 1 N λ = wk (n) − ∑ [(−yn +pyn ) xk ] + wk . (16.26) ∂ wk N n=1 N Ostatni wzór (16.26) jest podstawa˛ prostego, adaptacyjnego (iteracyjnego) znalezienia najlepszych wartości wag regresji logistycznej metoda˛ SGD (Stochastic Gradient Descent). Pozostawiamy to jako zadanie domowe dla studentów. My sami do wyznaczenia ww. wag skorzystamy w programie 16.7 z równania (16.24) oraz (16.25). W j˛ezyku Matlab możemy przeprowadzać minimalizacj˛e funkcji za pomoca˛ wielu dost˛epnych, wbudowanych funkcji bibliotecznych (np. fminunc(.)) - alternatywa˛ jest użycie funkcji open-source (np. fmincg(.)). Przykład 1. Załóżmy, że produkujemy jakieś urzadzenie ˛ i przed wysłaniem go sklepu przeprowadzamy test jakości: dwa niezależne pomiary, które powinny dać jako wynik małe liczby, jeśli urzadzenie ˛ działa poprawnie. Załóżmy, że wykonaliśmy ww. pomiary na grupie urzadzeń ˛ dobrych/działajacych ˛ i złych/uszkodzonych i otrzymaliśmy wynik przedstawiony na rysunku 16.22 po lewej stronie - czerwone kółka (źle) i jasnoniebieskie kwadraty (dobrze). Jesteśmy zainteresowani zautomatyzowaniem procesu decyzyjnego nie/tak i znalezieniem rówania krzywej, rozdzielajacej ˛ obszary z wyraźna przewaga˛ kółek oraz wyraźna˛ przewaga˛ kwadratów - przy- 354 16 Podstawy numeryczne sztucznej inteligncji kładowa jest narysowana ciagł ˛ a,˛ zielona˛ linia.˛ W tym celu wybieramy funkcj˛e regresji liniowej postaci wielomianowej (16.17), a nie zwykłej (16.21), i stosujemy ja˛ w równaniu funkcji kosztu regresji logistycznej (16.21). Ponieważ optymalne wartości wag regresji znajdziemy z użyciem funkcji optymalizacyjnej szukajacej ˛ minimum, dlatego użyta przez nas funkcja kosztu, wraz ze składnikiem regularyzacyjnym, ma “zanegowana” ˛ postać zdefiniowa˛ równaniem (16.24), zaś jej pochodna dana jest wzorem (16.25). Prosz˛e, znajdź programowe odpowiedniki tych równań w napisanych przez nas funkcjach Matlaba cost_function() oraz gradient_step(), zawartych w listingu 16.8. Po otrzymaniu z funkcji train_logistic_regress() wartości wag, obliczonych przez jedna˛ z systemowych funkcji optymalizacyjnych Matlaba, np. fminunc(), lub funkcji open-source, np. fmincg(), możemy obliczyć wartości funkcji g(c1 , c2 ) (patrz równanie (16.21)) dla wielu punktów (cecha1 , cecha2 ) oraz je zwizualizować w przestrzeni 3-D (jako (c1 , c2 , g(c1 , c2 ))) za pomoca˛ funkcji mesh(). Wynik takiego post˛epowania jest pokazany na rysunku 16.22 po prawej stronie. Jak widzimy zielona krzywa, pokazana na rysunku po lewej stronie, jest wynikiem przeci˛ecia funkcji regresji z = g(c1 , c2 ) z płaszczyzna˛ z = 0. Wynika to stad, ˛ że wagi w sa˛ tak dobierane, aby funkcja regresji z = g(c1 , c2 , ...) przyjmowała ujemne wartości w punktach należacych ˛ do interesujacej ˛ nas klasy danych wejściowych: w naszym przypadku produktów nieuszkodzonych (ujemne wartości, ponieważ używamy zanegownej funkcji kosztu i szukamy minimum). Regularyzacja: lambda = 1 dobre zle decyzja 1 Cecha 2 0.5 0 -0.5 -1 -1 -0.5 0 0.5 1 Cecha 1 Rysunek 16.22: Przykład podejmowania decyzji wadliwy/poprawny, np. pralka albo układ scalony, na podstawie wyników dwóch testów: cecha c1 oraz cecha c2 . Po lewej: punkty pomiarowe dla obu stanów oraz obliczona krzywa decyzyjna (w środku poprawne, na zewnatrz ˛ wadliwe). Po prawej: wytłumaczenie pochodzenia krzywej decyzyjnej jako linii powstałej w wyniku przeci˛ecia powierzchni funkcji regresji z = g(c1 , c2 ) z płaszczyzna˛ z = 0. Przykład 2. W tym przypadku zastosujemy metod˛e regresji logistycznej do ewentualnego wykrycia astmy w zapisach dźwi˛ekowych ludzkiego oddechu. Na rysunku 16.23, po lewej stronie, jest przedstawiony rozkład punktów, który otrzymano dla pary cech (c1 , c2 ) =(ASE,TI), obliczonych dla wielu nagrań. Natomiast po prawej stronie jest pokazany kształ funkcji kosztu J(w), zaproponowany przez funkcj˛e biblioteczna˛ Matlaba fminunc(). Jak widać podobnie, jak w przykładzie 1, zielona krzywa rozgraniczajaca ˛ punkty zdrowia i choroby na rysunku lewym jest wynikiem przeci˛ecia funkcji regresji z = g(c1 , c2 ) z płaszczyzna˛ z = 0 na rysunku prawym. 16.4 Regresja logistyczna 355 Regularyzacja: lambda = 1 1.5 dobre zle decyzja Cecha 2 1 0.5 0 1 1.5 2 2.5 3 3.5 4 4.5 Cecha 1 Rysunek 16.23: Przykład podejmowania decyzji oddech astmatyczny vs. oddech normalny na podstawie obliczonych dwóch cech: ASE (AudioSpectral Envelope) (cecha c1 ) oraz TI (Tonality Index) (cecha c2 ). Po lewej: punkty pomiarowe dla obu stanów oraz obliczona krzywa decyzyjna (w lewym dolnym rogu jest oddech normalny, poza nim - astmatyczny). Po prawej: wytłumaczenie pochodzenia krzywej decyzyjnej jako linii powstałej w wyniku przeci˛ecia powierzchni funkcji regresji z = g(c1 , c2 ) z płaszczyzna˛ z = 0. Ponieważ algorytm uczenia podczas minimalizacji kieruje si˛e średnia˛ wartościa˛ funkcji celu obliczona˛ dla wszystkich przykładów (a nie średnia˛ wartościa˛ ze średnich wartości, uzyskanych dla poszczególnych klas), dlatego powinniśmy zadbać o to, aby zbiór danych uczacych ˛ był dobrze zbalansowany, tzn. każda klasa miała podobna˛ liczb˛e przykładów uczacych. ˛ W poniższych zadaniach wykorzystuje si˛e dane dla produktów uszkodzonych/nieuszkodzonych oraz dla ludzi chorych/zdrowych, ale zadbano o to, aby zbiory przykładów były równoliczne (zbalansowane) i produkty nieuszkodzone oraz ludzie zdrowi nie byli nad-reprezentowani. Problem 16.11 ((L) **(**) Regresja logistyczna - kontrola jakości produkcji/towaru oraz stanu zdrowia). Zapoznaj si˛e z programem (16.7), uruchom go i sprawdź +/- poprawność jego działania. W zależności od wyboru zbioru danych wejściowych, powinieneś na ekranie monitora zobaczyć wykresy 1D i 2D, podobne do przedstawionych na rysunkach 16.22 oraz 16.23. Program wczytuje macierz X, która w kolejnych wierszach ma wartości dwóch cech, obliczonych dla konkretnego stanu obiektu (czyli w każdej kolumnie sa˛ wartości innej cechy, obliczonej po kolei dla wszystkich obiektów). Natomiast pionowy wektor y w kolejnych wierszach ma numer stanu obiektu: 1 = stan wadliwy (choroba), 0 = stan normalny (zdrowie). Na rysunku możemy zobaczyć rozkład punktów cech na płaszczyźnie 2-D - lewe wykresy na rysunkach 16.22 i 16.23. Nast˛epnie napisana przez nas funkcja nowa_macierz_cech() dodaje do cech x1 i x2 ich składniki wielomianowe - patrz równania (16.16) i (16.17). Potem nasza funkcja train_logistic_regress() znajduje optymalne wartości wag w dla zmodyfikowanego równania regresji. Na końcu obliczamy funkcj˛e z = (x1 , x2 ) dla znanych wartości wag na g˛estej siatce punktów testowych (x1 , x2 ) oraz ja˛ rysujemy. Zadania. Zmień: stopień rozszerzenia wielomianowego poly_degree (1,2,3,4,5,6), liczb˛e cykli uczenia iteracji Niter (1,10,50,100,250,500), wartość współczynnika regularyzacji lambda (0, 0.1, 0.25, 0.5, 1). Nast˛epnie w funkcji train_logistic_regress(): usuń normalizacj˛e cech, zmień inicjalizacj˛e w_init. Na koniec spróbuj zmienić funkcj˛e decyzyjna/aktywacji ˛ z sigmoid() na inna.˛ Otrzymasz dodatkowe (**) jeśli zmodyfikujesz program i zastosujesz go do rozwiazania ˛ innego problemu (dane sam znajdź w Internecie). 356 16 Podstawy numeryczne sztucznej inteligncji Problem 16.12 (** Regresja logistyczna - obserwacja pracy algorytmu funkcji optymalizacji fmincg() w zastosowaniu do zmiany wartości wag). Zapoznaj si˛e z funkcja˛ open-source fmincg(), udost˛epniona˛ w repozytorium. Użyj jej zamiast funkcji bibliotecznej Matlaba fminunc() w naszej funkcji train_logistic_regress(). Prześledź działanie fmincg() krokujac ˛ i zatrzymujac ˛ funkcj˛e, np. w debuggerze Matlaba, oraz ogladaj ˛ ac ˛ wartości wyników przejściowych. Problem 16.13 (*** Regresja logistyczna - implementacja algorytmu SGD optymalizacji wartości wag). Wzorujac ˛ si˛e na funkcji fmincg(), udost˛epnionej w repozytorium, zaproponuj swoja,˛ prostsza˛ funkcj˛e, implementujac ˛ a˛ algorytm optymalizacji metoda˛ najwi˛ekszego spadku SGD, zdefiniowany równaniem (16.26). Listing 16.7: Przykład rozwiazania ˛ zadania regresji logistycznej w j˛ezyku Matlab % ai_2_logreg_usterki.m clear all; close all; % Wczytaj dane load dane_usterki.txt; dane = dane_usterki; itest=1; % kontrola jakosci produkcji % load dane_astma.txt; dane = dane_astma; itest=2; % diagnostyka zdrowia [N,M] = size( dane ); X = dane(:,1:M-1); y = dane(:,M); M = M-1; % wymiary danych: liczba przykladow, liczba cech plus 1 % cechy % decyzja % liczba cech nr_alarm = find(y == 1); nr_ok = find(y == 0); % stan wadliwy % stan poprawny figure plot( X(nr_ok,1), X(nr_ok,2), ’bs’,’MarkerFaceColor’,’g’); hold on; plot( X( nr_alarm,1 ), X( nr_alarm,2 ), ’ko’,’MarkerFaceColor’,’r’); xlabel(’Cecha 1’); ylabel(’Cecha 2’); grid; legend(’dobre’,’zle’); pause % Dodanie cech "wielomianowych" typu X1^2, X2^2, ..., (X1^2)*(X2^3) % Umozliwia uzyskanie bardziej skomplikowanych krzywych decyzyjnych poly_degree = 4; % stopien wielomianu X = nowa_macierz_cech( X(:, 1), X(:, 2), poly_degree ); % Znalezienie optymalnych wartosci wag "g" dla zbioru uczacego Niter = 500; % liczba cykli uczenia, tzw. epoch lambda = 1.; % wsp. regularyzacji w = train_logistic_regress( X, y, lambda, Niter ); % Sprawdzenie krzywej decyzyjnej % Wygenerowanie wartosci cech x1 (u) i x2 (v) w wezlach siatki sprawdzajacej if(itest==1) x1 = linspace(-1.2, 1.2, 50); x2 = linspace(-1.2, 1.2, 50); end if(itest==2) x1 = linspace(1, 4, 50); x2 = linspace(0, 1.5, 50); end % Obliczamy z = sum( x .* w’ ) dla kazdego punktu siatki testowej % czyli sprawdzamy jakie wartosci zwroci funkcja kosztu dla tych danych z = zeros( length(x1), length(x2) ); for i = 1 : length(x1) 16.4 Regresja logistyczna 357 for j = 1 : length(x2) x = nowa_macierz_cech( x1(i), x2(j), poly_degree ); % dodanie cech wielomianowych z(i, j) = x * w; % obliczenie wartosci funkcji end end % Nakladamy na poprzedni rysunek kontur dla z=0, dlatego zakres [0, 0] contour(x1, x2, z’, [0, 0], ’LineWidth’, 2); title(sprintf(’Regularyzacja: lambda = %g’, lambda)); legend(’dobre’, ’zle’, ’decyzja’); hold off; pause Listing 16.8: Nasze funkcje wykorzystywane w zadaniach regresji logistycznej % ######################################################################### function X = nowa_macierz_cech( X1, X2, poly_degree) % Utworzenie macierzy cech, uzupelnionej o cechy wielomianowe. W kolejnych kolumnach: % 1, X1, X2, X1.^2, X2.^2, X1*X2, X1*X2.^2, itd. X = ones( size(X1(:, 1)) ); for i = 1 : poly_degree for j = 0 : i X(:, end + 1) = (X1.^(i - j)) .* (X2.^j); end end end % ######################################################################### function w = train_logistic_regress( X, y, lambda, Niter ) % adaptacyjne obliczenie wag "w" dla y = w0 + w1*x1 + w2*x2 + w3*x1^2 + w4*x2^2 +... % X - macierz NxM z cechami wielomianowymi, pierwsza kolumna jedynek dla w0 % y - wektor Nx1 % tak jak w przykladzie ai_1_kwatera.m [N,M] = size(X); %% Normalizacja wartosci kazdej cechy - bez jedynek zwiazanych ze wspolczynnikiem w0 Xmean = mean( X(:,1:M) ); % oblicz srednia kazdej cechy (kolumny) Xstd = std( X(:,1:M) ); % oblicz odch.std. kazdej cechy (kolumny) X(:,2:M) = X(:,2:M) - Xmean(2:M); % odejmij srednie w kolumnach X(:,2:M) = X(:,2:M) ./ Xstd(2:M); % podziel przez odchylenia standardowe w kolumnach %% Adapatacja wartosci wag "w" w_init = zeros(M,1); % wartosci poczatkowe - same zera options = optimset(’GradObj’, ’on’, ’MaxIter’, Niter); [w, cost, exit_flag] = fminunc(@(w)(optim_callback(X, y, w, lambda)), w_init, options); % w = fmincg( @(w)( optim_callback(X, y, w, lambda)), w_init, options); % do testowania %% Denormalizacja wspolczynnikow, kolejno w0, w1, w2 Xmean = Xmean’; Xstd = Xstd’; % transpozycja wektorow w(1) = w(1) - sum( w(2:M) .* Xmean(2:M) ./ Xstd(2:M) ); w(2:end) = w(2:M) ./ Xstd(2:M); end % ######################################################################### function [cost, gradients] = optim_callback( X, y, w, lambda ) N = length( y ); % liczba przykladow y_pred = sigmoid(X * w); % predykcja/prognoza/hipoteza y cost = cost_function(X, y, y_pred, w, lambda, N); % obliczenie funkcji kosztu gradients = gradient_step(X, y, y_pred, w, lambda, N); % obliczenie gradientow dla "w" end % ######################################################################### function [cost] = cost_function( X, y, y_pred, w, lambda, N ) regular = lambda/(2*N) * sum( w(2:end,1).^2 ); % p. regularyzacji cost = -(1/N) * (y’*log(y_pred) + (1-y)’*log(1-y_pred)) + regular; % funkcja kosztu 358 16 Podstawy numeryczne sztucznej inteligncji Rysunek 16.24: 10 z posiadanych 500 przykładów zapisów odr˛ecznych dla każdej cyfry. end % ######################################################################### function [gradients] = gradient_step( X, y, y_pred, w, lambda, N ) regular = (lambda/N) * w; % parametr regularyzacji gradients = (1/N) * (X’ * (y_pred - y)) + regular; % regularyzacja dla gradients(1) = (1/N) * (X(:,1)’ * (y_pred - y)); % wszystkich w bez w0 end % ######################################################################### function y = sigmoid( x ) y = 1 ./ (1 + exp(-x)); end Czasami nam si˛e wydaje, że tracimy czas i uczymy si˛e czegoś co ma bardzo waskie ˛ pole zastosowania. Owszem, owo “coś” pokazuje nam na jakimś prostym przykładzie jaka jest istota algorytmu i programu, ale mamy wrażenie, że przykład jest zbyt prosty i że nie b˛edziemy mogli szerzej zastosować zawartej w nim wiedzy. Aby przekonać potencjalnych czytelników-niedowiarków, zastosujemy kod funkcji z listingu 16.8 do rozpoznawania r˛ecznie pisanych cyfr. Tak właściwie to tylko napiszemy inny program główny (inny interfejs), wywołujacy ˛ te same funkcje, zast˛epujacy ˛ program 16.7. Przykład 3. Dysponujemy zbiorem 500 obrazków o wymiarach 20 × 20 pikseli dla każdej z dziesi˛eciu cyfr od 0 (oznaczane jako 10) do 9, ale r˛ecznie pisanych. Razem jest to 5000 obrazków, umieszczonych umieszczonych w jednej macierzy, majacej ˛ 10 · 500 = 5000 wierszy i 401 kolumn (kod 400 pikseli plus kod reprezentowanej przez nie cyfry: 1,2,...,9,10=0). Na rysunku 16.24 pokazano 10 przykładowych zapisów każdej cyfry, natomiast na rysunku 16.25 - powi˛ekszenie wybranych 9 cyfr. Wszystkie dost˛epne przykłady użyto do wytrenowania algorytmu regresji logistycznej, a nast˛epnie wszystkie (te same) rozpoznawano. Uzyskano dokładność 95%. Czyli jednak nauczyliśmy si˛e czegoś konkretnego? 16.4 Regresja logistyczna 359 10 20 30 40 50 60 10 20 30 40 50 60 Rysunek 16.25: Powi˛ekszenie wybranych przykładów cyfr od 1 do 9 - w celu zwi˛ekszenia widoczności detali numery kolorów sa˛ teraz interpretowane jako indeksy w palecie niebieski-zielony-żółty, a nie czarny-szary-biały. Problem 16.14 (**(**) Regresja logistyczna - rozpoznawanie cyfr). Zapoznaj si˛e z programem (16.9), uruchom go i sprawdź +/- poprawność jego działania. Wyznacz jak zmienia si˛e dokładność rozpoznawania w zależności od liczy cykli uczenia: N_iter_fmin=1,5,10,20,50,100. Wyznacz t˛e zależność dla różnych wartości współczynników regularyzacji: lambda = 0, 0.01, 0.02, 0.05, 0.1, ... — znajdź najlepsza˛ wartość. Dodatkowe (**) otrzymasz jeśli wykonasz zadania jak wyżej, tylko zbiór obrazów b˛edziesz wielokrotnie losowo dzielił na dwie równe cz˛eści i pierwsza˛ z nich b˛edziesz wykorzystywał do nauki, a druga˛ do testowania. Listing 16.9: Program do rozpoznawania cyfr metoda˛ regresji logistycznej % ai_5_logreg_cyfry.m % Rozpoznawanie cyfr z uzyciem metody regresji logistycznej clear all; close all; % Wczytanie danych (obrazow) load cyfry.mat % 10 razy po 500 obrazkow 20x20 pikseli na jedna cyfre 360 N_klas = 10; N_wzorcow = 500; N_x = 20; N_y = 20; 16 Podstawy numeryczne sztucznej inteligncji % czyli macierz X: 5000 wierszy po 400 liczb w wierszu % liczba testowanych cyfr 0,1,2,...,9 % liczba przykladow/wzorcow dla kazdej klasy/cyfry % liczba pikseli kazdego obrazu-wzorca w poziomie % liczba pikseli kazdego obrazu-wzorca w pionie N_przykladow = N_klas *N_wzorcow; N_cech = N_x * N_y; % liczba wszystkich obrazow-wzorcow % liczba wszystkich pikseli pojedynczego obrazu % Pokaz wybrane obrazy wzorcow n1st = 10; % od 1 do N_wzorcow figure; % colormap(gray); for nr = n1st : 500 : N_przykladow nr img = X( nr, 1 : N_cech ); % cechy to kolejne piksele img = reshape( img, N_y, N_x ); imagesc( img ); axis square; pause(0.5); end figure; plot(y); xlabel(’nr przykladu’); ylabel(’nr klasy’); grid; title(’Ch-ka danych’); pause X = [ ones(N_przykladow, 1) X ]; % dodanie 1 dla w0 % Znalezienie optymalnych wartosci wag "w" na podstawie zbioru uczacego dla kazdej klasy N_iter_fmin = 50; % liczba iteracji proceduru minimalizacyjnej lambda = 0.01; % wspolczynnk regularyzacji podczas minimalizacji w_all = zeros( N_klas, 1 + N_cech); % w0, w1, w2, ..., wP - poczatkowe wagi pikseli options = optimset(’GradObj’, ’on’, ’MaxIter’, 50 ); % dla funkcji fmincg() for nr_klasy = 1 : N_klas % powtorz dla kazdej klasy, cyfra 0 to klasa 10 y_klasy = (y == nr_klasy); % ustaw 1 w wekt. y-klasa tylko dla wybranej klasy w_init = zeros(1 + N_cech, 1); % inicjalizacja wag gradient_function = @(t) optim_callback( X, y_klasy, t, lambda ); w = fmincg( gradient_function, w_init, options); w_all( nr_klasy, :) = w’; plot(y_klasy); title(’Sprawdzona klasa’); disp(’Nacisnij cokolwiek ...’); pause end % Rozpoznawanie cyfr ze zbioru uczacego hipotezy = sigmoid( X * w_all’ ); % wartosci funkcji decyzyjnej: 5000x10 [ wartosc, indeks ] = max( hipotezy, [], 2); % indeksy maksimow dla kazdego przykladu fprintf(’\nDokladnosc: %f\n’, mean( double( indeks == y )) * 100); % ####################################################################### % ######################################################################### % ######################################################################### function [cost, gradients] = optim_callback( X, y, w, lambda ) N = length( y ); % liczba przykladow y_pred = sigmoid( X * w ); % predykcja/prognoza y cost = cost_function( X, y, y_pred, w, lambda, N ); % obliczenie funkcji kosztu gradients = gradient_step( X, y, y_pred, w, lambda, N ); % obliczenie gradientow dla w end % ######################################################################### function [cost] = cost_function( X, y, y_pred, w, lambda, N ) regular = lambda/(2*N) * sum( w(2:end,1).^2 ); % parametr regularyzacji cost = -(1/N) * (y’*log(y_pred) + (1-y)’*log(1-y_pred)) + regular; % funkcja kosztu end % ######################################################################### function [gradients] = gradient_step( X, y, y_pred, w, lambda, N ) regular = (lambda/N) * w; % parametr regularyzacji gradients = (1/N) * (X’ * (y_pred - y)) + regular; % regularyzacja dla w gradients(1) = (1/N) * (X(:,1)’ * (y_pred - y)); % oprocz w0 end % ######################################################################### function y = sigmoid( x ) 16.5 Sztuczne sieci neuronowe - płytkie i głebokie 361 y = 1 ./ (1 + exp(-x)); end 16.5 Sztuczne sieci neuronowe - płytkie i głebokie Tak, wreszcze doszliśmy do podrozdziału, długooczekiwanego przez wi˛ekszość studentów, który ma nam zdradzić tajniki programowania sztucznych sieci neuronowych (ANN - Artificial Neural Networks. W podrozdziale 16.1 zapoznaliśmy si˛e z podstawami ANN: wiemy już jaka˛ struktur˛e ma sztuczny neuron (rys. 16.7) oraz sama sieć ANN (rys. 16.8), czym si˛e różni splotowa sieć od zwykłej (rys. 16.9) (posiada na wejściu splotowe warstwy ekstrakcji cech) oraz gł˛eboka od zwykłej/płytkiej (posiada o wiele wi˛ecej warstw i neuronów). 16.5.1 Zwiazek ˛ ANN z regresja˛ liniowa˛ i logistyczna˛ Na poczatek ˛ pokażemy, że klasyczna sieć ANN jest szczególnym przypadkiem rozwiazania ˛ zadania/problemu regresjii logistycznej. Na rysunku 16.26 jest przedstawiona prosta sieć, majaca ˛ dwa wejścia x1 , x2 , jedna˛ warst˛e pośrednia˛ (ukryta) ˛ z dwoma neuronami oraz warstw˛e wyjściowa˛ także z dwoma neuronami, o wyjściach y1 , y2 . Zwróć uwag˛e, że w celu uproszczenia rysunku nie zaznaczono na nim wyjściowych funkcji aktywacji neuronów. Dodatkowo operacje mnożenia danych wejściowych przez wagi poszczególnych neuronów ak , bk sa˛ zaznaczone strzałkami (przykładowo a1 nad strzałka˛ ▶ oznacza pomnożenie x1 przez a1 . Analizujac ˛ rysunek 16.26 widzimy, że na wyjściu neuronów pierwszej warstwy, otrzymujemy wartości opisujace ˛ lini˛e prosta˛ (x2 jako funkcja x1 ), natomiast na wyjściu neuronów drugiej, wyjściowej warstwy – równanie dwóch prostych. Możemy si˛e domyślać, że każda linia w pierwszej warstwie rozgranicza przestrzeń x1 , x2 na dwa rozłaczne ˛ obszary decyzyjne tak/nie, a majac ˛ dwie linie możemy wybrać najlepsza˛ dla nas liniowa˛ kombinacj˛e dwóch decyzji. Czyli decyzje neuronów nast˛epnych warstw sa˛ liniowa˛ kombinacja˛ decyzji neuronów poprzednich warstw. Dlatego im wi˛ecej jest warstw i neuronów (np. tak jak narysunku 16.27), tym wi˛ecej linii decyzyjnych otrzymujemy po ostatniej warstwie i obszar decyzyjny “na tak” może mieć bardziej skomplikowany kształt, np. trójkata, ˛ czworokata, ˛ pi˛eciokata, ˛ .... o czym przekona nas zadanie 16.15. Na rysunku 16.26 zaniedbano funkcje aktywacji neuronów, natomiast na rysunku 16.27 sa˛ one uwzgl˛ednione. Funkcje aktywacji umożliwiaja˛ budowanie sieci o wielowarstwowych strukturach. Bez nich wszystko by si˛e sprowadziło do zwykłego mnożenia macierzy (uległo “wypłaszczeniu”). Aby wartości wyjściowe z sieci mogły być interpretowane jako prawdopodobieństwa wystapienia ˛ konkretnych stanów, w ostatniej warstwie powiny być użyte sigmoidalne funkcje aktywujace. ˛ W warstwach pozostałych moga˛ być użyte inne funkcje, np. ReLU. 362 16 Podstawy numeryczne sztucznej inteligncji Rysunek 16.26: Prosta ilustracja potokowości obliczeń w sztucznych sieciach neuronowych. Rysunek 16.27 Przykład sieci neuronowej, składajacej ˛ si˛e z trzech warstw neuronów, majacej ˛ trzy wejścia (wcześniej obliczone cechy c1 , c2 , c3 ) oraz dwa wyjścia (decyzje d1 (zdrowy?), d2 (chory?)). Sieć neuronowa ma rozpoznawać wzorce. Dla sieci wieloklasowej bład ˛ rozpoznania pojedynczego wzorca definiujemy jako sum˛e kwadratów bł˛edów na wyjściu wszystkich neuronów ostaniej warstwy: J= 1 NP REF (P) 2 yk − yk , ∑ 2 k=1 (16.27) zaś bład ˛ całkowity jako sum˛e powyższych bł˛edów, uzyskanych dla wszystkich wzorców/przykładów. W sieci wieloklasowej (np. do rozpoznawania cyfr) wszystkie wartości yREF poza jedna˛ sa˛ równe 0. Niezerowa wartość jest równa 1 i jest ustawiona k na pozycji przykładu/wzorca, którym aktualnie uczymy sieć (np. 0010000000 dla cyfry 2). Sieć ma tak dobrać swoje wagi, aby zminimalizować bład ˛ (16.27), a potem sprawdzić która wartość yk ma wartość maksymalna˛ (zagadnienie softmax). Problem 16.15 (* Struktura sieci neuronowej a jej możliwości rozróżniania klasy danych wejściowych). Wejdź na stron˛e [11]. W górnym menu możesz obserwować wartość licznika pełnych cykli uczenia wszystkimi danymi treningowymi (Epochs) oraz wybrać (po kolei): 1. ▶ - uruchamianie, zatrzymywanie, krokowanie i zerowanie ANN; 2. Learning rate: wartość µ - stałej szybkości uczenia; 3. Activation: rodzaj funkcji aktywacji neuronu, np. ReLU, Tanh, Sigmoid, Linear; 16.5 Sztuczne sieci neuronowe - płytkie i głebokie 363 4. Regularization: rodzaj regularyzacji - brak (None), kwadrat wag (L2), wartość bezwzgl˛edna wag (L1); 5. Regularization rate: wartość λ , czyli stałej regularyzacji; 6. Problem type: rodzaj rozwiazywanego ˛ problemu - regresja liniowa (Regression) albo logistyczna (Classification). Po lewej stronie możesz wybrać: 1. DATA: jeden z czterech rodzajów rozkładu dwóch cech wejściowych (x1 , x2 ) w płaszczyźnie 2-D: niebieskie koło wewn˛etrz pomarańczowej “opony”, szachownica, dwa koła/obłoki, spirala; 2. Ratio: procent danych wykorzystanych do trenowania (uczenia), pozostałe do rozpoznania (testowania); 3. Noise: wartość szumu; 4. Batch size: liczba przykładów ze zbioru uczacego ˛ przetwarzanych równocześnie w jednym bloku (wartości pochodnych czastkowych ˛ funkcji kosztu wzgl˛edem wszystkich wag sieci sa˛ obliczenia dla każdego przykładu ze zbioru batch oddzielnie, a nast˛epnie sa˛ wyznaczane średnie wartości pochodnych i to one sa˛ stosowane do przestrojenia wag sieci - jakie post˛epowanie ma ograniczyć oscylacje w oszacowaniach pochodnych i przyspieszyć adaptacj˛e wag do wartości “optymalnych”). W centralnej i prawej cz˛eści ekranu wyst˛epuja˛ trzy kolumny: 1. FEATURES: wybieramy liczb˛e i rodzaj cech wejściowych (x1 w poziomie, x2 w pionie): x1 , x2 , x12 , x22 , x1 x2 , sin(x1 ), sin(x2 ); 2. HIDDEN LAYERS: nacisajac ˛ (+/-) wybieramy liczb˛e ukrytych warstw sieci oraz liczb˛e neuronów w każdej warstwie; 3. OUTPUT: jeden neuron wyjściowy, którego nie widzimy - obserwujemy tylko jego powi˛ekszone, kolorowe pole decyzyjne (aby przekonać si˛e o tym usuń wszystkie warstwy ukryte i uruchom sieć). Powyżej pola decyzyjnego neuronu wyjściowego widzimy krzywe bł˛edu Test loss (grubsza) oraz Training loss (cieńsza) w funkcji numeru epoki (powtórzenia operacji uczenia) - pokazuja˛ one jaki ułamek stanowia˛ bł˛edne rozpoznane przykłady dla zbioru testowego i uczacego. ˛ Obie krzywe powinny asymptotycznie da˛żyć do małej wartości. Jeśli dla po przekroczewniu pewnej liczby cykli uczenia krzywa Test loss zaczyna rosnać, ˛ znaczy to, że sieć została przeuczona, tzn. naucztyła si˛e przykładów ze zbioru uczacego ˛ “na pami˛eć”. Po wejściu na stron˛e nic nie zmieniaj tylko uruchom sieć (▶). Obserwuj licznik Epoch oraz OUTPUT sieci po prawej stronie (kolorowy rysunek z zaznaczonymi punktami cech z podkolorowanym tłem decyzyjnym: im bardziej niebiesko (bliżej 1) to TAK, im bardziej pomarańczowo (bliżej -1) to NIE. Powienieneś zobaczyć niebieski prawie-okrag ˛ z biała˛ obwódka˛ (o wartości 0), leżacy ˛ na pomarańczowej “łace”. ˛ Rzuć okiem na rysunek 16.29: to powinieneś mieś ustawione/widoczne na ekranie. Jeśli tak jest, to AI działa. Zatrzymaj sieć. Najedź myszka˛ na kwadratowy bloczek dowolnego neuronu (1 z 4) pierwszej warstwy ukrytej - po prawej stronie powinieneś zobaczyć zaproponowane przez niego, powi˛ekszone pole decyzyjne. Powinny to być 4 linie proste o różnym nachyleniu. W drugiej warstwie ukrytej dolny neuron “jest bardziej zdecydowany” ponieważ ma intensywniejszy kolor, wybiera/akceptuje 3 z tych linii decyzyjnych (widzimy 3 pogrubione, przerywane, pomarańczowe linie łaczace) ˛ i tworzy z nich swoje, wynikowe, quasi-owalne pole decyzyjne. Neuron wyjściowy (OUTPUT) produkuje liniowa˛ kombinacj˛e wyjść neuronów (i pól decyzyjnych) z ostatnie warstwy ukrytej, w wyniku czego otrzymujemy satysfakcjonujacy ˛ nas klasyfikator. 364 16 Podstawy numeryczne sztucznej inteligncji Teraz jako dane wejściowe wybierz “dwa koła/obłoki” (lewy dolny narożnik), pozostaw tylko jeden neuron w pierwszej warstwie ukrytej (klikasz 3 razy “minus” i usuwasz 3 z 4 neuronów) oraz uruchom sieć. Obserwuj wyjście sieci przez jakiś czas (patrz środkowy diagram na rysunku 16.29). Czy widzisz coraz wyraźniejsza˛ biała˛ lini˛e rozgraniczajac ˛ a˛ niebieskie i pomarańczowe pole. BRAWO! To właśnie ˛ miał wytłumaczyć rysunek 16.26. A teraz zmień Problem type (górne menu, skrajnie po prawej) z Classification na Regression i ponownie uruchom sieć. Dane wejściowe sa˛ teraz co prawda inne, ale powinieneś zobaczyć rysunek OUTPUT podobny do ostatniego, ale z płynnym przejściem od koloru ciemno pomarańczowego do ciemnoniebieskiego. I nic w tym niepokojacego. ˛ Teraz sieć nie klasyfikuje (regresja logistyczna i funkcja aktywacji 0/1), tylko prognozuje (regresja liniowa). Czyli “zatrybiło!”. Na koniec: EUREKA! Obserwujac ˛ środkowy diagram na rysunku 16.29 wyciagamy ˛ wniosek, że w przypadku rozróżniania dwóch “kółek” to wystarczyłby nam tylko jeden, wyjściowy neuron. Sprawdzamy to. Wynik jest przedstawiony na dolnym diagramie rysunku 16.29. Mieliśmy racj˛e! Teraz już powinniśmy nabrać pewności, że rozumiemy (+/-) jak ANN działa. A teraz sam pobaw si˛e sam dalej i w zależności od tego, co pokażesz podczas laboratorium prowadzacemu, ˛ otrzymasz dodatkowe (*) albo (**) punkty. Na przykład, wybierz dane wejściowe typu “dwie spirale” oraz cechy wejściowe x1 , x2 , x12 , x22 , a nast˛epnie powtarzaj uczenie sieci systematycznie zwi˛ekszajac ˛ liczb˛e jej warstw ukrytych oraz liczb˛e neuronów w tych warstwach. Czy jesteś w stanie “zjechać” z krzywa˛ Test loss poniżej wartości 0.01? Obserwuj jak zmieniaja˛ si˛e wartości krzywych Test loss oraz Training loss w kolejnych epokach, tzn. po kolejnych cyklach uczenia. Przykładowe sa˛ pokazane na rysunku 16.30. Jak widać sieć lepiej rozpoznaje przykłady, które były użyte do jej uczenia (Training loss - ucz˛e i rozpoznaj˛e te same przykłady) niż nieznane (Test loss - rozpoznaj˛e inne przykłady niż wykorzystane do uczenia). Widać także, że w wyniku procesu uczenia dla pewnych iteracji otrzymujemy “rozregulowany” system z dużymi bł˛edami, dlatego wskazane jest, aby obserwować ww. krzywe i wiedzieć w którym punkcie procesu uczenia aktualnie si˛e znajdujemy. Rzuć teraz jeszcze raz okiem na rysunek 16.5. Rysunek 16.28: Ekran główny aplikacji Playgrond ze strony Tensorflow - opis w tekście. 16.5 Sztuczne sieci neuronowe - płytkie i głebokie 365 Rysunek 16.29: Wyniki klasyfikacji dwóch różnych zestawów danych i użyciem trzech różnych konfiguracji sieci ANN w aplikacji Playground. Zwróć uwag˛e na kolorowe rysunki po prawej stronie, pokazujace ˛ końcowy wynik klasyfikacji: niebieskie kółka powinny leżeć na niebieskim tle, a pomaranczowe - na pomarańczowym. Rozpoznawane dane/cechy sa˛ pokazane w małym czarnym kwadracie, umieszczonym po lewej stronie od wyniku. Rysunek 16.30 Dwa przykłady krzywych Test loss i Training loss (ułamek poprawnie rozpoznanych przykładów testowych i ucza˛ cych), otrzymanych w aplikacji Playgoround dla (logiczny AND): 1) danych wejściowych typu “dwie spirale”, 2) cech x1 , x2 , x12 , x22 , 3) dla dwóch warstw ukrytych z duża,˛ ale różna˛ liczba˛ neuronów (w drugim przypadku 7 neuronów w ukrytej warstwie pierwszej i 5 w ukrytej drugiej). 366 16 Podstawy numeryczne sztucznej inteligncji 16.5.2 Uczenie sieci ANN algorytmem back-propagation Informacje wst˛epne - definicje zmiennych i organizacja obliczeń. Załóżmy, że mamy złożona˛ sieć, składajac ˛ a˛ si˛e z neuronów przedstawionych na rysunku 16.7 i opisanych równaniem (16.1): (p) zk = M (p) (p) ∑ wk,m xm (p) + wk,0 , (16.28) m=1 (p) (p) yk = f zk , (16.29) w którym zastosowano nast˛epujace ˛ oznaczenia: • p, P - numer warstwy i liczba wszystkich warstw: p = 1, 2, ..., P; • k - numer neuronu, numer sygnału wyjściowego z konkretnej p-tej warstwy: k = 1, 2, ..., N p , • m - numer sygnału wejściowego neuronu, numer odpowiedniej wagi neuronu w p-tej warstwie: m = 1, 2, ..., N p−1 ; (p) • xm - m-ty sygnał wejściowy p - tej warstwy: m = 1, 2, ..., N p−1 ; (p) • yk - k-ty sygnał wyjściowy (k-tego neuronu) p-tej warstwy: p = 1...P, k = 1...N p ; (p) • wk,m - m-ta waga w k-tym neuronie p-tej warstwy. Sieć składa si˛e z warstw (neuronów), które sa˛ połaczone ˛ ze soba˛ kaskadowo, (p−1) (p) tzn. wyjście warstwy poprzedniej jest wejściem warstwy nast˛epnej (xm = ym ). Załóżmy, że sieć jako całość ma Nwe wejść, Nwy wyjść oraz łacznie P warstw: jedna˛ (1) warstw˛e dostarczajac ˛ a˛ dane wejściowe, (P − 2) warstwy ukryte z neuronami oraz jedna˛ (1) warstw˛e wyjściowa˛ z neuronami. Każda warstwa ma N p wyjść (p = 1, 2, .., P). Zauważmy, że N1 = Nwe i NP = Nwy . Na rysunkach 16.31 i 16.31 wytłumaczono macierzowy sposób organizacji obliczeń, przeprowadzanych w sieci neuronowej: jak widać sa˛ one bardzo proste i łatwe do zaimplementowania w j˛ezyku Matlab. Problemem jest jedynie znalezienie odpowiednich wartości wag neuronów, "zapalajacych ˛ czerwone światełko"na odpowiednim wyjściu. Uwaga: na rysunku 16.31 przesuni˛ecia b neuronów oznaczono jako wagi w0 . Rysunek 16.31 Schemat blokowy przykładowej, wielowarstwowej sieci neuronowej, dla której na rysunku 16.32 przedstawiono macierzowy sposób wykonywania obliczeń (na wejściu sa˛ cechy ci , a na wyjściu sa˛ decyzje d j ). 16.5 Sztuczne sieci neuronowe - płytkie i głebokie 367 Rysunek 16.32: Zapis macierzowy równań dla sieci z rysunku 16.31, zastosowany w funkcji ann_propagacja_wprzod, z opisem oznaczeń użytych w programie ann_propagacja_wstecz. “(A)” oznacza wyjście z funkcji aktywacji, działaja˛ cej na wyniku iloczynu skalarnego dwóch wektorów. Wyjście z poprzedniej warstwy (p) jest wejściem do nast˛epnej warstwy. Uwaga: przesuni˛ecie bk,0 k-tego neuronu w p-tej (p) warstwie oznaczono jako wk,0 , czyli wag˛e składowej stałej równej 1 - w wyniku tego ukryto offsety b wszystkich neuronów w macierzach wag W{.}. Ogólna reguła adaptacji wag sieci neuronowej. Kiedy wyst˛epuje bład ˛ rozpoznawania (16.27), to znaczy że wartości wag jej neuronów nie sa˛ dobrze dobrane i powinny zostać poprawione. Jeśli skorzystamy z algorytmu optymalizacji metoda˛ najwi˛ekszego spadku, to modyfikujemy wartości wag w kierunku przeciwnym do przyrostu funkcji kosztu J: (p) (p) wk,m (n + 1) = wk,m (n) − µ ∂J (p) ∂ wk,m (p) (p) = wk,m (n) − µ∇k,m . (16.30) gdzie n oznacza licznik kolejnych modyfikacji wartości wszystkich wag sieci podczas jej uczenia, przykład za przykładem. Przeprowadzana jest równoczesna optymalizacja wartości wielu argumentów funkcji kosztu, czyli wag sieci. Adaptacja wag w ostatniej, P-ej warstwie sieci. Zajmijmy si˛e teraz tylko ostatnia˛ warstwa˛ sieci. W celu uproszczenia zapisu zaniedbamy oznaczenie warstwy “(P) ”. Zastosujemy równania (16.28)(16.29) do opisu pojedynczego neuronu, w którym xm (P−1) oznacza m-te wejście każdego neuronu warstwy (w rzeczywistości sa˛ to wyjścia ym neuronów warstwy przedostatniej). W takim przypadku: ∂J ∂ J ∂ zk = , ∂ wk,m ∂ zk ∂ wk,m ∇k,m = (16.31) oraz ∂J = ∂ zk ∂J ∂ yk ∂ zk ∂ = ∂ wk,m ∂ wk,m ∂ yk − yk f ′ (zk ) = −δk , = yREF k ∂ zk ! (16.32) M ∑ wk,m xm + wk,0 = xm . (16.33) m=1 (P) Wprowadzajac ˛ oznaczenie numeru warstwy P oraz uwzgl˛edniajac ˛ zależność xm = (P−1) ym , możemy równanie (16.31) zapisać w nast˛epujacej ˛ postaci: (P) (P) (P−1) ∇k,m = δk ym , (P) δk h i (P) (P) = − yREF − yk f ′ (zk ) . k (16.34) 368 16 Podstawy numeryczne sztucznej inteligncji oraz zastosować je w równaniu (16.30) do adaptacji wag meuronów ostatniej warstwy sieci. Adaptacja wag w przedostatniej, (P − 1)-szej warstwie sieci. Dla warstw ukrytych sytuacja jest o wiele trudniejsza. Załóżmy, że interesuje nas teraz przedostatnia warstwa, czyli ostatnia ukryta, majaca ˛ NP−1 neuronów. Bład ˛ na wyjściu k-tego neuronu tej warstwy (k = 1, 2, ..., NP−1 ) wpływa na bł˛edy wszystkich neuronów warstwy nast˛epnej, czyli ostatniej (P-tej), z racji budowy sieci według zasady “każdy-z-każdym”. I odwrotnie: wszystkie obserwowane bł˛edy NP neuronów warstwy ostatniej (P-tej) sumuja˛ si˛e z pewnymi wagami w każdym neuronie warstwy poprzedniej ((P − 1)-tej) (rzutowanie wsteczne). Napiszmy równanie (16.31) dla (P − 1)-szej warstwy: (P−1) ∇k,m = ( ∂J (P−1) ∂ wk,m = (P−1) ) ∂J ( ∂ zk (P−1) ∂ zk = (P−1) ∂ wk,m ) ∂J (P−2) ym (P−1) ∂ zk , (16.35) Ponieważ: ( ∂J ) = (P−1) !" ∂J (P−1) ∂ zk (P−1) ∂ yk # (P−1) (P−1) ∂ yk ∂ zk = −δk (16.36) oraz ! ∂J (P−1) ∂ yk NP =∑ i=1 (P) ∂ zi ∂J (P) ∂ zi (P−1) ∂ yk NP =∑ i=1 ∂J (P) (P−1) ∂ zi ∂ yk NP =∑ i=1 " (P−1) ∂ yk NP ∂ ∂J ∑ ! (P) (P−1) (P) wi, j y j + wi,0 = j=1 NP (P) (P) (P) w = − ∑ δi wi,k (P) i,k ∂ zi (16.37) i=1 # = f ′ zP−1 k (P−1) ∂ zk (16.38) dlatego możemy zapisać równanie (16.36) w nast˛epujacy ˛ sposób: ! NP ∂J (P−1) (P) (P) ′ P−1 = − δ wi,k f zk = −δk . ∑ i (P−1) ∂ zk i=1 (16.39) Po uwzgl˛ednieniu zależności (16.39) w równaniu (16.35) otrzymujemy: (P−1) ∇k,m (P−1) (P−2) = δk ym , (P−1) δk NP = −∑ ! (P) (P) δi wi,k f ′ zP−1 . (16.40) k i=1 Wynik (16.40) możemy użyć w równaniu (16.30) do adaptacji wag przedostatniej sieci o numerze P − 1. Adaptacja wag w dowolnej warstwie sieci ANN. Powyżej opisaliśmy operacj˛e wstecznego rzutowania bł˛edu z warstwy ostatniej (P) do przedostatniej (P − 1). Ale możemy takie post˛epowanie kontynuować dalej, tzn. z warstwy (P − 1) do (P − 2), a potem do (P − 3), itd. Dlatego jeśli w równaniu (16.40) zastapimy ˛ duże P przez 16.5 Sztuczne sieci neuronowe - płytkie i głebokie 369 (p−1) małe p, to wzór ten b˛edzie umożliwiał obliczenie ∇k,m warstwy ukrytej. dla dowolnej, “poprzedniej” Funkcja decyzyjna. W przypadku funkcji aktywacji/decyzyjnej o kształcie sigmo(p) (p) idy mamy: f ′ (zk ) = f (zk )(1 − f (zk )). Uwaga implementacyjna. Używajac ˛ wybranej, bibliotecznej funkcji/metody optymalizacyjnej (np. fmincg() w j˛ezyku Matlab) do doboru wartości wag wszystkich neuronów wszystkich warstw sieci, powinniśmy dostarczyć tej funkcji nie tylko wartość funkcji kosztu J dla aktualnych wartości nastaw wszystkich wag, ale także wartości wszystkich jej gradientów wzgl˛edem wszystkich argumentów, czyli wag wszyst(p) kich neuronów. Ww. gradienty ∇k,m , p = 2, 3, ..., P (w warstwie p = 1 nie ma neuronów), sa˛ oznaczone w naszych programach, dotyczacym ˛ ANN, jako Delta. Nato(p) miast δk , używane w powyższych równaniach, jako delta. Wartości gradientów przekazujemy do funkcji bibliotecznej w postaci jednego, długiego wektora liczb, a nie w formie struktury, składajacej ˛ si˛e z wielu macierzy, w których zapisane sa˛ gra(p) dienty zwiazane ˛ ze współczynnikami wagowymi wk,m poszczególnych warstw neuronów. W tym miejscu, dotyczacym ˛ aspektów implementacyjnych ANN, należy jeszcze raz zwrócić uwag˛e na zalety użycia funkcji ReLU, zamiast sigmoidy, jako funkcji aktywacji - patrz zielona vs. czerwona linia na rys. 16.7. Ponieważ dla argumentu x > 0 funkcja ReLU ma kształt lini prostej i nie nasyca si˛e wraz ze wzrostem wartości x, dlatego jej gradient ma stała˛ wartość i nie zanika dla dużych wartości x, tak jak dla sigmoidy. Dlatego wzgl˛edny bład ˛ obliczania gradientu jest dla ReLU mniejszy i z tego powodu generujacy ˛ mniej problemów w algorytmie backpropagation podczas operacji wielokrotnego rzutowania końcowego bł˛edu rozpoznawania do poprzednich warstw. 16.5.3 Przykład A teraz b˛edzie to, co studenci/programiści lubia˛ najbardziej: konkretny, kompletny PRZYKŁAD! W naszym przypadku b˛edzie to przykład użycia ANN do rozpoznawania cyfr napisanych r˛ecznie. Ponieważ kod programu jest bogato skomentowany, poniżej zwrócimy uwag˛e tylko na rzeczy najważniejsze. Jeszcze raz przypomnijmy, że jest to spolszczona wersja oprogramowania pobranego z [12]. 16.5.3.1 Dane wejściowe Obecnie zbiorem wejściowym jest 5000 obrazków o wymiarach 20×20 = 400 pikseli, po 500 dla każdej cyfry: 0,1,2,...,9, umieszczonych w macierzy o wymiarach 5000 × 400. W programie cyfra 0 b˛edzie oznaczana jako stan/symbol 10. Ale oczywiście jest możliwe wczytanie innych danych i rozwiazanie ˛ innego problemu niż rozpoznawanie cyfr. Pierwszym udost˛epnionym przykładem jest program ai_7_ann_astma.m, w którym wczytuje si˛e macierz zawierajac ˛ a: ˛ 1) 130 sygnałów oddechu normalnego i 130 sygnałów oddechu astmatycznego, 2) zwiazane ˛ z nimi macierze 25×25 widm czasowo-cz˛estotliwościowych (zmiany zawarości cz˛estotliwościowej w czasie), 3) 36-elementowe wektory ich uśrednionych widm cz˛estotliwościowych (patrz rysunek 16.15). Drugim przykładem jest program ai_7_ann_ekg.m, używajacy ˛ macierzy o wymiarach 162 × 65536, zawierajacej ˛ 162 sygnały o długości 65536 próbek różnych stanów pracy serca: arytmii (96), zastoinowej wiewydolności 370 16 Podstawy numeryczne sztucznej inteligncji (30) oraz normy (36) (patrz rysunek 16.16). Możesz wykorzystać te dane podczas laboratorium lub w cz˛eści projektowej naszego kursu. 16.5.3.2 Program główny Analizowany przez nas program o nazwie ai_6_ann_cyfry.m jest przedstawiony na listingu 16.12. Składa si˛e on z nast˛epujacych ˛ cz˛eści. 1. Parametry. Na poczatku ˛ programu sa˛ inicjalizowane wartości parametrów programu. Może wydawać si˛e, że nie ma to wi˛ekszego sensu, ponieważ wykorzystywany zbiór danych wejściowych, czyli obrazków cyfr, “jest jaki jest” i już si˛e nie zmieni. Ale w przypadku wczytania innych danych, taka postać programu umożliwia jego prosta˛ modyfikacj˛e i rozwiazywanie ˛ innego zadania AI. 2. Trenowanie. W tej cz˛eści programu na poczatku ˛ ustawiamy wartości parametrów, zwiazanych ˛ z uczeniem sieci: • max_iter - liczba powtórzeń (epoch) pełnych cykli uczenia; • wsp_regul - wartość współczynnika λ regularyzacji funkcji kosztu; • wagi_zakres - zakres zmienności wag sieci podczas ich losowej inicjalizacji; • param_warstw - wektor nastaw sieci: liczba wejść (L_cech), liczby neuronów w kolejnych warstwach ukrytych (jedna lub kilka liczb oddzielonych przecinkiem), liczba neuronów wyjściowych (L_klas). Nast˛epnie: • wagi wszystki warstw sa˛ inicjalizowane (struktura, składajaca ˛ si˛e z macierzy o różnych wymiarach, zależnych od architektury sieci; każda warstwa ma inna˛ macierz o wymiarach: Liczba_neuronow × Liczba_wejsc_do_neuronu; • wagi z macierzy wszystkich warstw sa˛ zapisywane, kolejno, do jednego długiego wektora liczb; • nast˛epnie ustawiane jest to, czego wymaga używana procedura optymalizacyjna: u nas liczba iteracji oraz uchwyt do funkcji, obliczajacej ˛ wartość funkcji kosztu oraz jej gradienty wzgl˛edem wszystkich współczyników wagowych sieci dla aktualnych wartości tych wag (wraz z wszystkimi potrzebnymi parametrami); • teraz jest uruchamiana adaptacyjna optymalizacja wag sieci z użyciem danych treningowych, majaca ˛ na celu dostrojenie wag do takich wartości, dla których funkcja kosztu osiaga ˛ minimum (najlepiej globalne a nie lokalne!); 5 • na koniec wektor wyznaczonych optymalnych wartości wag sieci jest ponownie konwertowany do zbioru/struktury macierzy wag dla kolejnych warstw sieci. 3. Rozpoznawanie. W tym przypadku mamy już zdecydowanie mniej do zrobienia: podajemy dane testowe na wejście sieci ze współczynnikami optymalnymi, porównujemy odpowiedź sieci z tym co powinniśmy otrzymać, obliczamy bład ˛ i sporzadzamy ˛ rysunek. 4. Dokładniejsza analiza wyników. Na koniec obliczamy wartości elementów macierzy pomyłek (confusion matrix), które wizualizujemy w postaci graficznej i wypisujemy liczbowo. 5. Wpadamy w stan euforii. “ANN sa˛ turbo-mega-super! Teraz chc˛e polecieć na Marsa!” 5 Dygresja: takie jest zawsze zadanie funkcji opymalizacyjnej - kr˛eć parametrami, obserwu skutek, idź w stron˛e minimum! Jeśli możesz, skorzystaj ze znanej postaci funkcji gradientu. 16.5 Sztuczne sieci neuronowe - płytkie i głebokie 371 Listing 16.10: Program do rozpoznawania r˛ecznie pisanych cyfr metoda˛ sztucznych sieci neuronowych % ai_6_ann_cyfry.m % Rozpoznawanie cyfr z uzyciem sztucznej sieci neuronowej clear all; close all; % Wczytanie danych (obrazow) load cyfry.mat % 10 razy po 500 obrazkow 20x20 pikseli na jedna cyfre % macierz X: 5000 wierszy po 400 liczb w wierszu L_klas = 10; % liczba testowanych klas/cyfr 0,1,2,...,9 (0 = klasa10) L_wzorcow = 500; % liczba wzorcow dla kazdej klasy/cyfry L_x = 20; % liczba pikseli kazdego obrazu-wzorca w poziomie L_y = 20; % liczba pikseli kazdego obrazu-wzorca w pionie L_przykladow = L_klas *L_wzorcow; % liczba wszystkich wzorcow/obrazow L_cech = L_x * L_y; % liczba wszystkich cech/pikseli pojedynczego wzorca % Trenowanie sztucznej sieci neuronowej max_iter = 40; % liczba iteracji procedury optymalizacyjnej/minimalizacyjnej wsp_regul = 0.01; % wspolczynnk regularyzacji uzyty podczas minimalizacji wagi_zakres = 0.12; % zakres zmiennosci podczas inicjalizacji wsp. wagowych param_warstw = [ % wartosci parametrow sieci L_cech, % liczba wejsc (liczba cech/pikseli, u nas 400) 25, % liczba neuronow w pierwszej warstwie ukrytej % 15, % liczba neuronow w drugiej warstwie ukrytej L_klas % liczba neuronow w warstwie wyjsciowej (liczba klas, 10 cyfr) ]; Wagi_macierze = ann_wagi_init( param_warstw, wagi_zakres ); % inicjalizacja wag Wagi_wektor = ann_wagi_macierze2wektor( Wagi_macierze ); % macierze --> wektor optim_opcje = optimset(’MaxIter’, max_iter ); % parametry optymalizacji uchwyt_funkcji = @(p) ann_koszt_gradient(p, param_warstw, X, y, wsp_regul); % uchwyt [ Wagi_wektor, koszt ] = fmincg( uchwyt_funkcji, Wagi_wektor, optim_opcje ); % optymal. Wagi_macierze = ann_wagi_wektor2macierze( Wagi_wektor, param_warstw ); % wynik % Rozpoznawanie z uzyciem nauczonej sieci. y_all = ann_propagacja_wprzod( X, Wagi_macierze, param_warstw ); % wyjscia z neuronow [dummy, y_pred] = max( y_all, [], 2), % znalezienie max fprintf(’Dokladnosc: %f\n’, mean(double(y_pred == y ))*100); % dokladnosc w [%] figure; k = 1 : L_przykladow; plot( k, y,’r-’, k, y_pred,’bx’); grid; title(’Wyniki rozpoznawania’); xlabel(’Nr testu’); ylabel(’Rozpoznana wartosc’); legend(’zadane’,’rozpoznane’,’Location’,’southeast’); % Analiza wynikow C = hist( reshape(y_pred, L_wzorcow, L_klas), 1 : L_klas ); C = [ C(:, 2:end) C(:,1) ]; figure; imagesc(log10(C+1)’); title(’Macierz pomylek - co jest podobne do czego?’); xlabel(’Rozpoznana cyfra’); ylabel(’Testowana cyfra’); axis square; C = [ [1:9, 0]; C’ ], confusion_matrix = [ [-1, 1:9, 0]’ C ], pause 16.5.3.3 Funkcje pomocnicze do zmiany zapisu danych Listing 16.11 zawiera napisane przez nas trzy funkcje, używane do inicjalizacji i zmiany sposobu zapisu wartości współczynników wagowych wszystkich neuronów wszystkich warstw sieci ANN. Funkcje te wykonuja˛ nast˛epujace ˛ operacje. 1. Funkcja ann_wagi_init(). Funkcja, która inicjalizuje macierze wag wszystkich warstw liczbami losowymi o rozkładzie równomiernym w przedziale: 372 16 Podstawy numeryczne sztucznej inteligncji [−wzakres , +wzakres ]. Każda macierz ma tyle wierszy ile ma wyjść/neuronów (L_out) oraz tyle kolumn ile ma wag plus 1 (L_in+1, +1 z powodu wagi w0 , przesuni˛ecia). Struktur˛e powołuje si˛e do życia komenda: ˛ Wagi={}. Macierze zapisuje si˛e do niej instrukcja: ˛ Wagi{nr }=macierz; gdzie nr oznacza numer warstwy. 2. Funkcja ann_wagi_macierze2wektor(). Kopiuje kolumnami elementy z macierzy wag kolejnych warstw sieci (Wagi_macierze(nr)) do jednego, długiego wektora (Wagi_wektor), zawierajacego ˛ wszystkie wagi sieci. 3. Funkcja ann_wagi_wektor2macierze(). Kopiuje wartości z jednego, długiego wektora wag (Wagi_wektor) do kolumn macierzy, zwiazanych ˛ z kolejnymi warstwami sieci (Wagi_macierze(nr)). Listing 16.11: Funkcje pomocnicze do inicjalizacji i zmiany reprezentacji/zapisu wag wielu warstw sztucznej sieci neuronowej % ####################################################################################### function Wagi = ann_wagi_init( warstwy, w_zakres ) % Losowa inicjalizacja wag dla calej sieci neuronowej. % Kazda warstwa ma swoja macierz "Wagi" o wymiarach: % liczba wierszy = liczba wyjsc, liczba kolumn = liczba wejsc + 1 (dla w0 - offset/bias) % Dla 400,25,10: Wagi = 1x2 cell array {25x401 double} {10x26 double} % Dla 400,25,15,10: Wagi = 1x3 cell array {25x401 double} {15x26 double} {10x16 double} L_param = length( warstwy ); % liczba parametrow: Lwe, L1, L2, ..., Lwy % L_we = L_cech, L_wy = L_klas Wagi = {}; % struktura z macierzami wag wszystkich warstw for nr = 1 : (L_param-1) % numer warstwy - bez warstwy wyjsciowej L_in = warstwy( nr ); % liczba wejsc L_out = warstwy( nr + 1); % liczba wyjsc (liczba neuronow w kolejnej warstwie) Wagi{ nr } = w_zakres * (2*rand(L_out, L_in+1 ) - 1); % losowo (+/-)*zakres end end % funkcji % ####################################################################################### function Wagi_wektor = ann_wagi_macierze2wektor( Wagi_macierze ) % Ulozenie elementow macierzy wag kolejnych warstw w jeden dlugi wektor liczb L_macierzy = length( Wagi_macierze ); % liczba komorek (cells) z macierzami Wagi_wektor = []; % wektor wyjsciowy z elementami wszyskich macierzy for nr_macierzy = 1 : L_macierzy % dla kazdej komorki (macierzy) Wagi_wektor = [ Wagi_wektor; Wagi_macierze{ nr_macierzy }(:) ]; % rozpakowanie end % end % funkcji % ####################################################################################### function Wagi_macierze = ann_wagi_wektor2macierze( Wagi_wektor, param_warstw ) % Rozpakowanie elementow wektora z wszystkimi wagami (jedna za druga) % do struktury "cell" z kilkoma macierzami (kazda z wagami dla innej warstwy) L_warstw = length( param_warstw ); % liczba warstw sieci = macierzy wag Wagi_macierze = {}; % wagi jako macierze dla kolejnych warstw przesuniecie = 0; % offset w wynikowym wektorze wag for nr_warstwy = 1 : (L_warstw-1) % wszystkie warstwy bez wejsciowej (bez wag) L_in = param_warstw( nr_warstwy ); % liczba wejsc do warstwy neuronow L_out = param_warstw( nr_warstwy + 1); % liczby wyjsc, czyli liczba neuronow L_cech = L_in + 1; % +1 gdyz pamieamy o w0 (bias) L_neuronow = L_out; % L_elementow = L_neuronow*L_cech; % liczba wszystkich elementow macierzy Wagi_warstwa = Wagi_wektor((przesuniecie + 1) : (przesuniecie + L_elementow), 1); Wagi_macierze{ nr_warstwy } = reshape( Wagi_warstwa, L_neuronow, L_cech ); przesuniecie = przesuniecie + L_elementow; 16.5 Sztuczne sieci neuronowe - płytkie i głebokie 373 end end % funkcji 16.5.3.4 Funkcje główne implementujace ˛ sieć ANN A teraz “wszystkie r˛ece na pokład”, gdyż w tym podrozdziale zostana˛ opisane najważniejsze funkcje, zwiazane ˛ z implementacja˛ sieci ANN. 1. Funkcja ann_koszt_gradient. Jest to główna funkcja pomocnicza, napisana przez nas, wywoływana w procesie optymalizacji przez funkcj˛e Matlaba fminunc(), wielokrotnie obliczajaca ˛ warość minimalizowanej funkcji kosztu oraz jej pochodnych czastkowych ˛ wzgl˛edem wag sieci w trakcie iteracyjnego poszukiwania minimum. Biblioteczna funkcja Matlaba fminunc(), wywoływana w programie głównym, zmienia w taki sposób wartości wektora parametrów funkcji kosztu, który na poczatku ˛ otrzymuje, u nas Wagi_wektor, aby sprowadzić funkcj˛e kosztu do wartości minimalnej. W programie głównym uchwyt do minimalizowanej funkcji jest zdefiniowany jako uchwyt_funkcji, zaś skojarzona z nim funkcja jako ann_koszt_gradient(). O tej funkcji właśnie mówimy. Funkcja ta na poczatku ˛ zmienia zapis wszystkich wag sieci z postaci jednego długiego wektora na struktur˛e z macierzami wag poszczególnych warstw. A nast˛epnie nie tylko oblicza wartość kosztu/bł˛edu, wyst˛epuja˛ cego na wyjściu sieci przy aktualnych nastawach, ciale ˛ zmienianych (wywołanie funkcji ann_funkcja_kosztu()), ale także zwraca wartości gradientów funkcji kosztu wzgl˛edem każdej wagi każdego neurona sieci (wywołanie funkcji ann_propagacja_wtecz()). 2. Funkcja ann_funkcja_kosztu(). Zadaniem funkcji jest obliczenie, na etapie trennowania sieci, kosztu/bł˛edu pomi˛edzy aktualnym wyjściem z sieci neuronowej a poprawnym wyjściem. Na poczatku ˛ funkcja ustawia wartości swoich parametrów wewn˛etrznych. Nast˛epnie wywołuje funkcj˛e ann_propagacja_wprzod(), która zwraca wyjścia z sieci przy aktualnych wartościach wejść i wag wszystkich neuronów. Potem funkcja tworzy pomocnicza˛ macierz y_matrix z samymi zerami, która ma tyle wierszy ile przykładów oraz jedna˛ wartość równa˛ 1, ustawiona˛ w każdym wierszu w kolumnie o numerze równym numerowi klasy danych, reprezentowanej przez dany przykład. W dalszej lolejności funkcja oblicza wartość współczynnika regularyzacji, podnoszac ˛ do kwadratu wagi wszystkich neuronów sieci (oprócz w0 !) i je sumujac. ˛ Na końcu jest obliczana funkcja kosztu z użyciem wzoru (16.25). 3. Funkcja ann_propagacja_wprzod(). Po ustawieniu wartości swoich wewn˛etrznych parametrów, funkcja oblicza wartości wyjściowe z sieci dla zadanych wartości wejściowych oraz aktualnych wartości wag wszystkich neuronów: robione to jest w p˛etli w sposób potokowy od warstwy do warstwy. Na rysunku 16.32 zilustrowano graficznie wykonywane obliczenia. Czerwonym kolorem podano na nim oznaczenia zastosowane w programie (W{nr} to macierz wag o numerze nr. 4. Funkcja ann_propagacja_wstecz(). Jest to funkcja najtrudniejsza implementacyjnie, która ma za zadanie obliczyć pochodna˛ (gradient) funkcji kosztu wzgl˛edem każdego współczynnika wagowego każdego neuronu sieci. Zastosowane sa˛ w niej oznaczenia wytłumaczone na rysunku 16.32. Na poczatku ˛ funkcja inicjalizuje swoje parametry wewn˛etrzne. Najważniejsza jest struktura Delta{.} z macierzami, w których b˛eda˛ przechowywane obliczane pochodne czastkowe ˛ funkcji kosztu wzgl˛edem wszystkich wag wszystkich neuronów konkretnej warstwy (oznaczone jako W{nr} na rys. 16.32 i majace ˛ wymiary L_wy × L_we+1). Potem nast˛epuje p˛etla, w której każdy zbiór danych/cech trenin- 374 16 Podstawy numeryczne sztucznej inteligncji gowych jest przetwarzany osobno. Wykonywane sa˛ w niej nast˛epujace ˛ operacje (patrz rys. 16.32): a. dane wejściowe wchodza˛ na wejście pierwszej warstwy (podstawienie c=[1;X(i,:)’] i zapami˛etanie C{1}=c; b. w p˛etli sa˛ przeprowadzane macierzowe obliczenia c (wejście) → z (wyjście) dla wszystkich neuronów kolejnych wartstw); otrzymane wyniki sa˛ zapami˛etywane: Z{nr_warstwy+1}=z; C{nr_warstwy+1}=c; c. nast˛epnie jest obliczana wartość bł˛edu rozpoznawania, uzyskana dla warstwy ostatniej (delta{L_warstw}=y_wyjscie-y_wzorzec), a potem w p˛etli wartości bł˛edów dla warstw wcześniejszych, metoda˛ wielokrotnego “rzutowania” wstecz (backpropagation) bł˛edu warstwy późniejszej do wcześniejszej - patrz równanie 16.35; d. na końcu akumuluje si˛e bł˛edy/różnice delta (od warstwy do warstwy) i oblicza gradienty Delta - patrz równanie 16.36; 5. teraz oblicza si˛e wartości składników regularyzacyjnych osobno dla każdej warstwy; 6. nast˛epnie wyznacza si˛e wartości gradientów Delta z uwzgl˛ednieniem regularyzacji; 7. na końcu zmienia si˛e postać wyniku ze struktury kilku macierzy na jeden długi wektor. Listing 16.12: Główne funkcje implementujace ˛ sztuczna˛ sieć neuronowa˛ w środowisku Matlab w zadaniu rozpoznawania obrazów r˛ecznie pisanych cyfr % ####################################################################################### function [koszt, gradienty] = ann_koszt_gradient(Wagi_wektor, param_warstw, X, y, wsp_reg ) Wagi_macierze = ann_wagi_wektor2macierze( Wagi_wektor, param_warstw ); koszt = ann_funkcja_kosztu( Wagi_macierze, param_warstw, X, y, wsp_reg ); gradienty = ann_propagacja_wstecz( Wagi_macierze, param_warstw, X, y, wsp_reg ); end % funkcji % ####################################################################################### function J = ann_funkcja_kosztu( Wagi_macierz, parametry_warstw, X, y, wsp_regularyzacji) % Obliczanie funkcji "kosztu" sieci neuronowej L_warstw = length( parametry_warstw ); % liczba warstw L_przykladow = size(X, 1); % ile przykladow L_klas = parametry_warstw( end ); % ile klas % Obliczenia "w przod" (feedforward) wejscie --> wyjscie dla sieci neuronowej y_pred = ann_propagacja_wprzod( X, Wagi_macierz, parametry_warstw ); % Ustawienie macierzy y_matrix wskazujacej przez "1" na poprawne wyjscie z sieci % y jest wektorem o wymiarach L_przykladow x 1 (tylko numer klasy dla danego przykladu ) % W macierzy y_matrix ustawiamy 1 na pozycji numeru klasy % Np. dla klasy 5 mamy [0 0 0 0 1 0 0 0 0 0] y_matrix = zeros( L_przykladow, L_klas ); for i = 1 : L_przykladow y_matrix( i, y(i) ) = 1; % dla i-tego przykladu "1" na pozycji y(i) end % Obliczenie wartosci skladnika regularyzacji - nie uwzgledniamy w0 zw. z bias/offset Wagi_warsty_sum = 0; for nr_warstwy = 1 : (L_warstw-1) Wagi_warstwy = Wagi_macierz{ nr_warstwy }; Wagi_warsty_sum = Wagi_warsty_sum + sum( sum( Wagi_warstwy(:, 2:end) .^ 2 ) ); end regul = (wsp_regularyzacji / (2 * L_przykladow)) * Wagi_warsty_sum; 16.5 Sztuczne sieci neuronowe - płytkie i głebokie 375 % Obliczenie funkcji kosztu z regularyzacja J = (-1/L_przykladow) * sum(sum((y_matrix.*log(y_pred) + ... (1-y_matrix).*log(1-y_pred)))) + regul; end % funkcji % ####################################################################################### function wyjscia = ann_propagacja_wprzod( X, Wagi_macierze, param_warstw ) % Propagacja informacji "w przod" w sieci neuronowej: wejscie --> wyjscie L_warstw = length( param_warstw ); % liczba warstw sieci L_przykladow = size(X, 1); % liczba wszystkich przykladow x = [ ones(L_przykladow, 1), X]; % dla warstwy pierwszej ukrytej for nr_warstwy = 1 : (L_warstw-1) % po kolei wszystkie warstwy Wagi_1macierz = Wagi_macierze{ nr_warstwy }; % macierz danej warstwy z = x * Wagi_1macierz’; % we --> wy w danej warstwie y = sigmoid(z); % funkcja decyzyjna/aktywacji neuronu y = [ ones(L_przykladow, 1), y ]; % dodaj w0 (bias) x = y; % wyjscie poprzedniej warstwy jest wejsciem nastepnej warstwy end wyjscia = x(:, 2:end); % warstwa wyjsciowa nie ma w0 (bias) end % funkcji % ####################################################################################### function gradienty=ann_propagacja_wstecz(Wagi_macierze, parametry_warstw, X, y, lambda) % Propagacja wsteczna bledu w celu obliczenia gradientow wplywu zmiany wag L_warstw = length( parametry_warstw ); L_przykladow = size(X, 1); L_klas = parametry_warstw( end ); % liczba warstw % liczba przykladow % liczba klas Delta = {}; % deklaracja struktury gradientow for nr_warstwy = 1 : (L_warstw-1) % dla wszystkich warstw L_we = parametry_warstw( nr_warstwy ); % liczba wejsc L_wy = parametry_warstw( nr_warstwy + 1 ); % liczba wyjsc Delta{ nr_warstwy } = zeros( L_wy, L_we + 1 ); % inicjalizacja struktury gradientow end % Powtorzenie dla wszystkich przykladow treningowych for i = 1 : L_przykladow % "c, "z" - wejscie i wyjscie z kazdej warstwy bez sigmoid C = {}; % struktura z wektorami wejsciowymi do warstw Z = {}; % struktura z wektorami wyjsciowymi z warstw % Ustawienie aktywacji pierwszej warstwy w kolejnym przykladzie c = [1; X(i, :)’]; % pierwszy wektor wejsciowy dla i-tego przykladu C{1} = c; % zapamietanie w strukturze z wektorami wejsc. % Przetworzenie [wejscie --> wyjscie] dla calej sieci dla danego przykladu for nr_warstwy = 1 : (L_warstw-1) % propagacja wprzod warstwa po warstwie Wagi_warstwy_1macierz = Wagi_macierze{ nr_warstwy }; % pobranie macierzy wag z = Wagi_warstwy_1macierz * c; % wy = suma( we * wagi ) dla calej warstwy wyjscie = [1; sigmoid(z)]; % funkcja sigmoidalna dla wy calej warstwy c = wyjscie; % obecne wyjscie to nastepne wejscie C{ nr_warstwy + 1 } = c; % zapamietanie wektora w strukturze wejsc Z{ nr_warstwy + 1 } = z; % zapamietanie wektora w strukturze wyjsc end % Usuniecie bias/offsetu dodanego do wyjscia z ostatniej warstwy ("undo") y_wyjscie = c(2:end, :); % Obliczenie przyrostow funkcji dla wszystkich warstw oprocz wejsciowej % Inicjalizacja struktury z macierzami bledow dla wszystkich warstw delta = {}; % Przeksztalcenia numeru klasy do postaci wektora z "1" odpowiednim wierszu % (np.. klasa=5 --> [0; 0; 0; 0; 1; 0; 0; 0; 0; 0]) y_wzorzec = ( 1 : L_klas == y(i) )’; % Obliczenie bledu dla ostatniej warstwy (wyjsciowej) dla obecnego przykladu 376 16 Podstawy numeryczne sztucznej inteligncji delta{ L_warstw } = y_wyjscie - y_wzorzec; % Obliczenie bledow dla warstw ukrytych dla obecnego przykladu (backpropagation) for ilewstecz = 1 : (L_warstw-2) % ktora warstwa od tylu nr_warstwy_przed = L_warstw - ilewstecz; % L_warstw-1, ..., 2. wagi_warstwy_po = Wagi_macierze{ nr_warstwy_przed }; % wagi warstwy po ( inaczej) delta_warstwy_po = delta{ nr_warstwy_przed + 1 }; % blad warstwy po z_warstwy_przed = Z{ nr_warstwy_przed }; % "z" warstwy przed delta{ nr_warstwy_przed } = ( wagi_warstwy_po’ * delta_warstwy_po ) .* ... [1; sigmoid_gradient(z_warstwy_przed)]; % !!! propagacja bledu wstecz delta{ nr_warstwy_przed } = delta{ nr_warstwy_przed }(2:end); % usuniecie bias end % Akumulacja gradientow funkcji dla kazdego przejscia dla kolejnych przykladow for nr_warstwy = 1 : (L_warstw-1) Delta{nr_warstwy} = Delta{nr_warstwy} + delta{nr_warstwy+1}*C{nr_warstwy}’; end end % koniec przetwarzania wszystkich przykladow % Obliczenie wspolczynnikow regularyzacji dla poszczegolnych warstw % (pierwsza kolumna macierzy "Wagi_macierze" nie powinna byc regularyzowana) regular = {}; for nr_warstwy = 1 : (L_warstw-1) Delta_warstwy = Delta{ nr_warstwy }; regular{ nr_warstwy } = (lambda / L_przykladow) * ... [ zeros( size(Delta_warstwy, 1), 1) Delta_warstwy(:, 2:end) ]; end % Obliczenie gradientow dla funkcji kosztu z regularyzacja for nr_warstwy = 1 : (L_warstw-1) Delta{nr_warstwy} = (1/L_przykladow)*Delta{nr_warstwy} + regular{nr_warstwy}; end % Konwersja do postaci wektora gradienty = ann_wagi_macierze2wektor( Delta ); end % funkcji % ######################### function y = sigmoid(z) % Funkcja sigmoidalna y = 1 ./ (1 + exp(-z)); end % ############################## function g = sigmoid_gradient(z) % Funkcja gradientu funkcji sigmoidalnej g = sigmoid(z) .* (1 - sigmoid(z)); end 16.5.3.5 Wyniki działania programu Poniżej przedstawiono wyniki, otrzymane z opisanego powyżej programu. Na rysunku 16.33 jest zaprezentowana graficznie otrzymana tablica/macierz pomyłek (confusion matrix). Im kolor ciemniejszy (bardziej ciemnoniebieski) tym wartość jest mniejsza. Przypomnijmy: ten sam zbiór 5000 obrazów (10 × 500 przykładow) był użyty do trenowania (40 krotne powtórzenie operacji uczenia) i testowania (rozpoznawania). Uzyskano dokładność (accuracy rozpoznawania równa˛ 96%. Widzimy, że liczba 3 jest cz˛esto rozpoznawana jako 5, liczba 4 jako 9, 5 jako 3, a 9 jako 7. Wyniki liczbowe sa˛ zaprezentowane na rysunku 16.34, oraz w tabeli 16.2. 16.5 Sztuczne sieci neuronowe - płytkie i głebokie 377 Macierz pomylek/bledu - co jest podobne do czego? 1 2 3 Testowana cyfra 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 Rozpoznana cyfra Rysunek 16.33: Graficzne przedstawienie macierzy pomyłek (confusion matrix) dla rozpoznawania 10 r˛ecznie pisanych cyfr (10 oznacza cyfr˛e 0). Wyniki rozpoznawania 10 9 Rozpoznana wartosc 8 7 6 5 4 3 2 zadane rozpoznane 1 0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000 Nr testu Rysunek 16.34: Liczbowe wyniki rozpoznawania r˛ecznie pisanych 10 cyfr (10 oznacza cyfr˛e 0). W tym miejscu należałoby poważnie zastanowić si˛e dlaczego niektóre cyfry sa˛ gorzej rozpoznawane/klasyfikowane. Przykładowo: 378 16 Podstawy numeryczne sztucznej inteligncji Zadana cyfra Tabela 16.2: Przykładowa tabela pomyłek (confusion matrix) dla omawianego problemu rozpoznawania 500 odr˛ecznie pisanych cyfr przez nauczona/wytrenowan ˛ a˛ sieć neuronowa˛ - podano liczb˛e decyzji. 1 1 488 2 2 3 2 4 2 5 0 6 1 7 4 8 3 9 3 0/10 0 2 2 467 6 2 1 0 4 0 1 0 3 1 1 470 1 9 0 2 8 5 1 Rozpoznana cyfra 4 5 6 7 8 2 2 0 1 2 6 0 2 6 8 0 11 2 5 1 478 1 4 1 2 3 481 1 0 3 0 3 491 0 2 4 0 0 482 0 4 3 2 1 478 2 0 0 12 1 0 1 2 0 1 9 0/10 2 0 0 8 3 0 8 1 0 2 0 3 4 0 0 1 473 3 0 495 1. jeśli cyfra wyglada ˛ inaczej niż 3 a jest rozpoznawana jako 3, to znaczy że algorytm źle działa: 1) może jest zbyt prosty albo niedouczony? 2) może wyst˛epuja˛ bł˛edy w opisie danych wejściowych? 2. jeśli cyfra wyglada ˛ podobnie jak 3 i jest rozpoznawana jako 3, to może dane maja˛ taka sama˛ charakterystyk˛e i bł˛edy sa˛ nie do unikniecia? Pami˛etajmy, bł˛ednie sklasyfikowane przykłady trzeba zawsze bardzo starannie obejrzeć i pobawić si˛e w pana doktora: wyciagn ˛ ać ˛ wnioski, postawić trafna˛ diagnoz˛e i ... wyleczyć chorego. 16.5.3.6 Zadania Problem 16.16 (**(*)(*) ANN w rozpoznawaniu r˛ecznie pisanych cyfr). Uruchom program 16.12 i sprawdź poprawność jego działania - powinieneś zobaczyć rysunek podobny do 16.33. Zmieniaj liczb˛e warstw uktytych oraz liczb˛e neuronów w każdej warstwie i postaraj si˛e znaleźć konfiguracj˛e sieci z najniejsza˛ liczba˛ neuronów, która zapewnia dokładność rozpoznawania minimum 95%. Sprawdź jak zwi˛eksza si˛e dokładność rozpoznawania dla tej konfiguracja wraz ze wzrostem cykli uczenia. Jaka˛ maksymalna˛ dokładność można uzyskać? Sprawdź czy i jak wartość współczynnika regularyzacji wpływa na wynik. Sprawdź czy i jak inicjalizacja wag sieci wpływa na wynik. Dodatkowy (*): podziel zbiór obrazów na podzbiór uczacy ˛ i weryfikacyjny pierwszym z nich wytrenuj sieć, a drugim sprawdź dokładność rozpoznawania. Dodatkowy (*): przeprowadź wielokrotnie procedur˛e podziału, uczenia i rozpoznawania - oblicz średnia˛ dokładność rozpoznawania z wszystkich esperymentów. Problem 16.17 (**(*)(*) ANN w rozpoznawaniu astmy). Zapoznaj si˛e z programem ai_7_ann_astma.m, podobnym do (16.12), dost˛epnym w repozytorium kursu, uruchom go i sprawdź +/- poprawność jego działania. Postaraj si˛e zrealizować zadania z problemu 16.16, które sa˛ tak samo punktowane. 16.6 Podsumowanie 379 Problem 16.18 (**(*)(*) ANN w rozpoznawaniu chorób serca). Zapoznaj si˛e z programem ai_7_ann_ekg.m, dost˛epnym w repozytorium kursu, podobnym do (16.12), uruchom go i sprawdź +/- poprawność jego działania. Postaraj si˛e zrealizować zadania z problemu 16.16, które sa˛ tak samo punktowane. Problem 16.19 (**** ANN w rozpoznawaniu XYZ). Wybierz sam interesujacy ˛ ci˛e problem, z wielu opisanych w internecie - np. patrz [14] [15], zmodyfikuj program 16.12, czyli ai_7_ann_cyfry.m, oraz spróbuj znaleźć parametry sieci ANN, rozwiazuj ˛ acy ˛ Twój problem. 16.6 Podsumowanie Podsumujmy najważniejsze elementy tego wykładu i ... całego kursu Menu. 1. Wiedza to piramida. Uczac ˛ si˛e matematyki, matematycznego opisu świata oraz matematyki komputerowej, czyli MeNu, tworzymy najlepszy fundament pod swoje przyszłe, informatyczne sukcesy zawodowe. Zapewni nam to udział w rozgrywkach “Champions League”, a nie w lidze osiedlowej. 2. “Ziarnko do ziarnka a zbierze si˛e miarka”. “Nie od razu Kraków zbudowano”. Teraz pod koniec kursu MeNu widzimy jak w uczeniu maszynowym ważna jest znajomość tego, co wygladało ˛ tak “nieciekawie” w poprzednich zaj˛eciach: zapewnienie dokładności obliczeniowej (problem zbieżności algorytmów adaptacyjnych), umiej˛etność szybkiego i dokładnego obliczania pochodnych (problem automatic differtiation), znajomość i świadomy wybór najkorzystniejszych w danym momencie algorytmów optymalizacyjnych (steepest descent albo inny),... Czyli szukajmy drugiego dna we wszystkim co na pierwszy rzut oka wyglada ˛ na nieistotne. 3. Klasyczne uczenie maszynowe wymaga dużej wiedzy programisty-algorytmisty na temat modelowanego procesu/obiektu na etapie zaproponowania dobrze charakteryzujacych ˛ go cech. Po ekstrakcji cech nast˛epuje ich analiza, redukcja i użycie. Sieci neuronowe moga˛ też na wejściu otrzymywać już obliczone cechy (proste klasyczne ANN), ale moga˛ je też same obliczać/wyznaczać w swoich warstwach poczatkowych ˛ (splotowe i gł˛ebokie ANN, zdecydowanie wi˛eksze). 4. Cech używa klasyfikator. Najlepiej kiedy wektory cech (uporzadkowany ˛ zbiór N liczb) maja˛ dla różnych klas danych inne punkty skupień w przestrzeni Nwymiarowej. Jeśli tak jest, ale tylko w przybliżeniu, to musimy pomyśleć nad modyfikacja/przebudow ˛ a˛ wektora cech albo użyciem “madrzejszego” ˛ klasyfikatora(np. SVN), który jest w stanie dobrać hiperpłaszczyzny o bardziej skomplikowanym kształcie do rozgraniczenia obszarów różnych klas analizowanych danych w przestrzeni N-wymiarowej. 5. Istnieja˛ standardowe miary jakości rozpoznawania, np. czułość, swoistość, precyzja, dokładność - patrz tabela 16.1. 6. Regresja liniowa i logistyczna stanowa˛ punkt startowy do zrozumienia i madrej ˛ implementacji sieci neuronowych. 7. Obecnie najpopularniejsze sa˛ splotowe i gł˛ebokie sieci neuronowe. Zazwyczaj nie sa˛ one implementowane tylko używane, tzn. programista wykorzystuje sieć 380 16 Podstawy numeryczne sztucznej inteligncji dost˛epna˛ zdalnie (np. Tensorflow [10] z interfejsami w Pythonie scikit-learn [7] i Keras [4]), która˛ konfiguruje i której dostarcza dane wejściowe. 8. Ciekawym, obecnie modnym zastosowaniem sieci neuronowych sa˛ tzw. autokodery. Jest to wielowarstwowa sieć ANN, która posiada tyle samo, bardzo dużo wejść i wyjść (np. próbki sygnałów), wiele rozbudowanych warstw wewn˛etrznych, a pośrodku - jedna˛ warstw˛e ukryta,˛ majac ˛ a˛ mała˛ liczb˛e neuronów. Sieć jest uczona w ten sposób, aby jej wyjścia były takie same jak jej wejścia. W wyniku tego cała informacja dotyczaca ˛ konkretnego sygnału powinna zostać skompresowana (zakodowana) w wyjściach kilku neuronów środkowej warstwy kodujacej ˛ autokodera. Literatura 1. A. G. Baydin, B. A. Pearlmutter, A. A. Radul, J. M. Siskind, Automatic Differentiation in Machine Learning: a Survey, The Journal of Machine Learning Research, 18(153), 2018, pp. 1–43, https:// arxiv.org/ abs/ 1502.05767. 2. Ch. M. Bishop, Pattern Recognition and Machine Learning, Springer, New York, 2006. 3. I. Goodfellow, Y. Bengio, A. Courvill, Deep Learning, The MIT Press, Cambridge (MA), 2016 (PWN, Warszawa, 2021), https:// www.deeplearningbook.org/ . 4. Keras, Getting started and learning resources, https:// keras.io/ getting_started/ ecosystem/ , https:// keras.io/ getting_started/ learning_resources/ 5. B. Krose, P. van der Smagt, An introduction to Neural Networks, University of Amsterdam, 1996. 6. M. Nielsen, Neural Networks and Deep Learning, on-line: http:// neuralnetworksanddeeplearning.com/ 7. Scikit-learn, Machine Learning in Python, https:// scikit-learn.org/ stable/ . 8. R. Tadeusiewicz, Sieci neuronowe, Akademicka Oficyna Wydawnicza, Warszawa, 1993. 9. R. Tadeusiewicz, Elementarne wprowadzenie do techniki sieci neuronowych z przykładowymi programami (w j˛ezyku Basic), Akademicka Oficyna Wydawnicza, Warszawa, 1998. 10. Tensorflow, Basics of machine learning with TensorFlow, https:// www.tensorflow.org/ resources/ learn-ml/ basics-of-machine-learning 11. Tensorflow, Playground: Tinker With a Neural Network, https:// playground.tensorflow.org/ 12. O. Trekhleb, Machine Learning in MatLab/Octave, https:// github.com/ trekhleb/ machine-learning-octave 13. M. Wisniewski, T.P. Zielinski, “Joint Application of Audio Spectral Envelope and Tonality Index in an E-Asthma Monitoring System”, IEEE Journal of Biomedical and Health Informatics, vol. 19, no. 3, pp. 1009-1018, May 2015. Bazy danych 14. Kaggle, Datasets, https:// www.kaggle.com/ datasets, https:// www.kaggle.com/ competitions 15. Physionet, Datasets, https:// physionet.org/ content/ challenge-2017/ 1.0.0/ Ciekawe strony 16. A. Pant, Introduction to Logistic Regression, https:// towardsdatascience.com/ introduction-to-logistic-regression-66248243c148 17. Kaggle, Feature Engineering, https:// www.kaggle.com/ learn/ feature-engineering 18. Kaggle, Intro to Deep Learning, https:// www.kaggle.com/ learn/ intro-to-deep-learning 19. Kaggle, Intro to Machine Learning, https:// www.kaggle.com/ learn/ intro-to-machine-learning 20. Mathworks, Automatic Differentiation Beackground, on-line: https:// www.mathworks.com/ help/ deeplearning/ ug/ deep-learning-with-automatic-differentiation-in-matlab.html 21. S. Saha, A Comprehensive Guide to Convolutional Neural Networks, on-line: https:// towardsdatascience.com/ a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53 22. J. Sloan, A Tutorial on Principal Component Analysis. Derivation, Discussion and Singular Value Decomposition, on-line: https:// www.cs.princeton.edu/ picasso/ mats/ PCA-Tutorial-Intuition_jp.pdf 23. Wikipedia, Automatic Differentiation, https:// en.wikipedia.org/ wiki/ Automatic_differentiation