Tematy: uruchamianie | tablice | krzywe płaskie | programowanie | wykresy trójwymiarowe
Program Scilab
jest darmowy. Można go pobrać ze strony https://www.scilab.org/download/scilab-6.1.1.
Aby uruchomić program wyszukujemy ikonę na pulpicie lub odpowiednią pozycję w menu programów. Pojawi się okno interfejsu graficznego:
W tym oknie możemy, za znakiem zachęty wpisywać polecenia.SciNotes
.
Polecenia można wpisywać na dwa sposoby:
zm = polecenie
, np. $x=34/55$polecenie
, np $34/55$W obu przypadkach polecenie zostanie wykonane, wynik polecenia zostanie wypisany na ekran (jeżeli nie zakończymy polecenia średnikiem) i zapamiętany: w pierwszym przypadku zostanie
zapamiętany w zmiennej o nazwie zm
, w drugim w zawsze istniejącej zmiennej o nazwie ans
.
Przykład:
x = 12/13 ⇒ 0.9230769 y = 13/14; ⇒ nic się nie pojawi z powodu średnika na końcu 14/15 ⇒ 0.9333333 x + y + ans ⇒ 2.7849817
Nie każde polecenie ma jakiś wynik – zwraca jakąś wartość. Na przykład polecenie wyświetlające disp
niczego nie zwraca:
s = disp("Witaj świecie!") ⇒ Witaj świecie! s ⇒ !--error 4 Niezdefiniowana zmienna: s
W programie Scilab
działa się właściwie na tablicach liczb o rozmiarze $w\times k$, $w$ jest ilością wierszy, $k$ ilością kolumn. Ważny przypadek szczególny, to tablica o rozmiarze $1\times 1$,
utożsamiana z jedyną znajdującą się w niej liczbą.
Konsekwencją takiego podejścia jest ogromna ilość poleceń tworzących tablice.
A = [1 2 3;4 5 6] ⇒ 1 2 3 4 5 6
A = a:b A = 5.2:9.5 ⇒ 5.2 6.2 7.2 8.2 9.2
A = a:r:b A = 5.2:0.7:9.5 ⇒ 5.2 5.9 6.6 7.3 8. 8.7
A = linspace(a,b,n) A = linspace(0,%pi,5) ⇒ 0. 0.7853982 1.5707963 2.3561945 3.1415927
A = zeros(w,k) B = ones(w,k) C = rand(w,k)
Opisane wyżej sposoby można łączyć:
E = 1:100 ⇒ 1 2 3 ... 100 F = 101:200 ⇒ 101 102 103 ... 200 A = [E;F] ⇒ 1 2 3 ... 100 101 102 103 ... 200
Często potrzebne są tablice jednokolumnowe, wygodnym narzędziem do ich tworzenia jest operator transpozycji $'$ (apostrof), który zamienia wiersze na kolumny, a kolumny na wiersze.
w = linspace(0,1,101) ⇒ 0. 0.01 0.02 0.03 ... 0.98 0.99 1. v = w' ⇒ 0. 0.01 0.02 0.03 ...
Utwórz tablicę dwuwymiarową o rozmiarze $100\times 2$, która w pierwszej kolumnie zawiera same zera, a w drugiej same jedynki.
Jeżeli $f$ jest funkcją jednej zmiennej liczbowej (np. $f(x)=\sin(x)$), a $A$ jest tablicą liczb rozmiaru $w\times k$, to polecenie
B = f(x)
A = 0:30:90 ⇒ 0. 30. 60. 90. C = [A;sind(A);sin(A)] ⇒ 0. 30. 60. 90. 0. 0.5 0.8660254 1. 0. - 0.9880316 - 0.3048106 0.8939967
W Scilabie są dwie funkcje sinus, funkcja $\sin$ oczekująca argumentu w radianach i funkcja $\text{sind}$ oczekująca argumentu w stopniach (degree). Analogicznie, istnieją dwie funkcje cosinus $\cos$ i $\text{cosd}$, dwie funkcje tangens $\tan$ i $\text{tand}$ oraz dwie funkcje cotangens $\cot$ i $\text{cotd}$.
Analogicznie zachowują się operatory arymetyczne i operator potęgowania.
A = linspace(0,10,6) ⇒ 0. 2. 4. 6. 8. 10. A + 5 ⇒ 5. 7. 9. 11. 13. 15. A.^0.5 ⇒ 0. 1.4142136 2. 2.4494897 2.8284271 3.1622777
A^0.5
(bez kropki za symbolem tablicy).
Operatory arytmetyczne i operator potęgowania można zastosować również do dwóch tablic. Obie tablicy muszą mieć taki sam rozmiar, działania wykonywane są wyraz po wyrazie.
A = 1:4 ⇒ 1. 2. 3. 4. B = 2:5 ⇒ 2. 3. 4. 5. A+B ⇒ 3. 5. 7. 9. A.^B ⇒ 1. 8. 81. 1024. A.*B ⇒ 2. 6. 12. 20.
Operatory potęgowania, mnożenia i dzielenia trzeba pisać z kropką (A.*B
) – istnieją – ważne w algebrze liniowej – operatory mnożenia i dzielenia bez kropki.
Działaja zupełnie inaczej i wymagają innych zależności między rozmiarami tablic.
A*B ⇒ !--error 10 Niezgodne mnożenie.
Istnieją też funkcje, które działają na całej tablicy, a nie na poszczególnych jej wyrazach.
max(A)
zwraca największą liczbę w tablicymin(A)
zwraca najmniejszą liczbę w tablicysum(A)
zwraca sumę liczb w tablicyprod(A)
zwraca iloczyn liczb w tablicylength(A)
zwraca ilość liczb w tablicyUtwórz tablicę rozmiaru $5\times 4$ zawierajacą losowe liczby całkowite z przedziału $[0;\,9]$. Oblicz wartość średnią liczb w tablicy.
Wskazówka, przydatna będzie funkcja $\text{floor}(x)$ zaokrąglająca w dół.
Rozwiązywanie układów równań liniowych. Układ równań
możemy za pomocą macierzy (tablicy) $A$ rozmiaru $n\times n$ oraz wektorów jednokolumnowych $x$ i $b$A = [1 1 1;1 1 -1;1 -1 -1] b = [6 0 -4]' x = (A\b)' ⇒ 1. 2. 3.
Obliczanie pierwiastków wielomianu. W programie Scilab
wielomiany tworzymy poleceniem poly(A,zm,[flaga])
, gdzie $A$ jest jednowierszową tablicą liczb, $zm$ jest symbolem zmiennej, nieobowiązkowy parametr
$flaga$ decyduje czy liczby z wektora $A$ są współczynnikami wielomianu (flaga='c'
), czy pierwiastkami (flaga='r'
). Domyślnie są pierwiastkami. Do obliczenia pierwiastków wielomianu $w$ służy polecenie
roots(w)
.
A = 1:5 ⇒ 1. 2. 3. 4. 5. w = 0.5*poly(A,'y','c') ⇒ 0.5 + y + 1.5y2 + 2y3 + 2.5y4 roots(w) ⇒ 0.1378323 + 0.6781544i 0.1378323 - 0.6781544i - 0.5378323 + 0.3582847i - 0.5378323 - 0.3582847i
Sporządzanie wykresów funkcji jednej zmiennej. Wykres rysujemy poleceniem plot2d(wektor_x,wektor_y)
, wektor_x
i wektor_y
muszą być wektorami tej samej długości. Wykres funkcji $y=\sin(x^2)$ na przedziale
$[0;\,2\cdot\pi]$ uzyskujemy tak:
x = linspace(0,2*%pi,201); y = sin(x.*x); plot2d(x,y)
plot2d
dostaje tylko ciąg punktów, nie dostaje informacji jak ten ten ciąg powstał, nie może zatem opisać wykresu. O opisanie wykresu musi zadbać użytkownik programu.
Do umieszczania napisów w oknach graficznych (do opisywania rysunków) służy polecenie xstring(x,y,tekst)
. Liczby $x$ i $y$, to współrzędne lewego dolnego rogu napisu, tekst
może zawierać wzory
matematyczne w formacie LaTeXa. Podczas wpisywania wzoru, w konsoli Scilaba pojawia się podgląd przetworzonego wzoru: .
Wykres funkcji $y=\sin(x^2)$ uzupełniony o powyższy napis wygląda tak:
Kolejne polecenia plot2d
rysują w tym samym oknie. Dopasowują jednocześnie skalowanie osi do wszystkich krzywych. Wykres funkcji $y=\sin(x^2)$ uzupełniony poleceniami
y2 = exp(x); plot2d(x,y2)
Domyślne zachowanie programu możemy zmienić poleceniem set("własność",nowa_wartość)
.
Kilka przydatnych wersji polecenia set
:
set("auto clear","on")
– kolejne polecenie rysowania usuwa dotychczasowe krzyweset("window",nr)
– kolejne polecenie rysowania rysuje w oknie o podanym numerze $nr$, domyślnie rysowanie odbywa się w oknie o numerze $0$set("thickness",nr)
– zmienia grubość liniiset("default")
– przywraca ustawienia domyślnePolecenie subplot(w,k,which)
dzieli (wirtualnie) okno graficzne na $w\cdot k$ równych części, $w$ to ilość wierszy, $k$ ilość kolumn.
Parametr $1\le which\le w\cdot k$ wskazuje, w której części chcemy rysować.
x = linspace(0,2*%pi,301); y = sin(x.*x); subplot(2,2,1) plot2d(x,y) subplot(2,2,2) plot2d(x,y) subplot(2,1,2) plot2d(x,y) ⇒
Wszystkie dotychczasowe rysunki były wykresami funkcji $y=f(x)$. Wynikało to ze sposobu przygotowania danych dla polecenia plot2d(x,y)
– wektor $x$ tworzony poleceniem linspace(...)
jest rosnący.
Możliwe są też inne rysunki.
Krzywa parametryczna, tzn. krzywa opisana równaniami $\begin{cases}x=f(t)\\y=g(t)\end{cases}$.
Przykład krzywej parametrycznej (kardioida):
t = linspace(0,2*%pi,301); x = sin(t).*(1+cos(t)); y = 2-cos(t).*(1+cos(t)); plot2d(x,y) xtitle("$Kardioida \begin{cases}x=\sin(t)\cdot (1+\cos(t))\\y=2-\cos(t)\cdot(1+\cos(t))\end{cases}$") ⇒
xtitle("tytuł")
wyświetla tytuł nad rysunkiem i jak widać, akceptuje składnię LaTeXa.
W rzeczywistości, polecenie plot2d(x,y)
rysuje łamaną: zaznacza opisane w wektorach $x$ i $y$ punkty i łączy je odcinkami. Jeśli punktów jest dużo, to segmenty łamanej są krótkie i widzimy ją w postaci krzywej.
Narysujemy teraz łamaną, która ma tylko sześć punktów, szósty punkt jest identyczny z pierwszym.
t = linspace(0,2*%pi,6); y = cos(t); x = sin(t); plot2d(x,y) xtitle("Pięciokąt foremny") ⇒
Do rysowania łamanych często wykorzystywane jest polecenie plot2d4(x,y)
, polecenie to, opisane wektorami $x$ i $y$ punkty łączy strzałkami. Wykorzystam wektory $t$, $x$ i $y$ z poprzedniego przykładu do
narysowania grafu skierowanego.
plot2d4(x,y) plot2d4([0 x(1)],[0 y(1)]) plot2d4([x(3) 0],[y(3) 0]) plot2d4([x(4) 0],[y(4) 0]) xtitle("Graf skierowany") ⇒
x(p:k)
oznacza podciąg wektora $x$ zaczynający się na miejscu $p$, a kończący
na miejscu $k$.a = 1:6 ⇒ 1. 2. 3. 4. 5. 6. a(3) ⇒ 3. a(2:4) ⇒ 2. 3. 4.
Narysuj pentagram. Pentagram można otrzymać z wierzchołków pięciokąta foremnego, łącząc co drugi wierzchołek.
Podobieństwo pięciu instrukcji rysujących z powyższego zadania sugeruje, że życie byłoby prostsze gdybyśmy mieli do dyspozycji pętle.
Skrypty (programy) najwygodniej jest pisać w edytorze SciNotes
, jest on dostępny z głównego menu Narzędzia ⇒ SciNotes
. Wpisanego skryptu nie można uruchomić przed zapisaniem na dysk.
Wykonaj
lub (bez pośrednictwa edytora SciNotes
) wybierając w menu Plik ⇒ Otwórz plik
.
Wszystkie polecenia, których możemy użyć w skrypcie, możemy też wpisać na konsoli. Podstawowe zalety skryptów:
Pętla for
, podstawowa forma wygląda tak ($i$ jest zmienną sterującą pętli, $w$ wektorem):
for i = w instrukcja 1; ... end
suma = 0 odw = 0 for i = 1:2:100 suma = suma + i; odw = odw + 1/i; end
t = linspace(0,2*%pi,201); x = cos(t); y = sin(t); plot2d(x,y) ⇒ mniejszy okrąg plot2d(2*x,2*y) ⇒ mniejszy okrąg t = linspace(0,2*%pi,13); x = cos(t); y = sin(t); for i = 1:12 plot2d4([x(i) 2*x(i)],[y(i) 2*y(i)]) ⇒ strzałki "odśrodkowe" plot2d4([2*x(i) x(i)],[2*y(i) y(i)]) ⇒ strzałki "dośrodkowe" end
Pętla while
, podstawowa forma wygląda tak:
while(warunek) instrukcja 1; ... end
x = 1 while(x <= a) x = 2*x; end
Instrukcje sterujące umożliwiają „rozwidlenie” skryptu (programu), jeśli spełnione są pewne warunki, to skrypt wykonuje pewien zestaw instrukcji, jeśli nie są spełnione, to wykonuje inny zestaw. Wybór drogi, którą podąży skrypt zależy często od decyzji użytkownika.
Instrukcje umożliwiające interakcję skryptu z użytkownikiem, to:
disp(message)
– wyświetla message
disp("Program robiący to i owo")
zm = input(prompt)
– wyświetla prompt
, czeka na wpisanie czegoś (i naciśnięcie Enter), zapamiętuje w zmiennej zm
co wpisał użytkownikl = input("wpisz coś "); ⇐ 99 disp(l) ⇒ 99.
Instrukcja if-elseif-else
. Ma ona trzy odmiany:
x = input("wpisz liczbę "); if (x>5) disp("wpisałeś liczbę większą niż 5") end
x = input("wpisz liczbę "); if (x>5) disp("wpisałaś liczbę większą niż 5") else disp("nie wpisałaś liczby większej niż 5") end
x = input("wpisz liczbę "); if (x>5) disp("wpisałeś liczbę większą niż 5") elseif(x>3) disp("wpisałeś liczbę z przedziału (3;5]") elseif(x>1) disp("wpisałeś liczbę z przedziału (1;3]") ... end
elseif
może się kończyć klauzulą else
.
Instrukcja select-case
, uzależnia wykonanie kodu od wartości pewnej zmiennej.
disp("Program rysujący n-kąty foremne") n = input("n = ") select n case 3 then msg = "wybrałaś trojkąt" case 4 then msg = "wybrałaś kwadrat" case 5 then msg = "wybrałaś pięciokąt" ... else msg = "za mało lub za dużo boków" end disp(msg)
Utwórz tablicę $A$ o rozmiarze $10000\times 2$, o takiej zawartości:
1 0.2224478 1001 0.4957695 2001 0.4998512 3001 0.5056818 ... 98001 0.5007329 99001 0.500273 10000 0.4991944
mean(A)
wyliczająca średnią wartość liczb z tablicy $A$.
Utwórz tablicę $B$ o rozmiarze $3\times 101$.
Wypisz medianę liczb z pierwszego wiersza.
Utwórz tablicę $C$ o rozmiarze $100\times 100$, taką, że liczba w wierszu $w$ i kolumnie $k$ ma wartość $w^2+k^2$.
Napisz skrypt, który rysuje foremne wielokąty gwiaździste typu {n/2}
(o wartość $n$ skrypt pyta użytkownika). Wielokąt foremny typu {n/2}
powstaje przez połączenie co drugiego wierzchołka w zwykłym
n-kącie foremnym.
Krzywe rysujemy poleceniem param3d(wektor_x,wektor_y,wektor_z)
, wektory będące argumentami funkcji param3d
muszą mieć taką samą długość. Takie podejście do rysowania wynika z tego, że krzywe
w przestrzeni opisywane są zawyczaj parametrycznie
$\begin{cases}x=f_1(t)\\y=f_2(t)\\z=f_3(t)\end{cases}$
Wpierw przygotowujemy wektor parametrów $t$, następnie wyliczamy współrzędne wektorów $x$, $y$ i $z$.
t = linspace(0,8*%pi,601); x = t.*cos(t); y = t.*sin(t); z = t; param3d(x,y,z) ⇒
zeros(tab)
tworzy tablicę (wektor) o takim samym wymiarze jak tab
, wypełnioną zerami.param3d(x,y,zeros(z)) ⇒
Polecenie param3d
(analogicznie jak polecenie plot2d
) rysuje łamaną.
x = [2 0 0 2] y = [0 2 0 0] z = [0 0 2 0] set("thickness",3) param3d(x,y,z) ⇒ osie i krzywa sa pogrubione set("thickness",1) ⇒ przywraca cienkość osi
Powierzchnie rysujemy poleceniem plot3d(wektor_x,wektor_y,values_xy)
, długości wektorów wektor_x
i wektor_y
nie muszą byc równe, tablica values_xy
musi mieć rozmiar $n_x\times n_y$, gdzie $n_x$
jest długością wektora wektor_x
, a $n_y$ jest długością wektora wektor_y
.
Sporządzenie wykresu funkcji $z=x^2+y^2,\,\,x,y\in [-2;\,2]$.
x = linspace(-2,2,201); y = x; z = zeros(201,201); for w = 1:length(y) for k = 1:lenght(x) z(w,k) = y(w)^2 + x(k)^2; end end plot3d(x,y,z)
Jeżeli wzór na funkcję jest skomplikowany, to dla skrócenia zapisu warto zdefiniować własną funkcję.
Sporządzenie wykresu funkcji $z=\frac{\sin(x^2+y^2)}{x^2+y^2},\,\,x,y\in [-6;\,6]$.
function [w] = h(a,b) pom = a.*a + b.*b w = sin(pom)./pom endfunction x = linspace(-6,6,100); y = linspace(-6,6,100); z = zeros(100,100); for w = 1:100 for k = 1:100 z(w,k) = h(x(w),y(k)); end end plot3d(x,y,z) ⇒
Poniższy kod rysuje spiralę Archimedesa – krzywą o równaniu (we współrzędnych biegunowych) $r=\phi$.
t = linspace(0,8*%pi,401); x = t.*cos(t); y = t.*sin(t); plot2d(x,y) xtitle("Cztery zwoje spirali Archimedesa") ⇒
Narysuj w przestrzeni dwie spirale, jedna leży w płaszczyźnie $Oxy$ i jest krzywą z powyższego przykładu. Druga leży w płaszczyźnie o równaniu $z=x$, a jej rzutem na płaszczyznę $Oxy$ jest pierwsza krzywą.
Narysuj poniższą figurę – równoleżniki oddalone od siebie o 15° szerokości geograficznej.
Narysuj odwócony stożek.