Wykład 3: Matlab cz - Wykład 3: Matlab cz.2 Podstawy programowania strukturalnego Opracował: Dr...

22
1 Wyklad 3: Matlab cz.2 Podstawy programowania strukturalnego Opracowal: Dr inż. Zbigniew Rudnicki 2 Tematyka wykladu 3 Tryby użytkowania Matlaba Elementy języka - wyrażenia i instrukcje Wyrażenia arytmetyczne i ich skladniki Wyrażenia logiczne i ich skladniki Wprowadzanie danych - funkcja INPUT Instrukcja podstawiania - nadawanie wartości zmiennym Wyprowadzanie wyników - funkcja FPRINTF Instrukcja IF - rozgalęzienie warunkowe Instrukcja pętli FOR - przyklady programów Instrukcja pętli WHILE Zapisywanie wyników do pliku

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

10

19

Funkcje do operowania na tekstach

20

Pisanie programów w

edytorze Matlaba

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