SciLab 2016 Tomasz Łukaszewski Politechnika Poznańska Instytut Informatyki Literatura A. Brozi, Scilab w przykładach, Nakom 2007 W. Treichelt i M.Stachurski, Matlab dla studentów, Witkom 2009 2 1
Wprowadzenie 3 Zmienne Nazwy: dozwolone nazwy zawierają znaki: od a do z, od A do Z, od 0 do 9 oraz _, #,!, $,? Operator przypisania wartości zmiennej = Przykład x=2 napis= Hello 4 2
Operatory Operatory logiczne & (and), (or), ~ (not), == (operator równoważności) Operatory na łańcuchach <lancuch> + <lancuch> (połączenie) Operatory zakresu indeksów <start> : <stop> (zakres ze zmianą równą1) <start> : <krok zmiany> : <stop> Przykład hello + world 3:7 3:2:7 Zadanie 1: wypisz liczby całkowite od 10 do 1 malejąco 5 Macierze Definiowanie przez wprowadzenie z linii poleceń: [ oraz ] oznacza początek i koniec macierzy, oddziela elementy w wierszu ; oddziela wiersze : definiowanie zakresu Przykład a = [1,2,3] // wektor wierszowy b = [4 ; 5 ; 6] // wektor kolumnowy c = [1,2; 3,4; 5,6] // macierz 3 wiersze 2 kolumny d = [1:10] // wektor wartości od 1 do 10 e = 1:10 // wektor wartości od 1 do 10!! f = [d ; e] f = [1:10;1:10] 6 3
Macierze Odwołanie się do elementów : ( oraz ) pozwala odwołać się do elementów, podając w nawiasach numer wiersza i kolumny oddzielony, : interpretowany jako cały zakres zmienności $ indeks ostatniego elementu Przykład c(2,1) // 2-gi wiersz i 1-a kolumna c(1:2,1:2) // podmacierz c(1,:) // elementy 1-go wiersza c(:,1) // elementy 1-ej kolumny c($,$) // prawy dolny element Zadanie 2: wypisz 2 pierwsze elementy macierzy c Zadanie 3: wypisz 3 ostatnie elementy macierzy c Zadanie 4: wypisz wszystkie elementy macierzy c 7 Macierze Odwołanie się do elementów : wybieranie elementów za pomocą macierzy wartości logicznych Przykład a=[1:5] b=sin(a) c=b>0 b(c) a(c) // macierz wartości logicznych // wybieranie // wybieranie Zadanie 5: z macierzy o wartościach całkowitych wybierz wartości większe od 7 8 4
Macierze cd. Funkcje równomiernie zapełniające zakres linspace(a,b) liniowo od a do b (100 elementow) linspace(a,b,c) liniowo od a do b (c elementow) logspace(a,b) logarytmicznie j.w. Przykład linspace(1,100) linspace(1,100,10) //domyslnie 100 elementow //10 elementow g = logspace(1,3,3) log10(g) 9 Macierze cd. Funkcje tworzące macierze specjalne ones() macierz zawierająca 1 zeros() macierz zawierająca 0 eye() macierz jednostkowa rand() macierz losowa Przykład ones(3,2) // macierz 3x2 zeros(2,3) // macierz 2x3 eye(4,4) // macierz 4x4 rand(2,3) // macierz 2x3 10 5
Macierze cd. Funkcje tworzące macierze specjalne diag() utworzenie macierzy diagonalnej z elementów wektora lub wydobycie przekątnej z istniejącej macierzy Przykład h=[1:3] diag(h) // utworzenie macierzy diagonalnej h=rand(3,3) diag(h) // wydobycie przekątnej z macierzy 11 Macierze Operacje: operator transpozycji macierzy A + B dodanie dwóch macierzy +, -, *, / - dzielenie to mnożenie przez odwrotność!!!.*,./ - operacje na elementach macierzy Przykład A=[1,2,3] B=[4;5;6] A+A A+B // ERROR!!! A+B A+3 A B 12 6
Macierze Przykład A * B // mnożenie w sensie Cauchy ego B * A // mnożenie w sensie Cauchy ego A * B // ERROR!!! A.* B // mnożenie element przez element A * 3 A B 13 Macierze Operacje (uwaga: zdefiniuj wpierw macierze) A + B = B + A // przemienność A + (B+C) = (A + B)+C // łączność I*A = A * I = A A * (B *C) = (A * B)*C // łączność A*B = B*A = I // B macierz odwrotna! Macierz osobliwa to macierz nie posiadająca macierzy odwrotnej, np. A = [1,2; 1,2] Zadania sprawdź powyższe zależności 14 7
Rozwiązywanie układów równań a * x = b -> a -1 * a * x = a -1 * b Uwaga: w Scilabie możemy zapisać x = a\b!!! Zadanie (rozwiązanie : x1 = 1, x2 = 2) x1 + 2x2 = 5 2x1 + x2 = 4 Program a=[1,2;2,1] b=[5;4] x=a^-1 * b x=a\b 15 Rozwiązywanie układów równań Zadanie x1+2x2 + 3x3 = 3 -x1-5x2 + 8x3 = 5 4x1 + 9x3 = 7 16 8
Proste wykresy Operacje: plot2d(matrix) matrix to wektor Nx1 lub 1xN (lub N x K) Program A=(0:0.1:6.28) B=sin(A) plot2d(b) 17 Proste wykresy Operacje: plot2d(x,y) wymaga wektorów kolumnowych! UWAGA na apostrof przy kopiowaniu ze slajdów Program x=[0:0.1:6.28] y=sin(x) plot2d(x,y) 18 9
Proste wykresy Program x=[0:0.1:6.28] y=sin(x) y2=cos(x) plot2d(x,[y,y2],leg= sin@cos,style=[2,3]) xtitle( sin i cos, x, y ) 19 Proste wykresy Operacje: plot3d(x,y,z) Program x=linspace(0, 6.28,11) y=x z= cos(x) *cos(x) plot3d(x,y,z) 20 10
Proste wykresy Zadanie: narysuj wykres funkcji f(x,y) = x 2 +y 2 x i y zmieniają się od -3 do 3 21 Proste wykresy Program: x=linspace(-3, 3,50) y=linspace(-3, 3, 50) xx=x' * ones(y) yy=ones(x)'*y z= (xx.*xx)+(yy.*yy) plot3d(x,y,z) 22 11
Proste wykresy Operacje: param3d(x,y,z) wykres trajektorii Program t=linspace(0,4*%pi,101) x=2*cos(t) y=2*sin(t) z=4*t xset("thickness",3) param3d(x,y,z) xset("thickness",1) param3d(x,y,zeros(z)) 23 Funkcje Program cz. 1 function y = kwadrat (x) y = x * x endfunction function z = kwadrat2 (x1,x2) z = x1^2 + x2^2 endfunction 24 12
Wykresy 2D Operacje: plot(x,y) Program cz. 2 x=linspace(1,10,50) plot(x,kwadrat) 25 Wykres konturowy Operacje: contour(x,y,z,nz) x (y) - wektor wartości o rozmiarze n1 (n2) z macierz wartości o rozmiarze n1 * n2 nz liczba poziomów Program cz. 3 x=linspace(-1,1,100) y=linspace(-1,1,100) contour(x,y,kwadrat2,10) 26 13
Obliczanie PI metodą Monte Carlo Metoda Monte Carlo opiera się na prawie wielkich liczb, zgodnie z którym stosunek liczby zdarzeń spełniających zadane kryteria do całkowitej liczby zdarzeń jest równy prawdopodobieństwu spełnienia tych kryteriów. Wystawiamy na deszcz kwadratową tarczę, w którą wpisano okrąg. Zakładając, że krople deszczu padają równomiernie to prawdopodobieństwo trafienia kropli w koło ograniczone okręgiem będzie równe ilorazowi pola powierzchni koła i pola całej tarczy. 27 Obliczanie PI metodą Monte Carlo 28 14
Obliczanie PI metodą Monte Carlo Realizacja Utworzymy 2 wektory liczb losowych współrzędne punktów upadku kropel Sprawdzimy, które z nich trafiły w koło i utworzymy wektor wartości logicznych Policzymy ile wartości prawdziwych znajduje się w tym wektorze, podzielimy przez długość wektora i pomnożymy przez 4 będzie to przybliżenie wartości PI. Założymy, że r = 1 29 Obliczanie PI metodą Monte Carlo Program (bez wykresu) liczba=1000 x=-1 + 2*rand(1,liczba) y=-1 + 2*rand(1,liczba) Nkolo=sum((x.^2+y.^2)<1) PI=4*Nkolo/liczba 30 15
Obliczanie PI metodą Monte Carlo Wykorzystamy pętlę for w celu zwiększania liczby kropel i obserwacji wyniku Konstrukcja for i = 1:10 do polecenia end 31 Obliczanie PI metodą Monte Carlo Program clear// usunięcie zmiennych xdel(winsid()) //zamkniecie okien rand('seed',.123456) // inicjalizacja generatora liczba_prob=100 // liczba prob liczba_elem=1000 // liczba el. wektora // inicjalizacja trafienia=0 wartosc_pi=zeros(liczba_prob) // wektor kolumnowy for k=1:liczba_prob x=-1 + 2*rand(1,liczba_elem) y=-1 + 2*rand(1,liczba_elem) trafienia=trafienia+sum((x.^2+y.^2)<1) wartosc_pi(k)=4*trafienia/(k*liczba_elem) end pi_odn =%pi*ones(wartosc_pi) plot2d([1:liczba_prob]*liczba_elem,wartosc_pi,style=5) plot2d([1:liczba_prob]*liczba_elem,pi_odn,style=2) 32 16
Obliczanie PI metodą Monte Carlo 33 Obliczanie PI metodą Monte Carlo 34 17
Metoda Monte Carlo Pod koniec wojny trwają prace nad pierwszym elektronicznym komputerem ENIAC Pomysłodawcy Eniaca zwracają się z propozycją przetestowania tej maszyny przez Ballistics Research Laboratory w Aberdeen Konsultantem BRL w Aberdeen był profesor John von Neumann, który był także konsultantem dla Los Alamos w którym były prowadzone prace związane z problematyką termonekluarną. Zaproponował on zespołowi z Los Alamos budowę modelu reakcji termonekluarnej, który możnaby rozwiązać korzystając z ENIAC a. Marzec 1945 rozpoczęcie współpracy naukowców z Los Alamos i twórców ENIAC a. Wiosna 1946 do zespołu dołącza Stanisław Ulam, który dostrzegł możliwość wykorzystania ENIACa do rozwiązywania problemów metodą statystycznego próbkowania. 35 Metoda Monte Carlo Idea zaproponowanej metody była zbieżna z zainteresowaniami S. Ulama związanymi z procesami losowymi. Prowadzone badania były stymulowane jego doświadczeniem w grę pokera, czy też poszukiwaniem wolnego miejsca ma zatłoczonym parkingu. Stworzył koncepcję szczęśliwych liczb przypominających liczby pierwsze. Był zainteresowany rozwijaniem wzorców w przestrzeni dwuwymiarowej zgodnie z pewnymi prostymi regułami dziś koncepcja znana jest pod nazwą automatów komórkowych. Nazwę Monte Carlo zaproponował współtwórca metody N.Metropolis (i podobno nazwa metody nie miała nic wspólnego z faktem, że wujek S. Ulama zebrał od rodziny pieniądze i pojechał do Monte Carlo) 36 18
Funkcja ODE Funkcja ODE pozwala rozwiązywać równania różniczkowe pierwszego rzędu zapisanych w postaci: dx/dt = f(t,x) Wywołanie funkcji ode wynik = ode(x0,t0,t,f) gdzie wynik rozwiązanie x0 położenie początkowe t0 moment początkowy t wektor wierszowy f nazwa funkcji określającej równanie różniczkowe 37 Funkcja ODE Równanie prędkości: dx/dt = v Program function z = f(t, x) z = v endfunction v = 1; x0 = 0; t0 = 0; tk = 10; t = t0:0.1:tk; x = ode (x0,t0,t,f); plot2d(t,x); 38 19
Funkcja ODE Równanie logistyczne: dn/dt = rn(1-n/k) Program function z = f(t, N) z = r*n*(1-n/k) endfunction r = 1; K=150; N0 = 10; t0 =0; tk=10; t = t0:0.1:tk; N = ode (N0,t0,t,f); plot2d(t,n); 39 Funkcja ODE Model Lotki-Volterra: dx/dt = ax bxy dy/dt = cxy dy x(t) liczebność ofiar w czasie t y(t) liczebność drapieżników w czasie t a współczynnik przyrostu ofiar b współczynnik umierania ofiar na skutek drapieżnictwa c współczynnik przyrostu drapieżników d współczynnik umierania drapieżników 40 20
Funkcja ODE Model Lotki-Volterra: Program cz. 1 function [w] = f(t,y) w(1) = a*y(1)-b*y(1)*y(2); w(2) = c*y(1)*y(2)-d*y(2); endfunction 41 Funkcja ODE Model Lotki-Volterra: Program cz. 2 a = 1; b = 1; d = 10; c = 1; t0 = 0; y0 = [10.0;5.0]; // wartości początkowe obu populacji t = [0:0.1:10]; // obliczenia od 0 do 10 co 0.1 jednostki y = ode(y0, t0, t, f); y1 = y(1,:); y2 = y(2,:); plot2d(t,y1,style=3); plot2d(t,y2,style=5); 42 21
Optymalizacja Programowanie liniowe (linpro) Zadanie min z = 3x1 + 5x2 2x3 x1 + 3x2 = 5 x1 + x2 x3 = 2 2x1 x2 <= 3 x1 + x2 + x3 <=25 0 <= x1 <= 5, 0 <= x2 <= 5, 0 <= x3 <= 3 43 Optymalizacja Program p=[3;5;-2] C=[1,3,0;1,1,-1;2,-1,0;1,1,1]; b=[5;2;3;25] xl=[0;0;0] xu=[5;10;3] [xopt,lagr,fopt]=linpro(p,c,b,xl,xu,2) // 2 ograniczenia równościowe!!! UWAGA wymaga zainstalowania Quapro poleceniem atomsinstall("quapro") oraz ponownego uruchomienia Scilaba 44 22
Optymalizacja Zadanie Sprawdź dla poprzedniego zadania, jakie są rozwiązania, gdy liczba ograniczeń równościowych zmienia się od 0 do 4 45 Optymalizacja Programowanie kwadratowe (quapro) Zadanie min z = x1 2 +x1x2+3x1+5x2-2x3 x1 + 3x2 = 5 x1 + x2 x3 = 2 2x1 x2 <= 3 x1 + x2 + x3 <=25 0 <= x1 <= 5, 0 <= x2 <= 5, 0 <= x3 <= 3 46 23
Optymalizacja Program Q=[2,1,0;1,0,0;0,0,0] p=[3;5;-2] C=[1,3,0;1,1,-1;2,-1,0;1,1,1]; b=[5;2;3;25] xl=[0;0;0] xu=[5;10;3] [xopt,lagr,fopt]=quapro(q,p,c,b,xl,xu,2) // 2 ogr. równościowe UWAGA macierz Q musi być symetryczna i pozytywnie określona 47 Optymalizacja Zadanie Napisz program dla funkcji celu postaci: min z = x1 2 +2x1x2+3x1+5x2-2x3 48 24
Optymalizacja Programowanie nieliniowe (optim) Zadanie min z = sin(x1*x2) + cos(x1) 0 <= x1 <= 10, 0 <= x2 <= 10 49 Optymalizacja Programowanie nieliniowe (optim) Wymagane jest zdefiniowanie funkcji kosztu (np. o nazwie costf), która ma następujące wywołanie function[f, g, ind] = costf(x, ind) x to aktualne rozwiązanie, ind to flaga f to minimalizowana funkcja g to gradient funkcji 50 25
Optymalizacja Programowanie nieliniowe (optim) Wywołanie funkcji optim(costf,'b',[0;0],[10;10],[1;1]) Costf b oznacza że są aktywne ograniczenia dolne i górne ograniczenia punkt startowy domyślnie stosowana metoda quasi-newtona z BFGS 51 Optymalizacja 52 26
Optymalizacja Program function [f,g,ind]=costf(x,ind) f = sin(x(1)*x(2))+cos(x(1)) g = [0;0] g(1)= x(2)*cos(x(1)*x(2))-sin(x(1)) g(2)= x(1)*cos(x(1)*x(2)) endfunction [fopt,xopt]=optim(costf,'b',[0;0],[10;10],[1;1]) 53 Optymalizacja Zadanie Przeanalizuj działanie programu podanego w pomocy Scilaba dla funkcji optim, znajdującego minimum dla funkcji Rosenbrocka 54 27