Scilab w praktyce
20.01.2012 | aktual.: 21.01.2012 20:33
Scilab jest programem przeznaczonym do obliczeń numerycznych tzn. operujemy tutaj na liczbach, niemniej jednak scilab wraz z dodatkowym pluginem obsługuje obliczenia symboliczne. Dokładniej polega to na integracji scilab z programem maxima.
Pierwszym pytaniem jakie ciśnie się na usta jest jak możliwości programu wyglądają względem matlaba i Gnu Octave. Jeśli idzie o porównanie z Gnu octave zdecydowanie przewyższa on ten że program oferując większą liczbę funkcji a także xcos (namiastkę simulinka), jednak posiada on jedną istotną wadę względem niego. W przeciwieństwie do octave, scilab nie stara się być kompatybilny z składnią matlaba ,aczkolwiek warto zauważyć że twórcy scilab dostrzegli ten problem i przygotowali program tłumaczący wywołania interpretera matlaba na składnie scilaba. Sam program pomimo sporych możliwości nadal odstaje od matlaba pod względem ilości funkcji, o ile funkcje statystyczne nie odbiegają specjalnie od matlaba to w przypadku innych dziedzin jest gorzej.
Warto zauważyć także że całkiem niedawno (od wersji 5.3) pojawiła się Polska wersja językowa, a także powołano konsorcjum scilaba w celu zapewnienia komercyjnego wsparcia.
O Scilab
Po uruchomieniu (scilab 5.3.3 x64 win7) widzimy główne okno programu w którym znajduje się interpretator wraz z toolbarem. W tym stanie można przystąpić już do pisania ,chociaż znacznie wygodniejsze wydaje się wywołanie Scinotes czyli wbudowanego edytora. Zapewnia on podświetlanie składni i w zasadzie umożliwia wygodne tworzenie dość dużych projektów. Oprócz tego warto wspomnieć o module Atoms. Jego zadaniem jest udostępnienie dodatkowych pluginów i w ten sposób rozszerzenie możliwości scilab. Pluginy podzielono na kategorie w celu ułatwienia zarządzania nimi.
Dokumentacja oprogramowania jest niestety dużo słabsza niż dostarczona przez mathworks w matlabie mimo to warto się z nią zapoznać. Nie będę tu omawiał od podstaw składni ,a dam przykłady użycia dlatego z składniom zapoznać trzeba się samemu. W internecie dostępnych jest wiele opracowań na temat podstaw składni.
Zadanie
Zapewne każdy z nas zapoznał się w szkole z pojęciem rzutu ukośnego bez oporów. Ale dla przypomnienia jest to ruch ciała które na początku spoczywało i wykonano rzut pod pewnym kątem do poziomu np. rzucamy kamień i ona najpierw wznosi się a później opada.
Naszym celem będzie obliczenie i wykreślenie drogi jaką przebył nasz kamień podczas lotu. Wzory podstawowe znajdują się np. na wikipedii pod hasłem 'rzut ukośny'.
kolory=['—r','b','g'] //1 x=0; //2 y=0; a=15*%pi/180; v0=50; g=9.81; z=(v0^2 * sin(2*a)); //3 t=linspace(0,10); //4 xp=v0.*t.*cos(a); //5 n=3; for( i=1:n) //6 ytor=xp.*tan(a*i)-(g*xp.^2)/(2*v0^2*(cos(a*1))^2); //7 plot(t,ytor,kolory(i)); //8 end
- 1. Tablica z kolorami, zawarto w niej trzy kolory. Litera identyfikuje kolor czyli g-green(zielony), wysapujące dwie kreski – przy r oznaczają że krzywa ma być wykreślona linią przerywaną czerwoną (r-red)
- 2. Internalizacja warunków początkowych (x,y), kąta(a), prędkości początkowej (v0) itd.
- 3. Zasięg rzutu
- 4. Tworzymy wektor z czasem, funkcja linspace tworzy wektor który rozpoczyna się od wartości 0 a kończy na liczbie 10. Wartości pośrednie wzrastają od 0 do 10 w równych odstępach.
- 5. Położenie ciała po czasie t względem osi x
- 6. Pętla for(...) wartość początkowa to 1 a końcowa 3, scilab automatycznie postinkrementuje co 1 przy każdym przebiegu i sprawdza warunek
- 7. Równanie toru
- 8. Tworzy wykres pierwszy argument to czas w jakim odbywał się ruch, drugi to tor ruchu, a trzeci to kolor z tablicy z kolorami. Wybierany na podstawie obecnej wartości zmiennej i.
Aby określić maksymalną wysokość możemy skorzystać z datatip. W oknie w którym pokazał się wykres wybieramy Edycja=>Uruchom menadżer Datatip po czym klikamy na krzywą i przesuwamy kwadracik po jej obwodzie. Dodatkowym zadaniem do domu dla czytelników jest dodanie legendy :)
Teraz spróbujmy dorobić GUI do programu. Scilab umożliwia ręczne napisanie GUI niestety jest to dość kłopotliwe dlatego warto skorzystać z dodatkowych pluginów. Uruchamiamy Atoms, znajdujemy zakładkę GUI po czym instalujemy guibuilder. Restartujemy scilab i w konsoli wpisujemy guibuilder.
Wybieramy Text(wpisujemy nazwę zmiennej i co ma wyświetlić (String)) po czym na obszarze roboczym po prawej stronie klikamy lewym przyciskiem i wskazujemy rozmiar myszką po czym klikamy jeszcze raz aby zatwierdzić. Tworzymy tak trzy opisy: kąt, prędkość, czas o nazwach kat, predkosc, czas. Następnie dodajemy Edit: o nazwach kat_edit, predkosc_edit, czas_edit. Teraz czas na przycisk zatwierdzający, przerzucamy Pushbutton o nazwie ok.
W oknie graficznym po lewej stronie wybieramy 'Generate' => 'Generate GUI CODE'. Zapisujemy plik i powinien nam otworzyć się Scinotes, zjeżdżamy na sam dół i odnajdujemy function ok_callback (handles), funkcja ta odpowiada za akcję jaka zostanie podjęta po wciśnięciu przycisku ok. Nazewnictwo takich funkcji wygląda następująco nazwa_callback (handles).
W funkcji umieszczamy następujący kod:
x=0; y=0; execstr('a='+handles.kat_edit.String+'*%pi/180'); //1 execstr('v0='+handles.predkosc_edit.String); execstr('tlast='+handles.czas_edit.String); g=9.81; z=(v0^2 * sin(2*a)); t=linspace(0,tlast); //2 xp=v0.*t.*cos(a); ytor=xp.*tan(a*1)-(g*xp.^2)/(2*v0^2*cos(a*1)^2); figure(1); //3 plot(t,ytor);
- 1. Funkcja excestr służy do wywoływania poleceń zapisanych w postaci napisu tzn. wpisując w interpretatorze execstr ('x=1'); , zostanie wykonany kod który spowoduje stworzenie zmiennej x o wartości 1. W tym przypadku musimy z gui wyciągnąć wartości wpisane w poszczególne rubryki (kat_edit itd.). Wielkości te reprezentowane są poprzez String toteż konieczne jest skorzystanie z funkcji excestr, dodatkowo musimy ten napis połączyć z odpowiednią zmienną czyli poprzedzić wartość w Stringu przypisaniem do zmiennej w tym przypadku 'a=' operator + załatwi resztę. Zauważmy także że nasza zmienna kat_edit znajduje się w strukturze handles podobnie jak pozostałe stworzone w guibuilder, w celu dostępu do niej (a także jej atrybutu) używamy operatora kropka czyli handles.nazwa_zmiennej.atrybut . Atrybut String reprezentuje napis w niej.
- 2. Tworzenie wektora czasu, czas końcowy określany jest przez użytkownika.
- 3. Konieczne jest stworzenie kolejnego okna ponieważ w przeciwnym wypadku wykres pojawił by się w oknie z gui. Uwaga nowe okno tworzone jest tylko raz.
Podsumowanie
Mam nadzieję że na podstawie tych dwóch prostych przykładów zainteresowałem czytelników scilabem. Z pełną premedytacją nie wspomniałem o xcos. Jeśli wpis się podobał być może powstanie coś w przyszłości na ten temat.