SciLab 2016 Tomasz Łukaszewski Wprowadzenie Politechnika Poznańska Instytut Informatyki 2 Zmienne Operatory Nazwy: dozwolone nazwy zawierają znaki: od a do z, od A do Z, od 0 do 9 oraz _, #,!, $,? Przypisanie wartości zmiennej (operator) = x=2 Napis= Hello 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> hello + world 3:7 3:2:7 Zadanie 1: wypisz liczby całkowite od 10 do 1 malejąco 3 4 Definiowanie przez wprowadzenie z linii poleceń: [ oraz ] oznacza początek i koniec macierzy, oddziela elementy w wierszu ; oddziela wiersze : definiowanie zakresu 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] % ERROR!!! Trzeba sklejać wiersze jak powyżej 5 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 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 6 1
cd. Odwołanie się do elementów : wybieranie elementów za pomocą macierzy wartości logicznych 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 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. linspace(1,100) % domyslnie 100 elementow linspace(1,100,10) % 10 elementow g = logspace(1,3,3) % log10(g) 7 8 cd. cd. Funkcje tworzące macierze specjalne ones() macierz zawierająca 1 zeros() macierz zawierająca 0 eye() macierz jednostkowa rand() macierz losowa ones(3,2) % macierz 3x2 zeros(2,3) % macierz 2x3 eye(4,4) % macierz 4x4 rand(2,3) % macierz 2x3 Funkcje tworzące macierze specjalne diag() utworzenie macierzy diagonalnej z elementów wektora lub wydobycie przekątnej z istniejącej macierzy h=[1:3] diag(h) h=rand(3,3) diag(h) %utworzenie macierzy diagonalnej %wydobycie przekątnej z macierzy 9 10 operator transpozycji macierzy A + B dodanie dwóch macierzy +, -, *, / - dzielenie to mnożenie przez odwrotność!!!.*,./ - operacje na elementach macierzy A A=[1,2,3] B=[4;5;6] A+A B A+B % ERROR!!! A+B A+3 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 11 12 2
Rozwiązywanie układów równań 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 13 a * x = b -> a -1 * a * x = a -1 * b Uwaga: w Scilabiemożemy zapisać x = a\b!!! (x1 = 1, x2 = 2) x1 + 2x2 = 5 2x1 + x2 = 4 a=[1,2;2,1] b=[5;4] x=a^-1 * b x=a\b 14 Rozwiązywanie układów równań Zadanie x1+2x2 + 3x3 = 3 -x1-5x2 + 8x3 = 5 4x1 + 9x3 = 7 plot2d(matrix) matrix to wektor Nx1 lub 1xN (lub N x K) A=(0:0.1:6.28) B=sin(A) plot2d(b) 15 16 plot2d(x,y) wymaga wektorów kolumnowych! UWAGA na apostrof przy kopiowaniu ze slajdów x=[0:0.1:6.28] y=sin(x) plot2d(x,y) 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 ) 17 18 3
plot3d(x,y,z) x=linspace(0, 6.28,11) y=x z= cos(x) *cos(x) plot3d(x,y,z) Zadanie: narysuj wykres funkcji f(x,y) = x 2 +y 2 x i y zmieniają się od -3 do 3 19 20 Rozwiązanie: 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) param3d(x,y,z) wykres trajektorii 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)) 21 22 Funkcje Wykresy 2D function y = kwadrat (x) y = x * x function z = kwadrat2 (x1,x2) z = x1^2 + x2^2 plot(x,y) x=linspace(1,10,50) plot(x,kwadrat) 23 24 4
Wykres konturowy 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 x=linspace(-1,1,100) y=linspace(-1,1,100) contour(x,y,kwadrat2,10) 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. 25 26 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 27 28 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 Wykorzystamy pętlę for w celu zwiększania liczby kropel i obserwacji wyniku Konstrukcja for i = 1:10 do polecenia end 29 30 5
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) 31 32 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 33 34 Równanie prędkości: Równanie logistyczne: dx/dt = v dn/dt = rn(1-n/k) function z = f(t, x) function z = f(t, N) z = v z = r*n*(1-n/k) r = 1; v = 1; K=150; x0 = 0; N0 = 10; t0 = 0; t0 =0; tk = 10; tk=10; t = t0:0.1:tk; t = t0:0.1:tk; x = ode (x0,t0,t,f); plot2d(t,x); 35 N = ode (N0,t0,t,f); plot2d(t,n); 36 6
Model Lotki-Volterra: dx/dt = ax bxy dy/dt = cxy dy Model Lotki-Volterra: 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 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); 37 38 Model Lotki-Volterra: 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); 39 7