Uploaded by Testowy Teet

MeNu nopass

advertisement
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
Download