Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Scilab w praktyce

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. 

oprogramowanie porady

Komentarze

0 nowych
  #1 21.01.2012 10:10

W podpisie ostatniego obrazka masz "Wykrs wraz Gui".

  #2 21.01.2012 12:33

A ja mam pytanie, w jakim stopniu można matlaba zastąpić scilabem. Czy są ze sobą kompatybilne?

revcorey   7 #3 21.01.2012 21:22

@Anonim
Na to pytanie bardzo ciężko odpowiedzieć. To będzie zależało od dziedziny którą się zajmujesz jeśli często korzystasz z simulinka lepiej przy nim pozostań. Co do reszty jeśli zainstalujesz trochę rozszerzeń z atoms przybędzie ci możliwości. Niestety nie ma wszystkiego tłumaczyłem kiedyś za pomocą wbudowanego translatora w scilaba parę plików .m i były funkcje których nie przekwaterował(być może niektóre funkcje trzeba obejść paroma). Tak naprawdę po prostu trzeba sprawdzić czy polecenia których potrzebujemy są. Strona Scilab wskazuje że używano go w jakiś komercyjnych projektach. W każdym razie możliwości ma duże ale jednak to nie matlab.

revcorey   7 #4 22.01.2012 21:52

ja wolę jednak matlaba ewentualnie scilab/octave szczególnie że łatwe są operacje symboliczne. W każdym razie łatwo też tworzyć GUI na pewno łatwiej niż np. integrować qt4 z pythonem i dziergać, po za tym myślę że są tu szerze możliwości a jeśli idzie o matlaba to implementacja funkcji jest wydajana(potrafi on nawet sam z siebie rozbić na wątki czasami) a dodatkowo matlab/scilab/octave wykorzystuje SSE/SSE2 do obliczeń co je przyspiesza(+ narzędzia do pracy na wieloprocesorowych maszynach i to w prosty sposób).

  #5 23.01.2012 14:33

Zachęcam do kontynuacji :)

  #6 10.05.2013 11:43

w jaki sposob mozna mozna zmienic wyglad konsoli po otwarciu ? mam problem bo u mnie wywolanie np.sciknotes czy historia polecen powoduje wyswietlanie sie owego polecenia w nowym oknie, czy jest szanasa to zmienic??