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.

r   e   k   l   a   m   a

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