Metody numeryczne Artur Wymysłowski, prof. PWr. Wrocław
Informacje ogólne Prowadzący: dr hab. inż. Artur Wymysłowski, prof. PWr. tel. 71 320 3327 email: artur.wymyslowski@pwr.edu.pl Materiały do wykładów i ćwiczeń są dostępne na stronie internetowej: http://wymyslowski.wemif.net Konsultacje: wtorek, godz.11-13, p.309, C-2 środa, godz.9-13, p.309, C-2 Wykład => 7 wykładów i test zaliczeniowy Laboratorium => 7 ćwiczeń laboratoryjnych i ocena jako średnia
Wykład Cel nauka podstaw metod numerycznych w zastosowaniach naukowych i inżynierskich nie jest nauka programowania, pomimo, że zajęcia będą prowadzona z wykorzystaniem języka programowania Python, a może właśnie dlatego! Zakres tematyczny: błędy metod numerycznych numeryczne metody całkowania i różniczkowania rozwiązywanie równań i układów równań liniowych i nieliniowych interpolacja, aproksymacja i ekstrapolacja równania różniczkowe projektowanie numeryczne: optymalizacja, planowanie eksperymentów, itp.
Ćwiczenia laboratoryjne Ćwiczenia laboratoryjne: realizowane w oparciu o system operacyjny Linux lub ewentualnie Windows programy pisane z wykorzystaniem języka programowania Python proponowane środowisko programistyczne to DrPython, Ninja, Geany (Linux) Zakres tematyczny: nauka języka Pythona IDE: DrPython, Geany lub Ninja przykłady i zastosowanie praktyczne metod numerycznych omówionych na wykładzie
Dlaczego metody numeryczne? Metody numeryczne są ściśle powiązane z rozwojem technik informatycznych, metod komputerowych i sprzętu komputerowego i są wykorzystywane w modelowaniu i symulacjach numerycznych Zastosowania w nauce: analiza i badanie problemów dla których brak rozwiązań analitycznych weryfikacja modeli teoretycznych... Zastosowania w inżynierii: analiza i przetwarzanie danych pomiarowych projektowanie numeryczne modelowanie i symulacje numeryczne automatyka i robotyka...
Dlaczego język Python? Możliwość tworzenia aplikacji z wykorzystaniem podstawowych paradygmatów programowania: programowanie strukturalne programowanie funkcyjne programowanie obiektowe Zalety języka: prosty i łatwy w nauce dynamiczne sprawdzanie typów danych zarządzania pamięcią z wykorzystaniem tzw. garbage collection bogaty zestaw bibliotek naukowych i inżynierskich Programowanie to przyjemność! dostępny za darmo wykorzystywany w systemie Linux do pisania skryptów na powłoki używany przez komputery jednopłytkowe oparte na Linuxie (np. RaspbberyPi, BananaPi, itp.) do programowania interfejsu GPIO Alternatywy: Matlab, Octave, WolframAlpha
GPIO GPIO - General purpose input/output: piny nie mają predefiniowanych zadań piny mogą być skonfigurowane jako wejście "input" lub wyjście "output" piny mogą być aktywowane lub dezaktywowane wartości wejściowe są odczytywane z wejścia (np. stan wysoki lub niski) wartości wyjściowe są podawane na wyjście wartości wejściowe można wykorzystać jako przerwania IRQs (np. zdarzenia wybudzające) Przykładowy kod programu w języku Python:
Octave Język programowania: ukierunkowany na zastosowania naukowe wbudowane funkcje rysowania wykresów i wizualizacji danych darmowy; wspierane systemy: Linux, macos i Windows kompatybilny z programem Matlab, np. skrypty Zastosowania: rozwiązywanie układu algebraicznych równań liniowych działania na wektorach i macierzach wizualizacja danych na wykresach 2D i 3D IDE
http://www.wolframalpha.com / WolframAlpha
Python Język programowania Python: opracowany w latach 90 przez holendra Guido van Rossumema następca języka ABC Założenia twórcy: języka interpretowany, interaktywny i skryptowy posiadający dynamiczny system typów danych automatycznie zarządzający pamięcią Uwagi: aktualnie Python jest rozwijany na zasadzie projektu Open Source i jest zarządzany przez Python Software Foundation, będącą organizacją non-profit przykładowe implementacje to standardowa CPython (pisany w C) oraz inne jak: Jython (pisany w Javie), IronPython (opracowany na platformę.net).
Materiały pomocnicze Książki: Python Books A Byte of Python Ukąś Pythona - tłumaczenie Dive Into Python Thinking in Python Strony internetowe: strona oficjalna: http://www.python.org/ dokumentacja: http://docs.python.org/ strona polska: http://pl.python.org/ podstawy: http://www.python.rk.edu.pl/
Podstawy Język interpretowany => analiza w trakcie Rozszerzenie programu *.py Program uruchamia się na maszynie wirtualnej => tak jak Java Program jest kompilowany do tzw. bytecode *.pyc
Rodzaje pracy - interaktywny W celu uruchomienia tzw. maszyny wirtualnej (interpretatora) języka Python w systemie Linux, należy uruchomić konsolę oraz wpisać słowo python Korzystając z interpretatora języka Python można pracować w sposób interaktywny
Rodzaje pracy - skryptowy Inny rodzaj pracy to uruchamianie wcześniej przygotowanych skryptów (np. umieszczonych w katalogu domowym) Standardowe rozszerzenie programów skryptowych w Pythonie to *.py
Rodzaje pracy - programowy Do pisania programów/skryptów korzysta się z IDE, np. DrPython, Geany, Ninja DrPython, Geany lub Ninja są edytorami prostymi i zostały opracowane z myślą o tworzeniu programów w sposób szybki, łatwy i przyjemny
Biblioteki naukowe i inżynierskie Typowe biblioteki Pythona wykorzystywane w zastosowaniach naukowych i inżynierskich: numpy - obsługa funkcji i macierzy => obiekt array scipy - obliczenia naukowe i inżynierskie => algorytmy matplotlib - wykresy 2D i 3D + inne np. obrazy wxpython - grafika z wykorzystaniem biblioteki wx PyQt - grafika z wykorzystaniem biblioteki Qt PyGame - tworzenie gier W celu skorzystania z wybranej biblioteki Pythona korzysta się z instrukcji import, np.: import numpy import numpy as np from numpy import *
Przykład zastosowania - numpy Obliczenia z wykorzystaniem macierzy => array lista - automatyczne rozpoznawanie typów - definicja listy: a=[1,2,3] - definicja tablicy: a=numpy.array([1,2,3]) a=range(10) b=range(10) c = [] for i in range(len(a)): c.append(a[i] + b[i]) macierz
Lista a tablica W jaki sposób komputer przechowuje dane: zmienne, tablice, listy, słowniki, itp. Tablica => rozmiar nie może się zmieniać w sposób dynamiczny i musi być zadeklarowany na początku Lista (jedno lub dwukierunkowa) => rozmiar może się zmieniać w sposób dynamiczny wskaźnik Matematyk Informatyk
Przykład zastosowania - scipy Biblioteka zorganizowana w postaci pakietów, które powinny być wczytywane oddzielnie
Przykład zastosowania - matplotlib Tworzenie wykresów funkcji
Paradygmaty programowania Programowanie strukturalne: programowania preferujące hierarchiczne dzielenie kodu na bloki, z jednym punktem wejścia i jednym lub wieloma punktami wyjścia nieużywanie instrukcji skoku (goto) oraz instrukcji typu break, continue, switch (z C) używanie instrukcji warunkowych (if, if...else), pętli (while, repeat), wyboru (case) Programowanie funkcyjne: programowania w którym funkcje należą do wartości podstawowych (często wywoływanych rekurencyjnie), a nie na wykonywaniu poleceń raz zdefiniowana funkcja zwraca zawsze tą samą wartość dla zadanych wartości argumentów tak, jak funkcje matematyczne Programowanie obiektowe: programowania w którym programy definiuje się za pomocą obiektów elementów łączących stan (dane/pola) i zachowanie (metody/procedury) programowanie obiektowe ma ułatwić pisanie, konserwację i wielokrotne użycie programów lub ich fragmentów
Funkcja a? 1 wartość y dla danego x np. 2 wartości y dla danego x
Równania vs. funkcje x2+y2=1
Przykład programowania - strukturalne wejście wyjście
Przykład programowania - funkcyjne
Przykład programowania - obiektowe
Uwagi - Python Możliwość pisania kodu z jednoczesnym wykorzystaniem różnych paradygmatów programowania Aktualnie korzysta się z kilku wersji Pythona, tj. 2 (stabilna 2.7) lub 3 (ostatnio wersja 3.6). Jednak ze względu na fakt, że wybrane biblioteki są kompilowane i stabilne pod określoną wersję, to proponuje się korzystanie do celów dydaktycznych z Pythona w wersji 2.7
Struktura programu Dane Algorytmy i metody Sterowanie (90%) Język programowania: składnia + semantyka
Typy danych - podstawowe Kategoria Typ None types.nonetype bool int Liczby Zbiory Posiada dwie wartości: True i False Liczby całkowite o rozmiarze 32 bitów Liczby całkowite o dowolnej długości - ograniczeniem jest dostępna pamięć float Liczby zmiennoprzecinkowe o długości 64 bitów => standard IEEE 754 set Zbiór nieuporządkowany unikalnych elementów, gdzie set => zmienny, frozenset => niezmienny frozenset list tuple Odwzorowania Obiekt pusty, który nie posiada żadnej wartości. Składnia to słowo None long str Sekwencje Opis dict Uporządkowany zbiór, indeksowany liczbami nieujemnymi. Sekwencje mogą zawierać dowolny obiekt Pythona. Przykładem sekwencji jest łańcuch znaków Składa się z dwóch grup obiektów: pierwszy to zbiór kluczy, które indeksują grupę drugą zawierającą zbiór wartości
Typy danych - uwagi Przestrzeń nazw (ang. namespace) => słowniki zawierające nazwy i wartości obiektów wewnątrz danej przestrzeni: globalnej lokalnej modułów klas Zasięg: program => globalne funkcja => lokalne Uwagi: wyświetlanie przestrzeni nazw: globals(), locals() instrukcja global wymusza przypisanie nazwy do globalnej przestrzeni nazw lokalna globalna
Operatory - podstawowe
Operatory - inne Bitowe A & B : iloczyn logiczny A B : suma logiczna A ^ B : bitowa różnica symetryczna ~A : negacja bitowa A<<B, A>>B : przesunięcie A o B pozycji w lewo lub prawo Podstawienia A = B : podstawia do zmiennej A referencję (położenie) do B A []= B : podstawia do zmiennej A referencję do A[]B, np. A+=1 => A=A+1 Logiczne: A==B : True jeżeli równe lub inaczej False A!=B lub A<>B : True jeżeli różne lub inaczej False A>B lub A>=B : True jeżeli większe (równe) lub inaczej False A<B lub A<=B : True jeżeli mniejsze (równe) lub inaczej False
Składnia + semantyka Język Python posiada wiele cech wspólnych z językami: C, Perl i Java Składnia jest zapożyczona z obiektowości, np. dowolne dane są obiektami i posiadają swoje metody, np. liczby, listy, itp.: lokalizacja: print id(obiekt) typ: print type(obiekt) wartość: print obiekt obiekt Stosowanie wcięć kodu brak nawiasów () {} cecha wyróżniająca wcięcia Inne: komentarze w kodzie programu => (#) cudzysłów do oznaczania łańcucha znaków => ('') lub (') instrukcje wielowierszowe => (\)
Instrukcje sterujące Instrukcje warunkowe: if else elif Pętle: while for (stosuje się do sekwencji, np. listy) Instrukcje przerwania: break continue s_old= Wydzial wemif
Funkcje Definicja funkcji: def funkcja(x,y):... return... definiuje się przy użyciu składni: def funkcja (parametry) parametry funkcji mogą mieć wartości domyślne def funkcja(x=1,y=2): Wywołanie funkcji... wywołuje się poprzez nazwę i podanie wartości parametrów: funkcja(1) wartości parametrów mogą być przekazywane przez nazwę: funkcja(parametr=1) parametry mogą być przekazywane jako krotka za pomocą (*) Wartości funkcji są zwracane za pomocą instrukcji return Funkcje w Pythonie są obiektami: można je przechowywać jako elementy listy można je przekazywać jako argument lub zwracać jako wartość
Funkcje wbudowane Moduł podstawowy, np.: obsługa list dostęp do plików itp.
Obiekty Python jest zbudowany wokół koncepcji obiektu Obiekty posiadają: tożsamość, typ, wartość, np. dane atrybuty => wartość metody => funkcje Uwagi: dostęp do atrybutów i metod realizuje się poprzez (.): obiekt.atrybut obiekt.metoda() specjalnym metodą jest metoda inicjalizująca obiekt: obiekt. init () specjalnym prefiksem jest słowo self, które stosujemy wewnątrz klasy aby odnieść się do atrybutów i metod tej klasy (J. C/C++ => this) self jest pierwszym argumentem we wszystkich metodach klasy => często pomijane class Klasa(obiekt): argumenty def init ():... def metody():...
Obsługa błędów Obsługa błędów polega na wykorzystaniu wyjątków: bloki zamknięte słowem try obsługiwane wewnątrz bloku except dodatkowo blok finally zamiast except => zawsze wykonany, niezależnie od tego czy wystąpi wyjątek Zgłaszanie wyjątków przez program raise : powoduje przerwanie kodu zgłoszenie wyjątku
Standardowe wejście i wyjście Wejście stdin: input() : linia z analizą raw_input() : linia bez analizy! Wyjście stdout: print : domyślne formatowanie print % : z formatowaniem %s - łańcuch %d - liczba całkowita %f - liczba zmiennoprzecinkowa
Moduły i biblioteki W celu skorzystania z wybranej biblioteki Pythona korzysta się z instrukcji import i from, np.: import numpy import numpy as np from numpy import * Przykład: Standardowe odwołania: >>> import numpy as np >>> import scipy as sp >>> import matplotlib as mpl >>> import matplotlib.pyplot as plt import numpy => a=numpy.array([1,2,3]) import numpy as np => a=np.array([1,2,3]) from numpy import * => a=array([1,2,3]) połączenie przestrzeni nazw: globalnej i modułu problemem może być nadpisywanie nazw
Python 2.* vs. 3.* funkcja: print 2.* => print a 3.* => print(a) funkcja: input 2.* => raw_input('a=') 3.* => input('a=') itp.
Przykład 2.7 vs. 3.4
Instalacja Linux (terminal): apt-get apt-get apt-get apt-get apt-get install install install install install python2.7 python-numpy python-scipy python-matplotlib drpython Windows: https://www.python.org/ anaconda miniconda itp.
Podsumowanie Zajęcia: cel => nauka metod numerycznych w celach naukowych i inżynierskich zajęcia prowadzone z wykorzystaniem języka programowania Python celem nie jest nauka programowania ale tworzenie i wykorzystanie algorytmów numerycznych Python: interpretowany ogólnego przeznaczenia wysokiego poziomu ukierunkowany na czytelność kodu źródłowego. różne paradygmaty programowania inne zalety i możliwości języka Python: praca na plikach wielowątkowość praca z bazami danych implementacja komunikacji internetowej i programowanie usług sieciowych obsługa portów i przerwań itp. komputery jednopłytkowe
Dziękuję za uwagę