Matlab Interfejs komponentowy GUI Podsumowanie
Transkrypt
Matlab Interfejs komponentowy GUI Podsumowanie
MOiPP Wykład 8 Matlab Interfejs komponentowy GUI Podsumowanie 1 Ważne elementy z wykładu 7 - długość krzywej - sprzężenia zwrotne 2 Wpisujemy w Command Window: >>guide Możliwości wyboru: • Blank GUI - pusty formularz, • GUI with UIcontrols - formularz z podstawowymi elementami sterującymi, • GUI with Axes and Menu - formularz zawierający wykres i listę rozwijaną, • Modal Question Dialog - modalne okno dialogowe. Okno pustego formularza Mamy do wyboru następujące komponenty: • • • • • • • • • • • • • Przycisk (Push Button) Suwak (Slider) Przycisk radiowy (Radio Button) Pole wyboru (Checkbox) Pole tekstowe (Edit Text) Etykieta (Static Text) Lista rozwijana (Popup Menu) Lista wyboru (Listbox) Przełącznik (Toggle Button) Wykres Panel Grupa przycisków (Button group) Komponent ActiveX 7 Każdy komponent (obiekt) wprowadzony w okienku aplikacji ma Property Inspector (po dwukliknięciu danego elementu lub wybierany z menu kontekstowego), w którym można ustawić podstawowe informacje o danym komponencie. Ważniejsze właściwości komponentów • String - napisy na przyciskach i etykietach, tekst w komponencie Edit. • Tag - nazwa komponentu, pod którą jest on identyfikowany w kodzie. • Units – jednostki miary • Position - naciskamy „+” : x, y, width, height • Fontsize – rozmiar czcionki Funkcjonalność komponentu Po zapisie aplikacji mamy dwa pliki: nazwa.fig nazwa.m Aby zdefiniować działanie aplikacji należy w mpliku zdefiniować funkcję Callback dla danego komponentu Jeżeli mamy komponent typu Pushbutton posiadający Tag o wartości rysuj, po zapisaniu pliku fig przenosimy się do funkcji rysuj_Callback w m-pliku aplikacji. Funkcja ta będzie wykonywana po kliknięciu przycisku uruchomionej aplikacji. lub Jeżeli nawet nie umieścimy w formularzu komponentu wykresu Axes … function rysuj_Callback (hObject, eventdata, handles) % hObject handle to rysuj (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) fplot('sin(x)',[0 2*pi]) i uruchomimy aplikację przyciskiem Run, to po kliknięciu przycisku zostanie wykonana funkcja Callback i pojawi się wykres na tle okna (płótno – canvas) Matlab posiada specjalną strukturę o nazwie handles, w której mogą być przechowywane wartości parametrów obiektów – dla komunikacji pomiędzy różnymi funkcjami Callback. Jeśli działanie jednego komponentu ma wpływać na parametry innego komponentu, przykładowo: - przesuwany suwak Slider ma zmieniać dane wykresu, - kliknięcie przycisku ma zmieniać wartość tekstu w komponencie Edit Text, itp. musimy wykorzystać dostęp do danych w strukturze handles i mieć możliwość ich modyfikacji Każdy obiekt- element struktury handles - identyfikujemy przez zapis: handles.tag_obiektu Stosuje się dwie metody (funkcje): set(obiekt, właściwość, wartość) która służy do nadawania wartości właściwościom obiektów umieszczonych w strukturze handles, oraz get(obiekt, właściwość) która służy do pobierania wartości właściwości obiektów umieszczonych w strukturze handles. Przykładowo: Zadanie: W odpowiedzi na kliknięcie przycisku chcemy przepisać tekst z komponentu o tagu edit1 do komponentu o tagu edit2. Wewnątrz funkcji Callback dla przycisku piszemy kod: x=get(handles.edit1,'String'); %pobranie do zmiennej set(handles.edit2,'String', x); % nadanie set lub bez użycia zmiennej: set(handles.edit2,'String', get(handles.edit1,'String'); Konwersja typów Napisy na przyciskach i etykietach, tekst wpisywany do komponentów edit itp. to dane typu tekstowego (char). Jeśli mamy zamiar wykonywać operacje arytmetyczne musimy dane typu tekstowego konwertować na liczby. Służy do tego funkcja str2double: liczba= str2double(tekst) Po wykonaniu działań obliczeniowych, aby wyświetlić wynik jako teskt, konieczna jest konwersja odwrotna. Służy do tego funkcja num2str: tekst= num2str(liczba) Przykładowo – sumowanie dwóch liczb function pushbutton1_Callback(hObject, eventdata, handles) s1=get(handles.edit1,'String') s2=get(handles.edit2,'String') l1=str2double(s1); l2=str2double(s2); suma=l1+l2; set(handles.edit3,'String',num2str(suma)); lub przy pomocy jednej instrukcji: function pushbutton1_Callback(hObject, eventdata, handles) set(handles.edit3,'String',… num2str(… str2double(get(handles.edit1,'String'))… +str2double(get(handles.edit2,'String')))); … trzy kropki to kontynuacja instrukcji w nowym wierszu 17 Usuwanie tekstu w komponencie: set(handles.edit1,'String','') Uwaga: dwa apostrofy! Łączenie (konkatenacja) tekstów: tekst= strcat(teskt1, teskt2) 18 Dwa komponenty axes: function pushbutton1_Callback(hObject, eventdata, handles) x=-4:0.1:4; y=x.^2; plot(handles.axes1,x,y) function pushbutton2_Callback(hObject, eventdata, handles) fplot(handles.axes2,'sin(x)', [0 get(handles.slider1,'Value')); 19 Zastosowanie funkcji OpeningFcn (wykonanie na starcie aplikacji) function test_OpeningFcn(hObject, eventdata, handles, varargin) clc %figura konturowa x=[0 0 1 1 3 3 0; 0 5 5 1 1 0 0; 1 1 1 1 1 1 1] fill(x(1,:),x(2,:),'c') %axis([-1 6 -1 6]) axis equal syms px py sx sy kat Prz=[1 0 px;0 1 py;0 0 1]; Ska=[sx 0 0;0 sy 0; 0 0 1]; Obr=[cos(kat) sin(kat) 0; -sin(kat) cos(kat) 0; 0 0 1]; r=Prz*Ska*Obr handles.R=r; %umieszczenie w handles handles.X=x; %umieszczenie w handles guidata(hObject, handles); %odświeżenie handles 20 Teraz callback dla przycisku function pushbutton1_Callback(hObject, eventdata, handles) x=handles.R*handles.X; %odwołanie do handles px=rand*5-2.5, py=rand*5-2.5, sx=rand, sy=sx, kat=(rand-0.5)*2*pi, x=subs(x) hold on fill(x(1,:),x(2,:),'r') 21 Podsumowanie wiedzy 22 1. 2. 3. 4. Edycja m-plików i ich uruchamianie Inicjacja zmiennych – nadawanie im wartości Proste obliczenia z wykorzystaniem funkcji matematycznych Zmienne zespolone Macierze 1. Tworzenie macierzy jedno- i dwuwymiarowych 2. Operacje macierzowe • macierz odwrotna • mnożenie macierzy (macierzowe i elementowe) • podnoszenie macierzy do potęgi (macierzowe i elementowe) • wyznacznik macierzy • tanspozycja macierzy 3. Wykorzystanie macierzy • rozwiązywanie układu równań liniowych • rozwiązywanie równania n-tego stopnia (roots) • wektoryzacja danych dla wykresów 23 Wykresy funkcji • wykresy 2D – funkcje plot i fplot • wykres funkcji symbolicznej – ezplot • zarządzanie zakresami zmiennej niezależnej i zależnej (axis) Proste obliczenia kinematyczne ruchu jednostajnego i jednostajnie przyspieszonego, • wektoryzacja czasu, • wykresy drogi, prędkości, przyspieszenia. Aproksymacja – przybliżanie danych dyskretnych parabolą n-tego stopnia Interpolacja i ekstrapolacja 24 Instrukcje strukturalne w Matlabie • Instrukcja warunkowa – cel i struktura, badanie kilku warunków, koniunkcja i alternatywa warunków • Instrukcje iteracyjne – pętle • sterowanie przebiegiem pętli liczonej for • pętle zagnieżdżane (np. dla tablic dwuwymiarowych) • zastosowania pętli w algorytmach wyszukiwania, sumowania i zliczania elementów (z warunkami) • pętla warunkowa while Funkcje własne • tworzenie i wykorzystanie funkcji anonimowej • tworzenie i wykorzystanie funkcji utworzonej w osobnym pliku - umiejętność określania argumentów wejściowych i wyjściowych 25 Obliczenia symboliczne • Inicjacja zmiennych symbolicznych (syms) • Rozwiązywanie równań nieliniowych (solve) • Podstawienie danych liczbowych do wyrażeń symbolicznych (subs) • Wykresy funkcji symbolicznych (ezplot) • Symboliczne obliczenia pochodnych (pierwszego i drugiego stopnia, pochodne cząstkowe) • Całkowanie symboliczne (całki oznaczone i nieoznaczone) • Równania różniczkowe (dsolve) w warunkami początkowymi 26 Wykorzystanie operacji symbolicznych Badanie funkcji f– wykres, miejsca zerowe, minima, maksima, punkty przegięcia • miejsce zerowe (solve(f)) • ekstremum – pochodna 1 rzędu ma miejsce zerowe • minimum –pochodna 2 rzędu dodatnia • maksimum –pochodna 2 rzędu ujemna • punkt przegięcia –pochodna 2 rzędu ma miejsca zerowe Wykorzystanie równań różniczkowych w zadaniach kinematycznych 27 clc, clear syms x f=x^3-5*x^2+5*x+1 zera=solve(f); zera=double(zera) subplot(3,1,1),ezplot(f,[-1,4]) df=diff(f) extrema=solve(df); extrema=double(extrema) subplot(3,1,2),ezplot(df,[-1,4]) d2f=diff(df) pp=solve(d2f);%punkt przegięcia pp=subs(pp) subplot(3,1,3),ezplot(d2f,[-1,4]) disp('Badamy wartość d2f w punktach ext') disp('Jak dodatnie to minimum, ujemne to maximum') for k=1:length(extrema) x=extrema(k) if subs(d2f)<0 disp('Max') else disp('Min') end end 28 WYNIKI x3-5 x2+5 x+1 5 0 -5 -1 -0.5 0 0.5 1 1.5 x 2 2.5 3 3.5 4 zera = 3.4812 -0.1701 1.6889 pp 2 x=1.6667 3 x -10 x+5 15 10 5 0 -5 -1 x=2.7208 minimum -0.5 0 0.5 1 1.5 x 2 2.5 3 3.5 4 x=0.6126 maksimum 6 x-10 10 0 -10 -1 Wniosek: -0.5 0 0.5 1 1.5 x 2 2.5 3 3.5 4 pp różne od zera(3) pp jest tam, gdzie d2f=0 29 Tworzenie prostej aplikacji GUI • komponenty i ich właściwości – inspektor, • rola funkcji callback w m-pliku, • pobieranie i nadawanie wartości właściwościom komponentów w kodzie m-pliku – funkcje set i get • konwersja typów – funkcje num2str i str2double - obliczenia Proste zadania na bazie wykładów, przykładowo: • transformacja figury geometrycznej (przesunięcie, skala, obrót), • obliczenie długości krzywej dla podanej funkcji, • zadanie ze sprzężeniem zwrotnym itp 30