Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałMaria Smolińska Został zmieniony 8 lat temu
1
Wstęp do metod numerycznych Wykład 2 Matematyka w Pythonie dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz 1
2
Liczby 2 Liczby całkowite są 32-bitowe w formacie U2. Zakres wartości to -2 147 483 648 do 2 147 483 647 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 >>> 012 10 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 >>> 0b1101 13
3
Liczby 3 Liczby całkowite długie. Python jest w stanie zapamiętać liczbę całkowitą na maksymalnie 1024 pozycjach dwójkowych >>> 2**33 8589934592L 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.:.0625 0.0625 6.25E-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)
4
Liczby zespolone 4 liczba = 20 + 7j 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 21.18962010041709
5
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 2 2 + b 2 2 ) + (a 2 b 1 - a 1 b 2 )/(a 2 2 + b 2 2 )j (20 + 10j) + (10 + 20j) (20 + 10j) - (10 + 20j) (2 + 2j) * (3 + 3j) (9 + 9j) / (3 + 3j) wynik (30 + 30j) wynik (10 - 10j) wynik 12j wynik (3 + 0j)
6
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)/7 3.142857142857143 >>> 22./7 3.142857142857143 >>> 22/7. 3.142857142857143
7
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
8
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
9
Funkcje modułu math 9 Moduł math używamy poprzez import import math Epsilon math.e # 2.7182818284590451 Pi math.pi # 3.1415926535897931 Sufit – zaokrąglenie do góry math.ceil(wartosc) Podłoga – zaokrąglenie w dół math.floor(wartosc)
10
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)
11
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)
12
Algebra Boole’a i operacje bitowe 12 Operator negacji bitowej NOT (Pamiętajmy, że liczby są w kodzie U2), np. X= 5 (10) = 00000101 (U2) NOT X = 1111010 (U2) = -6 (10) >>> ~5 -6 Operator iloczynu bitowego AND >>> print 0&0, 1&0, 0&1, 1&1 0 0 0 1 >>> print 3&5 1 0 0 1 1 & 0 1 0 1 ------- 0 0 0 1 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
13
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')]
14
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'])
15
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
16
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
17
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
18
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])
19
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)
20
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)
21
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
22
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.]])
23
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 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] >>> A= a.reshape(5,4) >>> print A [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19]] >>> a=np.arange(20) >>> print a [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] >>> A= a.reshape(5,4) >>> print A [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19]] … więcej na wykładzie na temat rachunku macierzowego (wkrótce)
24
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]])
25
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 (1.1289609294541905, 7.4290711497618475e-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 (1.1289609294541905, 7.4290711497618475e-09)
26
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.61906129] [ 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.61906129] [ 0.]
27
Przykłady numpy - wielomiany 27 Wyszukaj pierwiastki wielomianu >>> import scipy >>> wiel =scipy.poly1d([9,18,38,-57,14]) >>> wiel.r array([-1.50000000+2.17944947j, -1.50000000-2.17944947j, 0.66666667+0.j, 0.33333333+0.j ]) >>> import scipy >>> wiel =scipy.poly1d([9,18,38,-57,14]) >>> wiel.r array([-1.50000000+2.17944947j, -1.50000000-2.17944947j, 0.66666667+0.j, 0.33333333+0.j ]) Wielomian ma dwa pierwiastki rzeczywiste (0.66 i 0.33) oraz dwa zespolone
28
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([ 10.39935693 +5.02977868e-17j, -1.22156554 -2.29527907e-16j, 0.51866717 -4.63347599e-16j, 0.30354143 +1.15221783e-16j]) >>> v matrix([[ 0.09186865-0.38603305j, 0.78317402+0.j, -0.42280692+0.13189711j, 0.17396786+0.05243788j], [ 0.30830780-0.28002101j, 0.27388174-0.06177703j, 0.55138541+0.j, -0.66486088-0.04050999j], [ 0.49510013-0.1470822j, -0.01120502-0.17412608j, 0.46249636-0.13189711j, 0.68665677+0.j ], [ 0.63428374+0.j, -0.30546444-0.4290185j, -0.51809432-0.00949413j, -0.22397728+0.04050999j]]) 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([ 10.39935693 +5.02977868e-17j, -1.22156554 -2.29527907e-16j, 0.51866717 -4.63347599e-16j, 0.30354143 +1.15221783e-16j]) >>> v matrix([[ 0.09186865-0.38603305j, 0.78317402+0.j, -0.42280692+0.13189711j, 0.17396786+0.05243788j], [ 0.30830780-0.28002101j, 0.27388174-0.06177703j, 0.55138541+0.j, -0.66486088-0.04050999j], [ 0.49510013-0.1470822j, -0.01120502-0.17412608j, 0.46249636-0.13189711j, 0.68665677+0.j ], [ 0.63428374+0.j, -0.30546444-0.4290185j, -0.51809432-0.00949413j, -0.22397728+0.04050999j]])
29
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()
30
Literatura 30 http://www.linuxtopia.org/online_books/programming_books/python_programming/
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.