Wykład 3: Matlab cz.2 Podstawy programowania strukturalnego Opracował: Dr inż. Zbigniew Rudnicki Tematyka wykładu 3 Tryby użytkowania Matlaba Elementy języka - wyrażenia i instrukcje Wyrażenia arytmetyczne i ich składniki Wyrażenia logiczne i ich składniki Wprowadzanie danych - funkcja INPUT Instrukcja podstawiania - nadawanie wartości zmiennym Wyprowadzanie wyników - funkcja FPRINTF Instrukcja IF - rozgałęzienie warunkowe Instrukcja pętli FOR - przykłady programów Instrukcja pętli WHILE Zapisywanie wyników do pliku 2 1
Tryby użytkowania Matlaba 1) Tryb bezpośredni - wpisywanie w oknie kom: wyrażeń, instrukcji oraz funkcji 2) Tryb programowy - pisanie (w wybranym stylu) programów w edytorze a następnie zapisywanie do plików (*.m) i uruchamianie. 4) Tryb symulacyjny - symulacja działania układów za pomocą programu SIMULINK i pakietów rozwiniętych na jego bazie jak np.: SimMechanics 3 Style programowania Matlab umożliwia pisanie programów w różnych stylach (czyli w/g różnych paradygmatów) a w szczególności programowanie: strukturalne z użyciem pętli i bloków warunkowych, macierzowe bez używania instrukcji pętli obiektowo-zdarzeniowe z użyciem graficznych elementów dialogu czyli graficznego interfejsu użytkownika - GUI - graphic user interface; 4 2
Niniejszy wykład - dotyczy elementów języka oraz podstawowych instrukcji m.in. strukturalnych jak pętle i bloki warunkowe. Są one ważne m.in. ze względu na podobieństwo do innych języków programowania (jak Basic, Fortran, Pascal, C,...). Na osobnych wykładach będą omówione inne style programowania: programowanie obiektowo-zdarzeniowe z użyciem GUI, oraz operowanie na tablicach i pisanie programów bez pętli i bloków warunkowych a jedynie z użyciem operacji macierzowych. 5 Elementy języka - wyrażenia i instrukcje Programy składają się z poleceń (kom, instrukcji). Składnikami poleceń są: słowa kluczowe (np.: if, while,,...) wyrażenia arytmetyczne a wśród nich: stałe, zmienne i funkcje (jako najprostsze postacie wyrażeń) wyrażenia logiczne: a) proste czyli relacje np.: a-b>0 b) złożone, z użyciem operatorów logicznych (negacja, alternatywa, koniunkcja) wyrażenia tekstowe (realizujące np.: sklejanie i wycinanie fragmentów tekstów) 6 3
Wyrażenia arytmetyczne i ich składniki Wyrażenia arytmetyczne mogą zawierać: stałe (liczby) zmienne (nazwy zmiennych) operatory działań nawiasy funkcje Jednak inaczej niż w innych językach - wyrażenia te dotyczą tablic (macierzy), które w szczególności mogą być skalarami (pojedynczymi liczbami). 7 Stałe liczbowe - postacie zapisu liczb Podobnie jak w większości języków programowania zapis liczb w MATLABie może zawierać: początkowy znak plus (na ogół pomijany) lub minus kropkę dziesiętną (NIE PRZECINEK!) poprzedzającą część ułamkową np.: -97.6397 może być stosowana tzw. notacja naukowa w której e oznacza "dziesięć do potęgi..." np.: -1.60210e-23 oznacza: -1.60210 razy 10 do potęgi -23 w zapisie liczb urojonych i zespolonych stosuje się symbole i oraz j np.: 1i, 2-3.14159j, 3e5i 8 4
Kolejność (priorytety) operacji arytmetycznych - gdy brak nawiasów 1) obliczanie wartości funkcji 2) potęgowanie 3) zmiana znaku 4) mnożenie i dzielenie 5) dodawanie i odejmowanie Przykłady: 4/2^2 = 1 4/2*2 = 4 a=2; -a^2 = -4 b=-2; b^2 = 4 9 Używanie nawiasów okrągłych ( ) Nawiasy okrągłe używamy: dla argumentów funkcji np.: sin(3*x), sqrt(167) nie wolno bez nawiasów!! np.: sin3x = Źle!! dla określania odpowiedniej kolejności działań (np. dla sum i różnic w liczniku lub mianowniku ułamka) np.: zapiszemy: 34.6/(1+2*sqrt(3)) dla indeksów elementów wektorów i macierzy np.: V(1), b(16), sila(2*j+1), M(i,j), Mac_A(w+1, k-2) 10 5
Używanie nawiasów okrągłych ( ) Przykład: zapiszemy: (376.58^(3*sqrt(2))+2*sqrt(67))/(0.0789-1/(18-sqrt(3))) (jak widać czasem musi być wiele nawiasów). Po wpisaniu - bez średnika na końcu - i zakończeniu klawiszem ENTER, Matlab poda wynik: ans = 4.8658e+012 11 Ważniejsze elementarne funkcje matematyczne abs(x) - wartość bezwzględna sqrt(x)- pierwiastek exp(x) - e do x log(x) - logarytm naturalny log2(x) - logarytm o podstawie 2 log10(x) - logarytm o podst 10 Zaokrąglenia: round(x) - zaokrągla do najbliższej całkowitej ceil(x) - zaokrąglenie w górę ( sufit ) fix(x) - obcina cz. ułamk. - zaokrągla w stronę zera floor(x) - zaokrągla w dół ( podłoga ) gcd(x) - największy wspólny podzielnik lcm(x) - najmniejsza wspólna wielokrotność mod(x) - reszta z dzielenia sign(x) - znak 12 6
Funkcje trygonometryczne i hiperboliczne sin - sinus sec - secans sinh - sin hiperboliczny sech - sec hiperboliczny asin - arcus sinus asec - arcus secans asinh - arcus sin hiperb. asech - arc secans hiperb. cos - cosinus csc - cosecans cosh - cos hiperboliczny csch - cosecans hiperbol. acos - arkus cosinus acsc - arcus cosecans acosh - arcus cos hiperb. acsch - arcus cosecans hiperb. tan - tangens cot - cotangens tanh - tangens hiperb. coth - cotangens hiperbolicz. atan - arcus tangens acot - arcus cotangens atanh - arc tg hyperb. acoth - arc cotangens hyperbol. 13 Wyrażenia logiczne - są używane m in. w instrukcjach: IF oraz WHILE Rozróżniamy wyrażenia logiczne: 1) proste czyli RELACJE np.: 2*x < (x-y) czyli ogólnie: wyrażenie arytmetyczne operator relacji wyrażenie arytmetyczne gdzie operatory relacji to: ==, >, <, >=, <=, ~= 2) złożone - z wielu relacji łączonych operatorami logicznymi 14 7
Operatory Relacji == równe ~= nie równe (w Matlabie)!= nie równe (w FreeMat oraz C) < mniejsze > większe <= mniejsze lub równe >= większe lub równe 15 Operatory logiczne Operatory logiczne ( & ~ ) pozwalają łączyć relacje i tworzyć z nich złożone wyrażenia logiczne. Matlab ma następujące operatory logiczne: & - i czyli iloczyn logiczny czyli koniunkcja - lub czyli suma logiczna czyli alternatywa ~ - nie czyli negacja czyli zaprzeczenie 16 8
Funkcje Logiczne Zamiast operatorów logicznych można używać funkcji: and(x, y) - iloczyn logiczny czyli to samo co: x&y or(x,y) - suma logiczna czyli to samo co: x y not(x) - zaprzeczenie czyli to samo co: ~x 17 Wyrażenia tekstowe Matlab umożliwia dokonywanie pewnych operacji na tekstach. Stała tekstowa to łańcuch znaków (ang.: string of characters) ujęty w apostrofy np.: ' x1=', ' x2=', 'Ala ma kota' Łańcuch znaków jest tablicą znaków (ang.: array of characters) której elementami są znaki drukarskie. Do określenia rozmiarów macierzy (lub wektora) służy funkcja size(..). Łańcuchy znaków można przypisywać zmiennym, np.: S1='Ala ma kota'; S2='i chomika'; Możliwe jest sklejanie łańcuchów. Należy w tym celu umieścić elementy przewidziane do sklejenia we wspólnym nawiasie prostokątnym, oddzielając je przecinkami lub spacjami, np.: S=[S1,'i psa',s2] S = Ala ma kotai psai chomika 18 9
Funkcje do operowania na tekstach 19 Pisanie programów w edytorze Matlaba 20 10
Edytor i folder bieżący 21 Programy czyli m-pliki : skrypty i funkcje Programy (wieloliniowe) można pisać w edytorze MATLABa (lub np. w Notatniku Ms Windows) Zapisywane są do plików z rozszerzeniem *.m Uruchamiane są przez wpisanie nazwy pliku (bez rozszerzenia.m w oknie kom Rozróżniamy: skrypty - operujące na zmiennych przestrzeni roboczej Matlaba funkcje - posiadające zmienne lokalne 22 11
Przykład m-pliku skryptowego % po znaku procentu są tzw. komentarze % program rozwiazywania równania kwadratowego a=input('a='); b=input('b='); c=input('c='); delta = b*b-4*a*c; if delta<0 disp('brak pierwiastkow rzeczywistych'); else x1=(-b-sqrt(delta))/(2*a); x2=(-b+sqrt(delta))/(2*a); disp('x1='); disp(x1); disp('x2='); disp(x2); 23 To samo napisane jako funkcja prkw(a, b, c): function [x1, x2] = prkw(a, b, c) % ta funkcja oblicza pierwiastki x1, x2 % rownania: a*x^2 + b*x + c = 0 delta = b*b-4*a*c; if delta<0 % dla delta<0 podstawimy NaN = "nieokreslone" else x1=nan; x2=nan x1=(-b-sqrt(delta))/(2*a); x2=(-b+sqrt(delta))/(2*a); 24 12
INSTRUKCJE 25 Rodzaje zakończeń instrukcji Instrukcje (lub pojedyncze nazwy zmiennych) oddzielane przecinkami lub zmianami linii [Enter]- wyświetlają uzyskaną wartość (tzw. echo) np.: a=input( A= ) b=3*a-1 c=6 -sqrt(b), d=a^2+3*b Instrukcje kończone średnikiem [;] nie wyświetlają uzyskanej wartości (czyli echa ) np.: a=input( A= ); b=3*a-1; c=6 -sqrt(b); d=a^2+3*b; 26 13
Podstawowe instrukcje 1) podstawiania: zmienna = wyrażenie - nadają wartości zmiennym 2) wprowadzania danych z klawiatury: zmienna=input(...) 3) wyprowadzania wyników: fprintf( format, lista_wyrażeń) 4) rozgałęzienie warunkowe: if... else... 5) pętla o określonej liczbie cykli: for... 6) pętla o nieokreślonej liczbie cykli: while... 7) obsługa plików dyskowych: fopen(...), fscanf(...), fprintf(...), fclose(...), readline(...) 27 1) Instrukcja podstawiania (przypisania) Postać instrukcji: zmienna = wyrażenie Najpierw obliczana jest wartość wyrażenia z prawej a potem jest ona podstawiana do zmiennej - zastępując jej dotychczasową wartość. Pojedyncza liczba lub zmienna to też jest wyrażenie. Przykłady instrukcji podstawienia: a=5 b=a^2+1; a=a+2, 28 14
2) INPUT - Wprowadzanie danej z klawiatury Składnia polecenia: zmienna = input( żądanie danych ) Komputer wyświetli żądanie danych i poczeka na wprowadzenie wartości z klawiatury oraz wstawi tą wartość do zmiennej. Przykłady: SilaN = input( Składowa normalna siły= ); E = input( Moduł Younga= ); -------------------------------------------------------------------------- Składnia polecenia dla zmiennych tekstowych: zmienna = input( żądanie danych, s ) Przykład: NazMasz = input( Podaj nazwę maszyny:, s ); 29 3) FPRINTF - Wyprowadzanie wyników na ekran Składnia polecenia: fprintf( opis_formatu, lista_wyrażeń) opis_formatu - może zawierać: - teksty - będą one przekopiowane do wydruku - znaki sterujące poprzedzone backslashem : np.: \n to rozkaz zmiany linii - oraz formaty wyprowadzania dla wyrażeń z listy_wyrażeń np.: %10.4f - dla liczby rzeczywistej, 10 znaków, w tym 2 po kropce dziesiętnej 30 15
Funkcja FPRINTF c.d. Przykład: fprintf( \n %5.2f %7.2f, x, x^2); (a) (b) (c) lista wyrażeń opis formatów a) \n rozkaz zmiany linii na wydruku b) %5.2f - format dla wydruku wartości x 5 znaków dla całego pola, w tym 2 znaki po kropce c) %7.2f - format dla wydruku wartości x^2 7 znaków dla całego pola, w tym 2 znaki po kropce 31 4) Instrukcja IF - rozgałęzienie warunkowe Instrukcja IF (czyli Jeżeli ) ma najczęściej postać: if warunek....instrukcje1 else.... instrukcje2 Oznacza: Jeżeli warunek jest spełniony to wykonaj instrukcje1 a w przeciwnym przypadku (ang.: else) wykonaj instrukcje2. Warunek to dowolne wyrażenie logiczne na przykład: 3*x^2>3 albo x>3 (a<=2 & b==4) 32 16
Powtarzanie obliczeń w pętli W Matlabie są dwa typy instrukcji organizujących powtarzanie operacji w pętli programowej: instrukcja for... (czyli Dla... ) - powtarzająca określoną liczbę razy instrukcja while... (czyli Podczas... ) - powtarzająca tak długo jak długo spełniony jest podany warunek (sprawdzany przed każdym powtórzeniem) 33 5) Pętla FOR czyli Dla... Pętla FOR ma postać: for X = Xp : Dx : Xk instrukcje Gdzie: X - dowolna zmienna, Xp - wyrażenie określające początkową wartość X Dx - wyrażenie określające przyrost X Xp - wyrażenie określające końcową wartość X Instrukcja ta oznacza: Dla wartości zmiennej kontrolnej X zmieniających się od Xp co Dx aż do Xk wykonuj instrukcje zapisane poniżej, aż do. 34 17
Przykład programu z instrukcją FOR... END Napisać program, który oblicza kwadraty liczb z ciągu 2; 2,2;... 3. clear; for x = 2:0.2:3 y=x^2; pętla fprintf( \nliczba=%5.2f Kwadrat=%7.2f,x,y) wyniki: Liczba= 2.00 Kwadrat= 4.00 Liczba= 2.20 Kwadrat= 4.84 Liczba= 2.40 Kwadrat= 5.76 Liczba= 2.60 Kwadrat= 6.76 Liczba= 2.80 Kwadrat= 7.84 Liczba= 3.00 Kwadrat= 9.00 35 Przykład programu z instrukcją FOR... END Napisać program, który oblicza kwadraty liczb z ciągu 2; 2,2;... 3. clear; clc; fprintf( Liczba Kwadrat ); for x = 2:0.2:3 pętla fprintf( \n%5.2f %7.2f, x, x^2); wyniki: Liczba Kwadrat 2.00 4.00 2.20 4.84 2.40 5.76 2.60 6.76 2.80 7.84 3.00 9.00 36 18
Przykład programu z instrukcjami FOR oraz IF Napisać program, który generuje 10 elementów ciągu, przy czym pierwsze dwa i ostatnie dwa mają być równe 1 a pozostałe równe 2. pętla clear; for i=1:10 if i<3 i>8 x(i)=1; else x(i)=2; x wyniki: x = 1 1 2 2 2 2 2 2 1 1 37 6) Pętla WHILE czyli Podczas... Pętla WHILE ma postać: while warunek instrukcje Gdzie warunek to wyrażenie logiczne. Instrukcja ta oznacza: Podczas gdy warunek jest spełniony (różny od zera) powtarzaj wykonywanie instrukcji umieszczonych poniżej aż do. 38 19
Przykład programu z pętlą WHILE Mam 100 zł. Program ma odejmować od tej sumy moje wydatki tak długo na ile wystarcza pieniędzy a gdy wydatek przekraczałby posiadaną sumę to ma o tym zakomunikować: clear; Suma=100; while Suma>0 wydatek=input( Cena kupowanego towaru: ); if wydatek>suma disp( Na ten zakup nie stać cię! ); else Suma=Suma-wydatek; disp( Dokonano zakupu ) disp( Stan konta= ); disp(suma); disp( NIE MASZ JUŻ PIENIĘDZY! ); Uogólnij program, aby działał dla dowolnej sumy i pytał czy akceptujesz zakup. 39 7) Wyprowadzanie wyników do pliku Funkcje realizujące odczytywanie i zapisywanie informacji z i do plików dyskowych są zapożyczone z języka C. Poniżej objaśniono kilka najważniejszych funkcji na przykładzie: % Program zapisuje do pliku wartości kąta x oraz jego funkcji sin(x), cos(x) [id, kom] = fopen('wyniki1.txt','wt'), % Tworzy plik, % Parametr wt - oznacza: w - do zapisu, t - tekstowy fprintf(id,'\n kąt x [stopnie] sin(x) cos(x)\n' ); % Nagłówek tabelki for xs = 0 : 5 : 90 x = xs*pi/180; % kąt xs zamieniony na radiany y1=sin(x); y2=cos(x); fprintf(id,' %5.0f %15.4f %12.4f\n', xs, y1,y2); fclose(id); % zamyka plik wyników type WYNIKI.TXT 40 20
Definiowanie własnych funkcji Definicja funkcji użytkownika w MATLAB-ie ma postać: function wektor_zmiennych_wynikowych = nazwa_funkcji(argumenty) % objaśnienia stanowiące HELP do funkcji..... instrukcje instrukcje muszą wyznaczyć wszystkie zmienne wynikowe na podstawie argumentów funkcji (w przykładzie: x1, x2, x3, x4) Wskazane jest kończyć funkcję słowem, chociaż nie jest to obowiązkowe. Dla wcześniejszego wymuszenia wyjścia z funkcji można także użyć słowa kluczowego return. Zmienne używane wewnątrz funkcji są lokalne (niedostępne z zewnątrz funkcji). Jeśli chcemy wywoływać naszą funkcję z różnych programów i ewentualnie z okna kom to należy zapisać ją do pliku o nazwie takiej samej jak nazwa tej funkcji. 41 Definiowanie własnych funkcji Przykład: function [wynik]= silnia(n) % PR - Funkcja silnia(n) wyznacza wartosc n! wynik=1; for i=1:n wynik = wynik * i; return Po zapisaniu funkcji do pliku o nazwie: silnia.m można ją wywoływać z konkretnymi wartościami argumentu n: >> silnia(5) ans = 120 >> silnia(9) ans = 362880 42 21
Definiowanie funkcji o zmiennej liczbie argumentów zmienna nargin podaje ile było argumentów % PR - Funkcja OkrElipsa(Xs,Ys,Ra,Rb) % Gdy sa 3 argumenty rysuje okrag, a gdy 4 to elipse % Xs, Ys - wspólrzedne srodka, % Ra - promien okregu lub pierwsza pólos elipsy, % Rb - druga pólos elipsy. function OK=OkrElipsa(Xs,Ys,Ra,Rb) if nargin<3 'za malo argumentow else if nargin<4 Rb=Ra; f=0:0.1:6.3; x=xs+ra*cos(f); y=ys+rb*sin(f); plot(x,y); axis equal; grid on 43 22