Wykład 3: Matlab cz - Wykład 3: Matlab cz.2 Podstawy programowania strukturalnego Opracował: Dr...
Transcript of Wykład 3: Matlab cz - Wykład 3: Matlab cz.2 Podstawy programowania strukturalnego Opracował: Dr...
1
Wykład 3: Matlab cz.2Podstawy programowania
strukturalnego
Opracował:
Dr inż. Zbigniew Rudnicki
2
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
3
Tryby użytkowania Matlaba
1) Tryb bezpośredni - wpisywanie w oknie komend:
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
4
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;
3
5
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.
6
Elementy języka - wyrażenia i instrukcje
Programy składają się z poleceń (komend, instrukcji).
Składnikami poleceń są:
• słowa kluczowe (np.: if, while, end, ...)
• 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)
4
7
Wyrażenia arytmetycznei 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).
8
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 ioraz j np.: 1i, 2-3.14159j, 3e5i
5
9
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
10
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)
6
11
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
12
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
7
13
Funkcje trygonometryczne i hiperboliczne
sin - sinus
sinh - sin hiperboliczny
asin - arcus sinus
asinh - arcus sin hiperb.
cos - cosinus
cosh - cos hiperboliczny
acos - arkus cosinus
acosh - arcus cos hiperb.
tan - tangens
tanh - tangens hiperb.
atan - arcus tangens
atanh - arc tg hyperb.
sec - secans
sech - sec hiperboliczny
asec - arcus secans
asech - arc secans hiperb.
csc - cosecans
csch - cosecans hiperbol.
acsc - arcus cosecans
acsch - arcus cosecans hiperb.
cot - cotangens
coth - cotangens hiperbolicz.
acot - arcus cotangens
acoth - arc cotangens hyperbol.
14
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:
gdzie operatory relacji to: ==, >, <, >=, <=, ~=
2) złożone - z wielu relacji łączonych operatorami logicznymi
wyrażenie
arytmetyczne
operator
relacji
wyrażenie
arytmetyczne
8
15
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”
16
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
9
17
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
18
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
11
21
Edytor i folder bieżący
22
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 komend
Rozróżniamy:
• skrypty - operujące na zmiennych przestrzeni roboczej
Matlaba
• funkcje - posiadające zmienne lokalne
12
23
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);
end
24
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"
x1=NaN; x2=NaN
else
x1=(-b-sqrt(delta))/(2*a);x2=(-b+sqrt(delta))/(2*a);
end
13
25
INSTRUKCJE
26
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;
14
27
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 ... end
5) pętla o określonej liczbie cykli: for ... end
6) pętla o nieokreślonej liczbie cykli: while ... end
7) obsługa plików dyskowych:
fopen(...), fscanf(...), fprintf(...), fclose(...),
readline(...)
28
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,
15
29
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’);
30
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
16
31
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
Funkcja FPRINTF c.d.
32
4) Instrukcja IF - rozgałęzienie warunkowe
Instrukcja IF (czyli „Jeżeli”) ma najczęściej postać:
if warunek
. . . .instrukcje1
else
. . . . instrukcje2
end
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)
17
33
Powtarzanie obliczeń w pętli
W Matlabie są dwa typy instrukcji organizujących
powtarzanie operacji w „pętli” programowej:
• instrukcja for ... end (czyli „Dla ...”)
- powtarzająca określoną liczbę razy
• instrukcja while ... end (czyli „Podczas ...”)
- powtarzająca tak długo jak długo spełniony jest
podany warunek (sprawdzany przed każdym
powtórzeniem)
34
5) Pętla FOR czyli „Dla ...”
Pętla FOR ma postać:
for X = Xp : Dx : Xk
instrukcje
end
Gdzie: X - dowolna zmienna,
Xp - wyrażenie określające początkową wartość XDx - 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 end”.
18
35
Napisać program, który oblicza kwadraty liczb z ciągu 2; 2,2; ... 3.
clear;
for x = 2:0.2:3
y=x^2;
fprintf(‘\nLiczba=%5.2f Kwadrat=%7.2f’,x,y)
end
Przykład programu z instrukcją FOR ... END
pętla
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
wyniki:
36
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
fprintf(’\n%5.2f %7.2f’, x, x^2);
end
Przykład programu z instrukcją FOR ... END
pętla
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
wyniki:
19
37
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.
clear;
for i=1:10
if i<3 | i>8
x(i)=1;
else
x(i)=2;
end
end
x
pętla
x =
1 1 2 2 2 2 2 2 1 1
wyniki:
38
6) Pętla WHILE czyli „Podczas...”
Pętla WHILE ma postać:
while warunek
instrukcje
end
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 end”.
20
39
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);
end
end
disp(‘NIE MASZ JUŻ PIENIĘDZY!’);
Uogólnij program, aby działał dla dowolnej sumy i pytał czy akceptujesz zakup.
40
7) Wyprowadzanie wyników do pliku
% 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);
end
fclose(id); % zamyka plik wyników
type ‘WYNIKI.TXT’
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:
21
41
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
end
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 end, 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 komend to
należy zapisać ją do pliku o nazwie takiej samej jak nazwa tej funkcji.
42
Definiowanie własnych funkcjiPrzykład:
function [wynik]= silnia(n)
% PR - Funkcja silnia(n) wyznacza wartosc n!
wynik=1;
for i=1:n
wynik = wynik * i;
end
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
22
43
Definiowanie funkcji o zmiennej liczbie argumentówzmienna 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;
end
end
f=0:0.1:6.3;
x=Xs+Ra*cos(f); y=Ys+Rb*sin(f);
plot(x,y); axis equal; grid on