Wstęp do metod numerycznych Wykład 2 Matematyka w Pythonie dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki 1
Liczby 2 Liczby całkowite są 32-bitowe w formacie U2. Zakres wartości to do Python reprezentuje liczby całkowite jako ciągi cyfr, które nie zawierają żadnych znaków interpunkcyjnych i nie mogą zaczynać się od zera (0). Zera są wykorzystywane dla liczb ósemkowych i szesnastkowych. Liczba ósemkowa, to ciąg cyfr zaczynający się od 0 >>> Liczba szesnastkowa, to ciąg cyfr zaczynający się od 0x >>> 0xff 255 Liczba dwójkowa (kod binarny prosty), to ciąg cyfr zaczynający się od 0b >>> 0b
Liczby 3 Liczby całkowite długie. Python jest w stanie zapamiętać liczbę całkowitą na maksymalnie 1024 pozycjach dwójkowych >>> 2** L Przejście na liczby długie spowalnia obliczenia. Wymuszenie użycia liczb długich następuje gdy dodamy L na końcu liczby Liczby zmiennoprzecinkowe Liczby zmiennoprzecinkowe pamiętane są w Pythonie jako double (podwójna precyzja), najczęściej 64-bitowo. Do zapisu możemy użyć notacji zwykłej lub naukowej (wykładniczej), np.: E-2 625E-4 UWAGA: Liczby są pamiętane dwójkowo, więc mogą pojawić się niedokładności (patrz ćw. z Architektury, dla przykładu liczba 0.1)
Liczby zespolone 4 liczba = j Część rzeczywista liczba.real # wynik 20.0 Część urojona liczba.imag # wynik 7.0 Liczba sprzężona liczba.conjugate() # wynik (20-7j) Moduł z liczby abs(liczba) # wynik
Liczby zespolone - działania 5 Niech L 1 = (a 1 + b 1 j), L 2 = (a 2 + b 2 j) L 1 + L 2 = (a 1 + a 2 ) + (b 1 + b 2 )j L 1 - L 2 =(a 1 + b 1 j) - (a 2 + b 2 j) = (a 1 - a 2 ) + (b 1 - b 2 )j L 1 · L 2 = (a 1 a 2 - b 1 b 2 ) + (a 1 b 2 + a 2 b 1 )j L 1 / L 2 = (a 1 a 2 - b 1 b 2 )/(a b 2 2 ) + (a 2 b 1 - a 1 b 2 )/(a b 2 2 )j ( j) + ( j) ( j) - ( j) (2 + 2j) * (3 + 3j) (9 + 9j) / (3 + 3j) wynik ( j) wynik ( j) wynik 12j wynik (3 + 0j)
Konwersje 6 Jeżeli oba składniki działania są całkowite, to działanie odbywa się w dziedzinie liczb całkowitych >>> 22/7 3 Aby wykonać działanie zmiennoprzecinkowe, jeden z elementów musi być zmiennoprzecinkowy >>> float(22)/ >>> 22./ >>> 22/
Konwersje 7 Inne konwersje int(3.8) long(2) float(4) int('3') str(3) bin(22) int('1101',2) Wypróbuj również hex(liczba), oct(liczba) wynik 3 - obcina wynik 2L – rozszerza do l. długiej wynik 4.0 – rozszerza do l. zmiennoprzecinkowej wynik 3 – konwersja jeżeli to możliwe string na liczbę wynik 13 – konwersja stringu z liczbą dwójkową na int wynik '3' – konwertuje liczbę na string wynik '0b10110' konwertuje liczbę na string binarny
wbudowane funkcje matematyczne 8 Wartość bezwzględna abs(-3) # 3 Wartość maksymalna max([4,7,3]) # 7 Wartość minimalna max([2,5,77]) ]) # 2 Cecha i mantysa ilorazu divmod(7,6) # (1,1) Potęga pow(2,3) # 8 Można też napisać 2**3
Funkcje modułu math 9 Moduł math używamy poprzez import import math Epsilon math.e # Pi math.pi # Sufit – zaokrąglenie do góry math.ceil(wartosc) Podłoga – zaokrąglenie w dół math.floor(wartosc)
10 Logarytmy math.log(wartosc, baza) math.log10(wartosc) Pierwiastek math.sqrt(wartosc) Eksponent e x math.exp(wartosc) Konwersja z radianów na stopnie i na odwrót math.degrees(kat) math.radians(kat) Funkcje modułu math Odległość euklidesowa math.hypot(x, y) oblicza sqrt(x*x+y*y)
Funkcje modułu math 11 Funkcje trygonometryczne math.sin(wartosc) math.cos(wartosc) math.tan(wartosc) Funkcje cyklometryczne math.asin(wartosc) math.acos(wartosc) math.atan(wartosc) Funkcje hiperboliczne math.sinh(wartosc) math.cosh(wartosc) math.tanh(wartosc)
Algebra Boole’a i operacje bitowe 12 Operator negacji bitowej NOT (Pamiętajmy, że liczby są w kodzie U2), np. X= 5 (10) = (U2) NOT X = (U2) = -6 (10) >>> ~5 -6 Operator iloczynu bitowego AND >>> print 0&0, 1&0, 0&1, 1& >>> print 3& & Pozostałe operatory: AND 3|5 XOR 3^5 SHR 8>>3 # wynik 2 SHL 1<<10 # wynik 1024 Pozostałe operatory: AND 3|5 XOR 3^5 SHR 8>>3 # wynik 2 SHL 1<<10 # wynik 1024
Arytmetyka zbiorów 13 W Pythonie istnieją zbiory zmienne i niezmienne Zbiory niezmienne z1 = frozenset(['kot', 'pies', 'Ala']) Zbiory zmienne z2 =set(['Ola', 'Ala', 'Ela']) Modyfikacja zbioru zmiennego Usuwanie elementów z2.remove('Ala') # set(['Ola', 'Ela')] z2.pop() # set(['Ela']) z2.clear() # set() Rozszerzanie zbioru z2.add('Ala') # set(['Ala']) z2.update('Ela','Ola','Ula') # set(['Ala','Ela','Ola','Ula')]
Arytmetyka zbiorów 14 Suma zbiorów z1 | z2 z1.union(z2) Część wspólna z1 & z2 z1.intersection(z2) # wynik - frozenset(['Ala']) Różnica zbiorów (coś co należy do zbioru pierwszego a nie należy do zbioru 2) z1-z2 z1.difference(z2) # frozenset(['kot', 'pies']) Symetryczna różnica (czyli suma odjąć część wspólna) z1 ^ z2 z1.symatric_difference(z2) # frozenset(['Ela', 'Ola', 'Ula', 'kot', 'pies'])
Arytmetyka zbiorów 15 Zawieranie się elementu 'Ala' in z1 'Ala' # True Nie zawieranie się elementu 'kot' not in z2 # True Czy podzbiór z1.issubset(z2) z1<z2 # False Czy nadzbiór z2.issuperset(z1) z1>z2 # False
Biblioteka numpy 16 Jest to ogromna biblioteka dla zastosowań naukowych Możliwości: operacje na wektorach i macierzach, operacje wejścia wyjścia dla danych elementy algebry liniowej zaimplementowane metody numeryczne wiele innych
Moduły w bibliotece numpy 17 Modułzastosowanie clusteralgorytmy klasteryzacji danych cowpakiet do programowania równoległego fftpack, fftwdomyślny pakiet FFT lub pakiet oparty o FFTW gaalgorytmy genetyczne integratecałkowanie numeryczne interpolateinterpolacja iofunkcje wejścia/wyjścia linalgalgebra liniowa optimizezagadnienia optymalizacji plt, gplt, xpltpakiet do wykresów w WxPython Gnuplot lub Gist signalprzetwarzanie sygnałów specialfunkcje specjalne statsfunkcje statystyczne
Wektory – sekwencje jednowymiarowe 18 numpy.arange ([start,] stop, [krok] dtype = None) Funkcja zwraca tablicę liczb równooddalonych od siebie w zadanym przedziale. Wartości są generowane w półotwartym przedziale [początek, koniec) (innymi słowy, przedział zawiera początek, ale nie koniec). Dla liczb całkowitych funkcja działa tak jak range ale zwraca typ zwraca ndarray zamiast listy. >>> np.arange(3) array([0, 1, 2]) >>> np.arange(3.0) array([ 0., 1., 2.]) >>> np.arange(3,7) array([3, 4, 5, 6]) >>> np.arange(3,7,2) array([3, 5])
Sekwencje jednowymiarowe 19 Użycie dtype – wymusza typ danych >>> np.arange(3, dtype=np.uint8) array([0, 1, 2], dtype=uint8) >>> np.arange(3, dtype=np.uint8) array([0, 1, 2], dtype=uint8) >>> np.arange(3, dtype = np.int_) array([0, 1, 2]) >>> np.arange(3, dtype = np.int_) array([0, 1, 2]) >>> np.arange(4, dtype = np.bool_) Traceback (most recent call last): File " ", line 1, in np.arange(4, dtype = np.bool_) ValueError: no fill-function for data-type. >>> np.arange(4, dtype = np.bool_) Traceback (most recent call last): File " ", line 1, in np.arange(4, dtype = np.bool_) ValueError: no fill-function for data-type. >>> np.arange(4, dtype = np.float32) array([ 0., 1., 2., 3.], dtype=float32) >>> np.arange(4, dtype = np.float32) array([ 0., 1., 2., 3.], dtype=float32)
Wektory – użycie linspace 20 Zastosowanie arange ze względu na to, że zwraca przedział półotwarty jest trudne do zastosowania przy kroku niecałkowitym, np. 0.1 W tym wypadku lepiej używać linspace >>> np.arange(1, 3.01, 0.2) array([ 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0 ]) >>> np.arange(1, 3.01, 0.2) array([ 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0 ]) >>> np.arange(3, 1, -0.5) array([ 3.0, 2.5, 2.0, 1.5]) >>> np.arange(3, 1, -0.5) array([ 3.0, 2.5, 2.0, 1.5]) linspace(a, b, n) wygeneruje nam przedział domknięty [a, b] zawierający n liczb >>> np.linspace(1, 4, 6) array([ 1., 1.6, 2.2, 2.8, 3.4, 4. ]) >>> np.linspace(1, 4, 6) array([ 1., 1.6, 2.2, 2.8, 3.4, 4. ]) >>> np.linspace(1, 4, 1) array([ 1.]) >>> np.linspace(1, 4, 1) array([ 1.]) >>> np.linspace(1, 4,0) array([], dtype=float64) >>> np.linspace(1, 4,0) array([], dtype=float64)
Tworzenie wektorów 21 array – przekształca dane wejściowe (listy, krotki lub innego rodzaju sekwencje) do ndarray poprzez wywnioskowanie typu lub z jawnym wymuszeniem typu. >>> np.array(range(10), dtype=np.float64) array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) >>> np.array(range(10), dtype=np.float64) array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) ones – tworzy wektor jednostkowy o określonej długości i typie >>> np.ones(10, dtype=np.float32) array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32) >>> np.ones(10, dtype=np.float32) array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32) ones_like – tworzy wektor jednostkowy o długości i typie takiej, jak tablica źródłowa >>> A = np.linspace(-1,1,9) >>> A array([-1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75, 1.0]) >>> np.ones_like(A) array([ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]) >>> A = np.linspace(-1,1,9) >>> A array([-1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75, 1.0]) >>> np.ones_like(A) array([ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]) zeros, zeros_like – tworzą wektor zerowy w analogiczny sposób
Operacje na macierzach 22 Tworzenie macierzy >>> A1 = np.mat('[1,3,5; 2,5,1; 2,3,8]') >>> A2 = np.mat([[5,3,5],[2,3,1],[4,3,1]]) >>> A1 matrix([[1, 3, 5], [2, 5, 1], [2, 3, 8]]) >>> A2 matrix([[5, 3, 5], [2, 3, 1], [4, 3, 1]]) >>> A1 = np.mat('[1,3,5; 2,5,1; 2,3,8]') >>> A2 = np.mat([[5,3,5],[2,3,1],[4,3,1]]) >>> A1 matrix([[1, 3, 5], [2, 5, 1], [2, 3, 8]]) >>> A2 matrix([[5, 3, 5], [2, 3, 1], [4, 3, 1]]) Macierz jednostkowa np.eye(3) array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) np.eye(3) array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]])
Macierze i tablice 23 Macierze i tablice możemy pomiędzy sobą konwertować w zależności od potrzeb (inne są operacje na macierzach, inne na tablicach) >>> A1 matrix([[1, 3, 5], [2, 5, 1], [2, 3, 8]]) >>> A1 matrix([[1, 3, 5], [2, 5, 1], [2, 3, 8]]) >>> np.array(A1) array([[1, 3, 5], [2, 5, 1], [2, 3, 8]]) >>> np.array(A1) array([[1, 3, 5], [2, 5, 1], [2, 3, 8]]) Przekształcanie tablicy jednowymiarowej w dwuwymiarową >>> a=np.arange(20) >>> print a [ ] >>> A= a.reshape(5,4) >>> print A [[ ] [ ] [ ] [ ] [ ]] >>> a=np.arange(20) >>> print a [ ] >>> A= a.reshape(5,4) >>> print A [[ ] [ ] [ ] [ ] [ ]] … więcej na wykładzie na temat rachunku macierzowego (wkrótce)
Przykładowe zastosowania numpy 24 Rozwiąż układ równań liniowych >>> A = np.mat('[1,3,5; 2,5,1; 2,3,8]') >>> b =np.mat([10,8,3]) >>> b1=np.transpose(b) >>> np.linalg.solve(A,b1) matrix([[-9.28], [ 5.16], [ 0.76]]) >>> A = np.mat('[1,3,5; 2,5,1; 2,3,8]') >>> b =np.mat([10,8,3]) >>> b1=np.transpose(b) >>> np.linalg.solve(A,b1) matrix([[-9.28], [ 5.16], [ 0.76]])
Przykłady numpy – oblicz wartość całki 25 >>> import numpy >>> from scipy import integrate >>> def fun(x): return numpy.exp(numpy.sin(x)/numpy.sqrt(2))/(2*numpy.pi) >>> calka = integrate.quad(fun,0,2*numpy.pi) >>> calka ( , e-09) >>> import numpy >>> from scipy import integrate >>> def fun(x): return numpy.exp(numpy.sin(x)/numpy.sqrt(2))/(2*numpy.pi) >>> calka = integrate.quad(fun,0,2*numpy.pi) >>> calka ( , e-09)
Przykłady numpy – równania nieliniowe 26 Ustal punkt przecięcia wykresów funkcji >>> import numpy as np >>> from scipy import optimize >>> def f(x): return np.exp(x)-3*x >>> pp = optimize.fsolve(f,1) >>> print pp, f(pp) [ ] [ 0.] >>> import numpy as np >>> from scipy import optimize >>> def f(x): return np.exp(x)-3*x >>> pp = optimize.fsolve(f,1) >>> print pp, f(pp) [ ] [ 0.]
Przykłady numpy - wielomiany 27 Wyszukaj pierwiastki wielomianu >>> import scipy >>> wiel =scipy.poly1d([9,18,38,-57,14]) >>> wiel.r array([ j, j, j, j ]) >>> import scipy >>> wiel =scipy.poly1d([9,18,38,-57,14]) >>> wiel.r array([ j, j, j, j ]) Wielomian ma dwa pierwiastki rzeczywiste (0.66 i 0.33) oraz dwa zespolone
Przykłady numpy – wartości własne 28 Dla macierzy Znajdź wartości i wektory własne from numpy import matrix, linalg >>> A = matrix([[1, 1 - 1j, 1 - 2j, 1 - 3j], [1 + 1j, 2, 2 - 1j, 2 - 2j], [1 + 2j, 2 + 1j, 3, 3 - 1j], [1 + 3j, 2 + 2j, 3 + 1j, 4]]) >>> la, v = linalg.eig(A) >>> la array([ e-17j, e-16j, e-16j, e-16j]) >>> v matrix([[ j, j, j, j], [ j, j, j, j], [ j, j, j, j ], [ j, j, j, j]]) from numpy import matrix, linalg >>> A = matrix([[1, 1 - 1j, 1 - 2j, 1 - 3j], [1 + 1j, 2, 2 - 1j, 2 - 2j], [1 + 2j, 2 + 1j, 3, 3 - 1j], [1 + 3j, 2 + 2j, 3 + 1j, 4]]) >>> la, v = linalg.eig(A) >>> la array([ e-17j, e-16j, e-16j, e-16j]) >>> v matrix([[ j, j, j, j], [ j, j, j, j], [ j, j, j, j ], [ j, j, j, j]])
Przykłady numpy - interpolacja 29 Dla funkcji danej tablicą Wykonaj interpolację z użyciem krzywych sklejanych. Narysuj wykres funkcji >>> from matplotlib import pyplot >>> from scipy import interpolate >>> x = [1850, 1950, 1960, 1970, 1985, 2000, 2025] >>> y = [1.402, 2.486, 3.014, 3.683, 4.842, 6.127, 8.177] >>> spline = interpolate.splrep(x, y) >>> xnew = scipy.arange(1850, 2025, 1) >>> ynew = interpolate.splev(xnew, spline) >>> pyplot.plot(xnew, ynew, 'k') [ ] >>> pyplot.show() >>> from matplotlib import pyplot >>> from scipy import interpolate >>> x = [1850, 1950, 1960, 1970, 1985, 2000, 2025] >>> y = [1.402, 2.486, 3.014, 3.683, 4.842, 6.127, 8.177] >>> spline = interpolate.splrep(x, y) >>> xnew = scipy.arange(1850, 2025, 1) >>> ynew = interpolate.splev(xnew, spline) >>> pyplot.plot(xnew, ynew, 'k') [ ] >>> pyplot.show()
Literatura 30