77
Curs 1. Instrucţiuni de control al ciclurilor Cu ajutorul instrucţiunilor de control al ciclurilor se poate executa în mod repetat un bloc de comenzi, revenind la începutul blocului, în funcţie de o anumită condiţie. Pentru a executa blocul de comenzi de un număr specificat de ori, se foloseşte instrucţiunea for. Pentru a executa repetitiv anumite instrucţiuni cât timp o condiţie continuă să fie adevărată sau falsă, se foloseşte comanda while. Instrucţiunile continue şi break oferă un control suplimentar asupra ciclurilor. Instrucţiunea return permite încheierea execuţiei programului. 1.1 Instrucţiunea for-end Instrucţiunea for este folosită pentru executarea unui grup de instrucţiuni de un număr predeterminat de ori. Corespunde structurii iterative din programarea structurată. Sintaxă: for index = start:increment:sfârşit instrucţiuni end Descriere: În momentul execuţiei instrucţiunii for, valoarea index parcurge intervalul [start, sfârşit], cu pasul de parcurgere stabilit prin increment. Pentru fiecare valoare a lui index, se execută în mod repetat una sau mai multe instrucţiuni. Incrementul implicit este 1. În acest caz el nu mai trebuie specificat. Incrementul poate lua şi valori negative, caz în care valoarea index descreşte. Exemple: 1. Să se construiască şirul x, conţinând primele n puteri ale lui 2. Valoarea n se va citi de la tastatură. % Script pentru calculul puterilor lui 2 n = input('Introduceti numarul de elemente: '); x = []; % sau clear x x(1)=1; for m = 2:n x(m) = 2 * x(m - 1); end display(x) Pentru n = 10, se obţin următoarele rezultate: Introduceti numarul de elemente: 10 x = 1 2 4 8 16 32 64 128 256 512 2. Se citeşte de la tastatură o matrice pătrată A. Se cere să se determine suma elementelor de deasupra diagonalei secundare. % suma elementelor de deasupra diagonalei secundare %% initializare A = []; suma = 0; %% citire matrice disp('Introduceti matricea A:') A = input(''); %% verificari [row col] = size(A); if row~=col disp('Matricea nu este patrata!') return end Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 1. Instrucţiuni de control al ciclurilor 11 | P a g e

Curs Programare

Embed Size (px)

DESCRIPTION

Curs Programare

Citation preview

Page 1: Curs Programare

Curs 1. Instrucţiuni de control al ciclurilor Cu ajutorul instrucţiunilor de control al ciclurilor se poate executa în mod repetat un bloc de comenzi, revenind la începutul blocului, în funcţie de o anumită condiţie. Pentru a executa blocul de comenzi de un număr specificat de ori, se foloseşte instrucţiunea for. Pentru a executa repetitiv anumite instrucţiuni cât timp o condiţie continuă să fie adevărată sau falsă, se foloseşte comanda while. Instrucţiunile continue şi break oferă un control suplimentar asupra ciclurilor. Instrucţiunea return permite încheierea execuţiei programului. 1.1 Instrucţiunea for-end Instrucţiunea for este folosită pentru executarea unui grup de instrucţiuni de un număr predeterminat de ori. Corespunde structurii iterative din programarea structurată. Sintaxă: for index = start:increment:sfârşit

instrucţiuni

end

Descriere: În momentul execuţiei instrucţiunii for, valoarea index parcurge intervalul [start, sfârşit], cu pasul de parcurgere stabilit prin increment. Pentru fiecare valoare a lui index, se execută în mod repetat una sau mai multe instrucţiuni. Incrementul implicit este 1. În acest caz el nu mai trebuie specificat. Incrementul poate lua şi valori negative, caz în care valoarea index descreşte. Exemple: 1. Să se construiască şirul x, conţinând primele n puteri ale lui 2. Valoarea n se va citi de la tastatură. % Script pentru calculul puterilor lui 2

n = input('Introduceti numarul de elemente: ');

x = []; % sau clear x

x(1)=1;

for m = 2:n

x(m) = 2 * x(m - 1);

end

display(x)

Pentru n = 10, se obţin următoarele rezultate: Introduceti numarul de elemente: 10

x =

1 2 4 8 16 32 64 128 256 512

2. Se citeşte de la tastatură o matrice pătrată A. Se cere să se determine suma elementelor de deasupra diagonalei secundare. % suma elementelor de deasupra diagonalei secundare

%% initializare

A = [];

suma = 0;

%% citire matrice

disp('Introduceti matricea A:')

A = input('');

%% verificari

[row col] = size(A);

if row~=col

disp('Matricea nu este patrata!')

return

end Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 1. Instrucţiuni de control al ciclurilor

11 | P a g e

Page 2: Curs Programare

%% calcul suma

for m = 1:row-1

for n=1:row-m

suma = suma + A(m, n);

end

end

%% afisare

disp(['Suma este: ', num2str(suma)])

Cazul 1 Introduceti matricea A:

[1 2 3 4;

5 6 7 8;

9 0 -1 -2;

-3 -4 -5 -6]

Suma este: 26

Cazul 2 Introduceti matricea A:

[1 2 3;

4 5 6]

Matricea nu este patrata!

Sf C1, 25/02/15. 1.2 Instrucţiunea while-end Instrucţiunea while corespunde structurii repetitive condiţionate anterior, din programarea structurată. Sintaxă: while expresie

instrucţiuni

end

Descriere: Instrucţiunea while este folosită pentru executarea unui grup de instrucţiuni în mod repetat, cât timp expresia de control este adevărată. Dacă expresie este evaluată la o matrice (nu este un scalar), atunci toate elementele acesteia trebuie să aibă valoarea logică adevărat, pentru ca execuţia să continue. Exemple: 1. Să se determine primul număr întreg n pentru care n! este un număr cu 50 de cifre. Se va folosi funcţia factorial(). % primul numar intreg n pentru care n! este un numar cu 50 de cifre

n = 1;

while factorial(n) < 1e49 % 10^49 are 50 de cifre

n = n + 1;

end

disp(['Numarul este: ', num2str(n)])

disp(['n! = ', num2str(factorial(n))])

În urma rulării, rezultă: Numarul este: 41

n! = 33452526613163803000000000000000000000000000000000

1.3 Instrucţiunea break Instrucţiunea break întrerupe execuţia unui ciclu for sau while. Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare

si limbaje II Curs 1. Instrucţiuni de control al ciclurilor

12 | P a g e

Page 3: Curs Programare

Sintaxă: break

Descriere: Instrucţiunile care apar după instrucţiunea break, din corpul unui ciclu for sau while, vor fi ignorate. Următoarea instrucţiune care se execută este cea care urmează după instrucţiunea end, de închidere a ciclului. Exemple: 1. Să se citească de la tastatură un şir de maxim 30 de caractere care să nu conţină caracterul punct (.). Citirea se va încheia dacă se introduce caracterul punct. % citire sir max 30 caractere, fara punct

str = [];

disp('Introduceti sirul de caractere.')

disp('Tastati enter dupa fiecare caracter introdus:')

n = 1;

while n <= 30

str(n) = input('','s');

if str(n) == '.'

break

end

n = n + 1;

end

disp(['Sirul introdus este: ', char(str)])

În urma rulării, rezultă: Introduceti sirul de caractere:

a

e

r

t

y

u

1

@

#

$

.

Sirul introdus este: aertyu1@#$.

1.4 Instrucţiunea continue Instrucţiunea continue transferă controlul următoarei iteraţii a unui ciclu for sau while. Sintaxă: continue

Descriere: Instrucţiunile care rămân în corpul unui ciclu, după instrucţiunea continue, vor fi ignorate. Execuţia se reia de la începutul ciclului unde a fost întâlnită instrucţiunea continue. Exemple: 1. Să se citească de la tastatură un şir de 10 de caractere. În cazul în care se citeşte caracterul punct (.), acesta se va ignora. % citire sir 10 caractere, fara punct

str = [];

disp('Introduceti sirul de caractere.')

disp('Tastati enter dupa fiecare caracter introdus:') Conf.dr.ing. Ovidiu-Aurelian Deteşan –

Programare si limbaje II Curs 1. Instrucţiuni de control al ciclurilor

13 | P a g e

Page 4: Curs Programare

n = 1;

while n <= 10

str(n) = input('','s');

if str(n) == '.'

continue

end

n = n + 1;

end

disp(['Sirul introdus este: ', char(str), ' si are ',num2str(n-1), '

caractere.'])

În urma rulării, rezultă: Introduceti sirul de caractere.

Tastati enter dupa fiecare caracter introdus:

1

2

w

s

.

f

g

.

;

g

f

d

Sirul introdus este: 12wsfg;gfd si are 10 caractere.

1.5 Instrucţiunea return Sintaxă: return

Descriere: Instrucţiunea return, de control al terminării programului, permite ieşirea din program din orice punct al său, înainte de punctul normal de terminare. return mai este folosit şi pentru a incheia modul keyboard.

1 | P a g e

Programare si limbaje II Anul I, AR+ITT 1 Recapitulare Curs 1 + Laborator 3 1.1 Comenzi if else elseif end switch case otherwise for

Page 5: Curs Programare

while break continue return keyboard 1.2 Funcții isprime() isscalar() num2str() str2num() factorial()

Curs 2. Funcții definite de utilizator 2.1 Definirea unei funcții MATLAB. Comanda function Funcțiile sunt rutine de program care acceptă argumente de intrare și returnează argumente de ieșire. Funcțiile pot fi implementate în fișiere M de tip funcție, adică în fișiere text cu extensia .m și care încep cu o linie care conține cuvântul cheie function. Prima linie dintr-un fișier M de tip funcție, cu excepția comentariilor, poartă numele de linie de definire a funcției. Sintaxă: function [out1, out2, ...] = nume_functie(in1, in2, ...)

Descriere: Instrucțiunea function definește funcția nume_functie, care acceptă valorile de intrare in1, in2, ... și returnează valorile de ieșire out1, out2, ... . 2.1.1 Reguli de denumire a unei funcții 1. Numele funcției trebuie obligatoriu să înceapă cu o literă și poate conține caractere alfanumerice și caracterul underscore (_). Numărul maxim de caractere din numele unei funcții trebuie să fie mai mic sau egal cu dimensiunea maximă permisă de către implementarea specifică MATLAB. Pentru verificarea dimensiunii maxime, se folosește comanda namelengthmax. De exemplu, versiunea R2009b permite definirea de funcții cu nume de maxim 63 caractere. >> version Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcții definite de utilizator

2 | P a g e

Page 6: Curs Programare

ans =

7.9.0.529 (R2009b)

>> namelengthmax

ans =

63

În cazul în care numărul de caractere este mai mare, MATLAB va folosi doar primele 63 de caractere (în acest caz) pentru identificarea funcției respective. Deoarece numele de funcții respectă aceleași reguli ca și numele de variabile, se poate folosi funcția isvarname() pentru verificarea valabilității numelui de funcție ales. Rezultatul este de tip boolean. Exemple de nume valide sau invalide de funcții: >> isvarname ipotenuza

ans =

1

>> isvarname Inf

ans =

1

>> isvarname _functie

ans =

0

>> isvarname NumeFoaaaarteLuuungDeFunctie

ans =

1

>> islogical(ans)

ans =

1

2. Numele unei funcții nu poate fi același cu al unui cuvânt cheie MATLAB. Verificarea unui cuvânt cheie MATLAB se face cu ajutorul comenzii iskeyword. >> iskeyword

ans =

'break'

'case'

'catch'

'classdef'

'continue'

'else'

'elseif'

'end'

'for'

'function'

'global'

'if'

'otherwise'

'parfor'

'persistent'

'return'

'spmd'

'switch'

'try'

'while'

3. Numele funcției definite într-un fișier M de tip funcție trebuie să coincidă cu numele fișierului, cu excepția extensiei .m. În cazul în care numele funcției și numele fișierului nu coincid, numele intern al funcției va fi ignorat. De exemplu, funcția tg() definită într-un fișier cu numele tangenta.m, va fi apelată prin expresia tangenta. O funcție nu se poate defini într-un fișier script sau în fereastra de comenzi.

Page 7: Curs Programare

2.1.2 Argumentele unei funcții Dacă o funcție are mai multe argumente de ieșire, acestea se vor include între paranteze pătrate, separate prin virgulă: Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcții definite de utilizator

3 | P a g e

Page 8: Curs Programare

function [perimetru, arie] = cerc(raza)

Dacă o funcție are mai multe argumente de intrare, acestea se vor include între paranteze rotunde, după numele funcției, separate prin virgulă: function aria = dreptunghi(lungime, latime)

Dacă o funcție nu are nici un argument de ieșire, ieșirea se va lăsa vidă: function afisare(text)

sau se vor folosi paranteze pătrate vide: function [] = afisare(text)

Parametrii transmiși funcției (parametrii actuali) nu este obligatoriu să coincidă ca nume cu cei linia de definire a funcției (parametrii formali), dar trebuie să coincidă ca și număr, tip și ordine. 2.1.3 Sfârșitul unei funcții O funcție se poate încheia fie la intâlnirea instrucțiunii end, fie la întâlnirea unei alte linii de definire a unei funcții, fie la sfârșitul fișierului M în care este definită. Utilizarea instrucțiunii end la final este obligatorie doar dacă funcția definită conține una sau mai multe funcții imbricate. 2.2 Spațiul variabilelor unei funcții Fiecare funcție definită într-un fișier M are alocată o zonă de memorie, diferită de spațiul global al variabilelor (Workspace), în care ea funcționează. Această zonă se numește spațiul variabilelor funcției (Function Workspace) şi reprezintă contextul propriu de lucru al funcției date. 2.3 Exemplu de definire a unei funcții ipotenuza.m function c = ipotenuza( a, b )

%IPOTENUZA - Calculeaza ipotenuza unui triunghi dreptunghic, pe baza

%catetelor sale

% Sintaxa: c = ipotenuza( a, b )

c = sqrt(a^2 + b^2);

end

Informații de tip help: >> help ipotenuza

IPOTENUZA - Calculeaza ipotenuza unui triunghi dreptunghic, pe baza

catetelor sale

Sintaxa: c = ipotenuza( a, b )

>> doc ipotenuza

Apelul funcției: >> ipotenuza(2,3)

ans =

3.6056

>> ipotenuza(3,4)

ans =

5

2.4 Tipuri de funcții În mediul MATLAB pot fi definite următoarele tipuri de funcții: Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare

si limbaje II Curs 2. Funcții definite de utilizator

4 | P a g e

Page 9: Curs Programare

2.4.1 Funcții primare Funcția primară reprezintă prima funcție definită într-un fişier M de tip funcție. După funcția primară, în fişierele M pot exista mai multe funcții secundare, folosite ca şi subrutine ale funcției principale. De obicei, funcția primară este singura funcție definită într-un fişier M de tip funcție. 2.4.2 Funcții secundare (subfunctions) Funcțiile secundare sunt definite într-un fişier M de tip funcție, ca şi funcții adiționale funcției primare, acestea fiind vizibile doar din funcția primară sau din alte funcții secundare definite în acelaşi fişier. Exemplu: dreptunghi.m function [ p a ] = dreptunghi( lungime, latime )

%DREPTUNGHI( lungime, latime )

% calculeaza perimetrul si aria unui dreptunghi

p = perimetru( lungime, latime );

a = arie( lungime, latime );

end

function per = perimetru( lungime, latime)

%PERIMETRU( lungime, latime )

% calculeaza perimetrul unui dreptunghi

per = 2 * (lungime + latime);

end

function ari = arie( lungime, latime)

%ARIE( lungime, latime )

% calculeaza aria unui dreptunghi

ari = lungime * latime;

end

Informații de tip help: >> help dreptunghi

DREPTUNGHI( lungime, latime )

calculeaza perimetrul si aria unui dreptunghi

>> help dreptunghi>perimetru

PERIMETRU( lungime, latime )

calculeaza perimetrul unui dreptunghi

>> help dreptunghi>arie

ARIE( lungime, latime )

calculeaza aria unui dreptunghi

Apelul funcției dreptunghi(): >> [p a]= dreptunghi(1,2)

p =

6

a =

2

2.4.3 Funcții imbricate (Nested Functions) Funcțiile imbricate sunt funcții definite în interiorul corpului altor funcții. Se pot defini funcții imbricate pe mai multe nivele, dar nu pot fi definite în interiorul unei instrucțiuni de control al programului (if, else, elseif, switch, for, while, try sau catch). cerc.m function [ p a ] = cerc( raza )

%CERC( raza )

% calculeaza perimetrul si aria unui cerc

p = perimetru( raza );

a = arie( raza );

function per = perimetru( raza ) Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2.

Funcții definite de utilizator

5 | P a g e

Page 10: Curs Programare
Page 11: Curs Programare

%PERIMETRU( raza )

% calculeaza perimetrul unui cerc

per = 2 * pi * raza;

end

function ari = arie( raza )

%ARIE( raza )

% calculeaza aria unui cerc

ari = pi * raza^2;

end

end

Informații de tip help: >> help cerc

CERC( raza )

calculeaza perimetrul si aria unui cerc

>> help cerc>perimetru

PERIMETRU( raza )

calculeaza perimetrul unui cerc

>> help cerc>arie

ARIE( raza )

calculeaza aria unui cerc

Apelul funcției cerc(): >> [p a] = cerc(3)

p =

18.8496

a =

28.2743

2.4.4 Funcții anonime Pentru definirea lor se folosesc manipulatoarele de funcție (function handles): h = @(lista_arg) expr

Exemplu: >> patrat = @(x) x^2

patrat =

@(x)x^2

creează o funcție anonimă care calculează pătratul valorii primite ca și parametru: >> patrat(5)

ans =

25

2.4.5 Funcții supraîncărcate (Overloaded Functions) Funcțiile supraîncărcate sunt utile atunci când dorim să creăm funcții care răspund diferit la date de intrare diferite. Utilizarea funcțiilor supraîncărcate necesită cunoștințe de programare orientată obiectual. Pentru a verifica toate definițiile unei funcții supraîncărcate, se folosește comanda which cu opțiunea -all. De exemplu, la executarea instrucțiunii help pentru funcția disp, se obține următorul rezultat: >> help disp

DISP Display array.

DISP(X) displays the array, without printing the array name. In

all other ways it's the same as leaving the semicolon off an

expression except that empty arrays don't display.

If X is a string, the text is displayed.

See also int2str, num2str, sprintf, rats, format. Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcții definite de utilizator

6 | P a g e

Page 12: Curs Programare

Overloaded methods:

opaque/disp

MException/disp

inline/disp

cdfepoch/disp

timer/disp

serial/disp

memmapfile/disp

ftp/disp

mmreader/disp

audiorecorder/disp

audioplayer/disp

ccsstructure/disp

ccsstring/disp

ccsrtdx/disp

ccspointer/disp

ccsnumeric/disp

ccsfunction/disp

ccsenum/disp

ccsdebug/disp

ccsbitfield/disp

seqgen.disp

modem.disp

fittype/disp

cfit/disp

digitalio/disp

daqchild/disp

analogoutput/disp

analoginput/disp

distribution2d/disp

distribution1d/disp

distributed/disp

codistributor2d/disp

codistributor1d/disp

codistributed/disp

quantizer/disp

qfft/disp

strel/disp

imagemodel/disp

imaqdevice/disp

imaqchild/disp

iviconfigurationstore/disp

instrument/disp

icgroup/disp

xregpointer/disp

ghsmulti/disp

network/disp

opcda/disp

daitem/disp

dagroup/disp

piecewisedistribution/disp

gmdistribution/disp

classregtree/disp

dataset/disp

categorical/disp

sym/disp

vdspdebug/disp

vrworld/disp

vrnode/disp

vrfigure/disp

wptree/disp

wdectree/disp

ntree/disp

Page 13: Curs Programare

laurpoly/disp

laurmat/disp

dtree/disp

Reference page in Help browser

doc disp

Se observă că după afişarea informațiilor help despre funcția de bază, apare lista Overloaded methods, în care sunt afişate toate funcțiile supraîncărcate, având acelaşi nume, disp, denumite în programarea obiectuală, metode. Pentru a verifica toate aparițiile funcției supraîncărcate disp(), se foloseşte comanda: Conf.dr.ing. Ovidiu-

Aurelian Deteşan – Programare si limbaje II Curs 2. Funcții definite de utilizator

7 | P a g e

Page 14: Curs Programare

>> which -all disp

built-in (C:\Program Files\MATLAB\R2008b\toolbox\matlab\lang\disp)

C:\Program Files\MATLAB\R2008b\toolbox\matlab\lang\@opaque\disp.m % opaque method

disp is a built-in method % MException method

disp is a built-in method % hgsetget method

disp is a built-in method % gbtmcos.figure method

disp is a built-in method % handle method

disp is a built-in method % function_handle_workspace method

disp is a built-in method % gbtmcos.uitoolbar method

disp is a built-in method % gbtmcos.uipushtool method

disp is a built-in method % gbtmcos.uitoggletool method

disp is a built-in method % gbtmcos.uitogglesplittool method

disp is a built-in method % gbtmcos.uimenu method

disp is a built-in method % meta.class method

disp is a built-in method % helpUtils.helpProcess method

C:\Program Files\MATLAB\R2008b\toolbox\matlab\lang\@MException\disp.m % MException

method

C:\Program Files\MATLAB\R2008b\toolbox\matlab\funfun\@inline\disp.m % inline method

C:\Program Files\MATLAB\R2008b\toolbox\matlab\imagesci\@cdfepoch\disp.m % cdfepoch

method

C:\Program Files\MATLAB\R2008b\toolbox\matlab\iofun\@timer\disp.m % timer method

C:\Program Files\MATLAB\R2008b\toolbox\matlab\iofun\@serial\disp.m % serial method

C:\Program Files\MATLAB\R2008b\toolbox\matlab\iofun\@memmapfile\disp.m % memmapfile

method

C:\Program Files\MATLAB\R2008b\toolbox\matlab\iofun\@ftp\disp.m % ftp method

C:\Program Files\MATLAB\R2008b\toolbox\matlab\audiovideo\@mmreader\disp.m % mmreader

method

C:\Program Files\MATLAB\R2008b\toolbox\matlab\audiovideo\@audiorecorder\disp.m %

audiorecorder method

C:\Program Files\MATLAB\R2008b\toolbox\matlab\audiovideo\@audioplayer\disp.m %

audioplayer method

C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsstructure\disp.m %

ccsstructure method

C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsstring\disp.m % ccsstring

method

C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsrtdx\disp.m % ccsrtdx

method

C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccspointer\disp.m % ccspointer

method

C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsnumeric\disp.m % ccsnumeric

method

C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsfunction\disp.m %

ccsfunction method

C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsenum\disp.m % ccsenum

method

C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsdebug\disp.m % ccsdebug

method

C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsbitfield\disp.m %

ccsbitfield method

C:\Program Files\MATLAB\R2008b\toolbox\comm\comm\@seqgen\disp.m % seqgen method

C:\Program Files\MATLAB\R2008b\toolbox\comm\comm\@modem\disp.m % modem method

C:\Program Files\MATLAB\R2008b\toolbox\curvefit\curvefit\@fittype\disp.m % fittype

method

C:\Program Files\MATLAB\R2008b\toolbox\curvefit\curvefit\@cfit\disp.m % cfit method

C:\Program Files\MATLAB\R2008b\toolbox\daq\daq\@digitalio\disp.m % digitalio method

C:\Program Files\MATLAB\R2008b\toolbox\daq\daq\@daqchild\disp.m % daqchild method

C:\Program Files\MATLAB\R2008b\toolbox\daq\daq\@analogoutput\disp.m % analogoutput

method

C:\Program Files\MATLAB\R2008b\toolbox\daq\daq\@analoginput\disp.m % analoginput

method

C:\Program Files\MATLAB\R2008b\toolbox\distcomp\parallel\@distribution2d\disp.m %

distribution2d method

Page 15: Curs Programare

C:\Program Files\MATLAB\R2008b\toolbox\distcomp\parallel\@distribution1d\disp.m %

distribution1d method

C:\Program Files\MATLAB\R2008b\toolbox\distcomp\parallel\@distributed\disp.m %

distributed method

C:\Program Files\MATLAB\R2008b\toolbox\distcomp\parallel\@codistributor2d\disp.m %

codistributor2d method

C:\Program Files\MATLAB\R2008b\toolbox\distcomp\parallel\@codistributor1d\disp.m %

codistributor1d method

C:\Program Files\MATLAB\R2008b\toolbox\distcomp\parallel\@codistributed\disp.m %

codistributed method Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcții definite de utilizator

8 | P a g e

Page 16: Curs Programare

C:\Program Files\MATLAB\R2008b\toolbox\filterdesign\quantization\@quantizer\disp.m %

quantizer method

C:\Program Files\MATLAB\R2008b\toolbox\filterdesign\quantization\@qfft\disp.m % qfft

method

C:\Program Files\MATLAB\R2008b\toolbox\images\images\@strel\disp.m % strel method

C:\Program Files\MATLAB\R2008b\toolbox\images\imuitools\@imagemodel\disp.m %

imagemodel method

C:\Program Files\MATLAB\R2008b\toolbox\imaq\imaq\@imaqdevice\disp.m % imaqdevice

method

C:\Program Files\MATLAB\R2008b\toolbox\imaq\imaq\@imaqchild\disp.m % imaqchild method

C:\Program

Files\MATLAB\R2008b\toolbox\instrument\instrument\@iviconfigurationstore\disp.m %

iviconfigurationstore method

C:\Program Files\MATLAB\R2008b\toolbox\instrument\instrument\@instrument\disp.m %

instrument method

C:\Program Files\MATLAB\R2008b\toolbox\instrument\instrument\@icgroup\disp.m % icgroup

method

C:\Program Files\MATLAB\R2008b\toolbox\mbc\mbc\@xregpointer\disp.m % xregpointer

method

C:\Program Files\MATLAB\R2008b\toolbox\multilink\multilink\@ghsmulti\disp.m % ghsmulti

method

C:\Program Files\MATLAB\R2008b\toolbox\nnet\nnet\@network\disp.m % network method

C:\Program Files\MATLAB\R2008b\toolbox\opc\opc\@opcda\disp.m % opcda method

C:\Program Files\MATLAB\R2008b\toolbox\opc\opc\@daitem\disp.m % daitem method

C:\Program Files\MATLAB\R2008b\toolbox\opc\opc\@dagroup\disp.m % dagroup method

C:\Program Files\MATLAB\R2008b\toolbox\stats\@piecewisedistribution\disp.m %

piecewisedistribution method

C:\Program Files\MATLAB\R2008b\toolbox\stats\@gmdistribution\disp.m % gmdistribution

method

C:\Program Files\MATLAB\R2008b\toolbox\stats\@classregtree\disp.m % classregtree

method

C:\Program Files\MATLAB\R2008b\toolbox\shared\statslib\@dataset\disp.m % dataset

method

C:\Program Files\MATLAB\R2008b\toolbox\shared\statslib\@categorical\disp.m %

categorical method

C:\Program Files\MATLAB\R2008b\toolbox\symbolic\@sym\disp.m % sym method

C:\Program Files\MATLAB\R2008b\toolbox\vdsplink\vdsplink\@vdspdebug\disp.m % vdspdebug

method

C:\Program Files\MATLAB\R2008b\toolbox\vr\vr\@vrworld\disp.m % vrworld method

C:\Program Files\MATLAB\R2008b\toolbox\vr\vr\@vrnode\disp.m % vrnode method

C:\Program Files\MATLAB\R2008b\toolbox\vr\vr\@vrfigure\disp.m % vrfigure method

C:\Program Files\MATLAB\R2008b\toolbox\wavelet\wavelet\@wptree\disp.m % wptree method

C:\Program Files\MATLAB\R2008b\toolbox\wavelet\wavelet\@wdectree\disp.m % wdectree

method

C:\Program Files\MATLAB\R2008b\toolbox\wavelet\wavelet\@ntree\disp.m % ntree method

C:\Program Files\MATLAB\R2008b\toolbox\wavelet\wavelet\@laurpoly\disp.m % laurpoly

method

C:\Program Files\MATLAB\R2008b\toolbox\wavelet\wavelet\@laurmat\disp.m % laurmat

method

C:\Program Files\MATLAB\R2008b\toolbox\wavelet\wavelet\@dtree\disp.m % dtree method

Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcții definite de utilizator

9 | P a g e

Page 17: Curs Programare

2.4.6 Funcții private Funcțiile private sunt funcții definite în subdirectoare cu numele special private. Ele sunt vizibile doar din cadrul funcțiilor şi fişierelor script care îndeplinesc următoarele condiții: 1. O funcție care apelează o funcție privată trebuie să fie definită într-un fişier M situat într-un director imediat deasupra subdirectorului private. 2. Un script care apelează o funcție privată trebuie să fie apelat dintr-un fişier M de tip funcție care are acces la funcția privată, conform regulii anterioare. De exemplu, presupunând că directorul cerc_dir se află în calea de căutare MATLAB, un subdirector din cerc_dir, având numele private, poate conține funcții care pot fi apelate doar din funcțiile definite în cerc_dir. Se definieşte funcția cerc() în directorul cerc_dir. function [per, ari] = cerc( raza )

%CERC( raza )

% Calculeaza perimetrul si aria unui cerc

per = perimetru(raza);

ari = arie(raza);

end

Se definesc funcțiile perimetru() și arie() în directorul private din directorul cerc_dir. function per = perimetru( raza )

%PERIMETRU( raza )

% Calculeaza perimetrul unui cerc

per = 2*pi*raza;

end

function ari = arie( raza )

%ARIE( raza )

% Calculeaza aria unui cerc

ari = pi*raza^2;

end

La apelul funcției cerc(), aceasta apelează, la rândul ei, funcțiile private perimetru() şi arie(). >> [p a]=cerc(5)

p =

31.4159

a =

78.5398

Obținerea informațiilor help despre cele trei funcții se face astfel: >> help cerc

CERC( raza )

Calculeaza perimetrul si aria unui cerc

>> help private/perimetru

PERIMETRU( raza )

Calculeaza perimetrul unui cerc

>> help private/arie

ARIE( raza )

Calculeaza aria unui cerc

Pentru afişarea informațiilor de tip help despre funcțiile private, numele acestora se prefixează cu

expresia private/.

1 | P a g e

Programare si limbaje II Anul I, AR+ITT 1 Recapitulare

Page 18: Curs Programare

Curs 2 + Laborator 3 + Laborator 4 1.1 Comenzi function

namelengthmax

version

iskeyword

1.2 Funcții isvarname()

Curs 3. Funcții predefinite MATLAB. Calculul simbolic în MATLAB 3.1 Funcții matematice predefinite 3.1.1 Funcții trigonometrice acos Arc cosinus; rezultat în radiani acosd Arc cosinus; rezultat în grade acosh Arc cosinus hiperbolic acot Arc cotangentă; rezultat în radiani acotd Arc cotangentă; rezultat în grade acoth Arc cotangentă hiperbolică asin Arc sinus; rezultat în radiani asind Arc sinus; rezultat în grade asinh Arc sinus hiperbolic atan Arc tangentă; rezultat în radiani atan2 Arc tangent 2 (cu reprezentare în 4 cadrane) atand Arc tangentă; rezultat în grade atanh Arc tangent hiperbolică cos Cosinus cu argument în radiani cosd Cosinus cu argument în grade cosh Cosinus hiperbolic cot Cotangentă cu argument în radiani cotd Cotangentă cu argument în grade coth Cotangentă hiperbolică hypot Rădăcină pătrată din suma pătratelor sin Sinus cu argument în radiani sind Sinus cu argument în grade sinh Sinus hiperbolic cu argument în radiani tan Tangentă cu argument în radiani tand Tangentă cu argument în grade tanh Tangentă hiperbolică. 3.1.2 Funcții exponențiale exp Exponenţială expm1 Calculează exp(x)-1 cu precizie mare, pentru valori mici ale lui x log Logaritm natural log10 Logaritm în baza 10 log1p Calculează log(1+x) cu precizie mare, pentru valori mici ale lui x nextpow2 Următoarea putere mare a lui 2 Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 3.

Funcţii predefinite în MATLAB. Calculul simbolic în MATLAB

2 | P a g e

Page 19: Curs Programare

nthroot Rădăcină reală de ordinul n din numere reale reallog Logaritm natural pentru tablouri de numere reale nenegative realsqrt Rădăcină pătrată pentru tablouri de numere reale nenegative sqrt Rădăcină pătrată. 3.2 Calculul simbolic în MATLAB Spre deosebire de calculul numeric, unde atât datele de intrare, cât şi rezultatele reprezintă valori numerice, de obicei numere reale, calculul simbolic operează cu obiecte simbolice, datele de intrare fiind date simbolice şi, uneori, numerice, iar datele de ieşire expresii algebrice. Avantajul utilizării calculului simbolic în ingineria mecanică este acela că generează direct ecuaţiile modelului matematic al mecanismului, dispozitivului sau fenomenului studiat, sub formă simbolică. Datele simbolice din aceste ecuaţii pot fi prelucrate în continuare prin substituţie numerică, utilizând valori concrete, caracteristice atât structurii mecanice analizate, cât şi a parametrilor de funcţionare a acestuia, realizându-se simularea numerică a mecanismului sau dispozitivului, în condiţiile de funcţionare impuse. Dintre programele software care implementează calculul simbolic se pot enumera: Maple, Mathematica, MATLAB, Derive. Programele realizate în cadrul acestei lucrări conţin calcule simbolice încorporate în mediul numeric al MATLAB. Aceste programe utilizează funcţii şi comenzi aparţinând modulului Symbolic Math Toolbox din MATLAB. Acest modul suplimentează facilităţile numerice şi grafice ale mediului MATLAB, adăugând câteva tipuri diferite de calcule matematice, printre care se menţionează: calcul diferenţial, integral, limite, sume şi serii Taylor;

algebră lineară: inverse, determinanţi, valori proprii, valori singulare, descompunere şi forme canonice ale matricelor simbolice;

metode de simplificare a expresiilor algebrice;

soluţii simbolice şi numerice ale ecuaţiilor algebrice şi diferenţiale;

funcţii speciale din matematica aplicată clasică;

evaluarea numerică a funcţiilor matematice cu orice precizie specificată. Motorul de calcul care stă la baza funcţiilor simbolice este nucleul sistemului MuPAD, cu care se poate interacţiona prin două moduri: 1. Prin modulul Symbolic Math Toolbox, care este o colecţie de peste 100 de funcţii MATLAB care asigură accesul la nucleul MuPAD, folosind o sintaxă și un stil specifice limbajului MATLAB. 2. Folosind interfaţa grafică MuPAD, pentru realizarea calculelor în limbajul MuPAD. 3.2.1 Obiecte simbolice Modulul Symbolic Math Toolbox defineşte un nou tip de dată MATLAB denumit obiect simbolic sau sym. Din punct de vedere al reprezentării interne, un obiect simbolic este o structură de date care memorează reprezentarea sub formă de şir de caractere a simbolului. Modulul Symbolic Math Toolbox utilizează obiecte simbolice pentru a reprezenta variabile, expresii şi matrice simbolice. 3.2.2.1 Funcția sym() Funcţia sym(), specifică modulului Symbolic Math Toolbox, creează numere, variabile sau obiecte simbolice. Sintaxa: S = sym(A) x = sym('x') x = sym('x','real') k = sym('k','positive') x =

sym('x','clear') S = sym(A,flag)

Forma S = sym(A) construiește un obiect S aparţinând clasei sym, pornind de la valorile lui A. Dacă argumentul de intrare este un șir de caractere, rezultatul va fi o constantă sau o variabilă simbolică. Dacă argumentul de intrare este un scalar numeric sau o matrice numerică, rezultatul va fi o reprezentare simbolică a valorilor numerice date. Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II

Curs 3. Funcţii predefinite în MATLAB. Calculul simbolic în MATLAB

Page 20: Curs Programare

3 | P a g e

Page 21: Curs Programare

Opţiunea 'real' presupune că variabila simbolică este de tip real, adică partea imaginară este zero. Opţiunea 'positive' creează o variabilă simbolică este de tip real și pozitiv. Opţiunea 'clear' construiește variabile simbolice pur formale, fără proprietăţi suplimentare. Din motive de compatibilitate cu versiunile anterioare, opţiunea 'unreal' are exact același efect. Parametrul flag poate lua valorile: 'r', 'd', 'e', sau 'f' și convertește o constantă scalară sau matriceală la forma simbolică. Parametrul flag

Reprezentare

'r' Raţional 'd' Zecimal 'e' Estimare de erori 'f' Virgulă flotantă

1 | P a g e Programare si limbaje II Anul I, AR+ITT 1 Recapitulare

Curs 3 + Laborator 5 + Laborator 6 1.1 Comenzi syms

1.2 Funcții acos()

acosd()

acosh()

acot()

acotd()

acoth()

asin()

asind()

asinh()

atan()

atan2()

atand()

atanh()

cos()

cosd()

cosh()

cot()

cotd()

coth()

hypot()

sin()

Page 22: Curs Programare

sind()

sinh()

tan()

tand()

tanh()

exp()

expm1()

log()

log10()

log1p()

nextpow2()

nthroot()

reallog()

realsqrt()

sqrt()

sym()

subs()

Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

2 | P a g e

Recapitulare parțială a elementelor de limbaj MATLAB 1.1 Operatori

Operatori aritmetici Operatori relaţionali Operatori logici Operatori pe biţi Operatori pe mulţimi 1.2 Comenzi break

case

continue

demo

diary

doc

echo

edit

else

elseif

end

for

format

Page 23: Curs Programare

function

help

if

iskeyword

keyboard

load

more

namelengthmax

open

otherwise

return

save

switch

syms

type

version

while

whos

1.3 Variabile ans

1.4 Constante eps

false

i

Inf

j

NaN

pi

true

1.5 Funcții acos()

acosd()

acosh()

acot()

Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

3 | P a g e acotd()

acoth()

asin()

asind()

asinh()

atan()

atan2()

atand()

atanh()

cellplot()

char()

cos()

cosd()

cosh()

cot()

Page 24: Curs Programare

cotd()

coth()

cumprod()

cumsum()

det()

diag()

disp()

display()

double()

exp()

expm1()

eye()

factorial()

find()

full()

functions()

geomean()

hypot()

input()

int16()

int32()

int64()

int8()

intmax()

intmin()

inv()

ischar()

isfinite()

isinf()

isnan()

isprime()

isscalar()

issparse()

isvarname()

length()

log()

log10()

log1p()

logical()

magic()

max()

mean()

mean()

min()

nextpow2()

nnz()

nonzeros()

nthroot()

num2str()

ones()

plot()

prod()

rand()

randn()

Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si

Page 25: Curs Programare

limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

4 | P a g e reallog()

realmax()

realmin()

realsqrt()

repmat()

round()

sin()

sind()

single()

sinh()

size()

sort()

sparse()

speye()

spones()

sprintf()

spy()

sqrt()

sscanf()

str2num()

struct()

subs(S)

sum()

sym()

tan()

tand()

tanh()

title()

tril()

triu()

uint16()

uint32()

uint64()

uint8()

xlabel()

ylabel()

zeros()

1.6 Caractere speciale . Punct

zecimal

. Operaţii cu

tablouri

( )

Parantezele

rotunde

[ ]

Parantezele

pătrate

, Virgula

; Punct

virgulă

Page 26: Curs Programare

: Două puncte

@numefunctie

{ } Acolade

% Comentariu

%% Celule de

cod

Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

5 | P a g e

Curs 4. Reprezentări grafice 2D şi 3D în MATLAB 4.1 Reprezentări grafice 2D Grafice pentru funcţiile cu o singură variabilă. 4.1.1 Reprezentarea funcțiilor elementare. Funcția plot() Sintaxă: plot(Y)

plot(X1,Y1,..

.)

plot(X1,Y1,Li

neSpec,...)

plot(...,'Prop

ertyName',PropertyValue,...

)

plot(axes_han

dle,...) h =

plot(...)

hlines =

plot('v6',...

)

plot(Y)

reprezintă grafic coloanele tabloului Y în raport cu indicele acestora, dacă Y

Page 27: Curs Programare

este un tablou de numere reale. Dacă Y conţine valori complexe, plot(Y) este echivalent cu plot(real(Y),

imag(Y)). În toate celelalte cazuri de utilizare ale lui plot, componenta imaginară este ignorată. Observaţie: real(Y)

returnează partea reală a variabilei complexe Y. imag(Y)

returnează partea imaginară a variabilei complexe Y. plot(X1,Y1,..

.) reprezintă grafic toate liniile definite prin perechi (Xn , Yn). Dacă doar una dintre cele două variabile Xn şi Yn este matrice, se va face reprezentarea grafică a vectorului, în raport cu liniile sau coloanele din matrice, în funcţie potrivirea dimensională dintre vector si matrice (dacă vectorul este linie, plotarea se va face în raport cu liniile din

Page 28: Curs Programare

matrice, iar daca este coloană, în raport cu coloanele din matrice). Dacă Xn este scalar şi Yn este un vector, valorile din Yn vor fi afişate ca şi puncte discrete, aranjate după o direcţie verticală, în dreptul valorii Xn. plot(X1,Y1,Li

neSpec,...)

plotează toate liniile definite de tripletele Xn,Yn,LineSpe

c, unde LineSpec este un specificator de linie, care determină tipul de linie, simbolul punctelor de pe grafic şi culoarea liniei trasate. Tripletele Xn,Yn,LineSpe

c pot fi combinate cu pereche de forma Xn,Yn, astfel: plot(X1,Y1,X2

,Y2,LineSpec,

X3,Y3). 4.1.2 Definirea stilurilor şi culorilor de linie 4.1.2.1 Specificarea tipului de linie în reprezentările 2D. Opțiunea LineSpec

Page 29: Curs Programare

Proprietăţile liniei utilizate pentru reprezentările grafice pot fi specificate de către programator, astfel încât să acesta să deţină controlul asupra: Stilului de linie; Grosimii liniei; Culorii; Tipului de marker; Mărimii marker-ului; Culorii conturului marker-ului; Culorii interiorului marker-ului. Stilurile de linie, tipurile de markeri şi culorile dorite pot fi specificate prin şiruri de caractere, pe baza următoarelor tabele: Tab. 4.1 Specificatori de stiluri de linie Specificator Stil de linie -

Linie continuă (implicit) --

Linie întreruptă Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice

Page 30: Curs Programare

2D şi 3D în MATLAB

6 | P a g e :

Linie punctată -.

Linie-punct Tab. 4.2 Specificatori de marker Specificator Stil de marker +

Semn plus O

Cerc *

Asterisc .

Punct (dimensiunea se schimbă doar dacă valoarea specificată este mai mare sau egală cu 5) X

Cruce oblică 'square' or s

Pătrat 'diamond' or

d

Diamant (romb) ^

Triunghi cu vârful în sus V

Triunghi cu vârful în jos >

Triunghi cu vârful la dreapta <

Triunghi cu vârful la stânga 'pentagram'

or p

Stea cu cinci colţuri (pentagramă)

Page 31: Curs Programare

'hexagram' or

h

Stea cu şase colţuri (hexagramă) Tab. 4.3 Specificatori de culoare Specificator Culoare R

Roşu G

Verde B

Albastru C

Cyan (albastru deschis) M

Magenta Y

Galben K

Negru W

Alb Ex1. Să se reprezinte grafic funcţia sin(x), pe intervalul [0, 2π], cu pasul de parcurgere π/12, folosind linie punctată, marker triunghi cu vârful în sus, atât markerul, cât şi linia reprezentându-se prin culoarea verde. Fişierul script C04S1.m a = input('a

= ');

b = input('b

= ');

h = input('h

= ');

Page 32: Curs Programare

x = a:h:b;

y = sin(x);

plot(x, y,

':^g')

În urma rulării, se introduc următoarele date: a = 0 b = 2*pi h = pi/12 şi se obţine graficul din figura 4.1. Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

7 | P a g e Fig. 4.1 Graficul funcţiei sin(x), folosind opţiunile ':^g'

Dacă se dorește reprezentarea grafică a unei funcţii fără linia ce unește markerii, stilul de linie nu trebuie specificat în opţiunea LineSpec. De exemplu, în figura 4.2, se utilizează marker-ul 'd', de culoare roşie, fără linie. Fig. 4.2 Graficul funcţiei sin(x), folosind opţiunile 'dr'

4.1.2.2 Specificarea culorii. Opțiunea ColorSpec Există trei moduri de a specifica o

Page 33: Curs Programare

culoare în MATLAB: Tripletul RGB; Numele scurt; Numele lung. Tripletul RGB este un vector linie cu trei elemente, reprezentând intensităţile, în domeniul [0, 1], ale componentelor R (Red - Roşu), G (Green - Verde) şi B (Blue - Albastru) ale culorii. Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

8 | P a g e În tabelul 4.4 sunt prezentate echivalenţele între cele trei moduri de specificare ale aşa-numitelor culori fixe (cele opt culori predefinite). Tab. 4.4 Modurile de specificare ale culorilor predefinite Triplet RGB Nume scurt Nume lung [1 1 0]

y

yellow

[1 0 1]

m

magenta

[0 1 1]

c

cyan

Page 34: Curs Programare

[1 0 0]

r

red

[0 1 0]

g

green

[0 0 1]

b

blue

[1 1 1]

w

white

[0 0 0]

K

black

Modificarea culorii de fundal a ferestrei grafice se obţine apelând funcţia whitebg(Color

Spec). De exemplu, obţinerea culorii albastru pe fundalul ferestrei de tip figură (fig. 4.3) se realizează folosind apelul whitebg('blue')

, a se vedea fişierul script C04S2.m. Deoarece noile figuri definite utilizează ultima culoare de fundal definită, pentru revenirea la culoarea implicită, se va folosi apelul whitebg('w'). Fig. 4.3 Graficul funcţiei sin(x), pe fundal albastru Ex2. Să se reprezinte grafic funcţia sin(x), pe intervalul [0, 2π],

Page 35: Curs Programare

cu pasul de parcurgere π/12, folosind linie punctată, marker triunghi cu vârful în sus, atât markerul, cât şi linia reprezentându-se prin culoarea roşu. Se va alege drept culoare de fundal, albastru. Fişierul script C04S2.m a = input('a =

');

b = input('b =

');

h = input('h =

');

x = a:h:b;

y = sin(x);

whitebg('blue')

plot(x, y,

':^r')

whitebg('w')

Pentru obţinerea culorii roz pe fundalul zonei axelor (fig. 4.4), se folosește funcţia set(gcf,'Colo

r',[1,0.4,0.6

])

unde gcf reprezintă manipulatorul figurii curente. Forma generală a funcţiei set() este următoarea: set(H,'Property

Name',PropertyValue,...)

Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

Page 36: Curs Programare

9 | P a g e În exemplul de mai sus, proprietatea figurii curente, care urmează să fie modificată, poartă numele 'Color', iar valoarea acesteia va fi specificată prin tripletul RGB reprezentat de vectorul linie [1, 0.4, 0.6]. Fig. 4.4 Graficul funcţiei cu opţiunile din fig 4.2, dar cu fundal roz pe zona axelor 4.1.2.3 Specificarea altor caracteristici ale liniei și markerilor

LineWidth – specifică grosimea liniei, în puncte (1 punct = 1/72 inci). Grosimea implicită este de 0.5 puncte. MarkerEdgeCol

or – setează culoarea conturului markerului, pentru markerii de tip contur închis: cerc, pătrat, romb, pentagramă, hexagramă, triunghi. Culoarea se poate specifica

Page 37: Curs Programare

folosind opţiunea ColorSpec. Opţiunea none determină desenarea unui contur transparent. MarkerFaceCol

or – setează culoarea de umplere a markerilor de tip contur închis. Culoarea de umplere se poate specifica folosind opţiunea ColorSpec. Opţiunea none produce un interior transparent de marker. MarkerSize – specifică mărimea unui marker, în puncte. Valoarea implicită este de 6 puncte. Markerul de tip punct este reprezentat la o dimensiune de 1/3 din mărimea specificată. Ex3. Să se reprezinte grafic funcţia cos(ω*τ), unde ω parcurge intervalul [-π, π], cu pasul de parcurgere π/10, iar τ parcurge intervalul [1, 10], acesta fiind împărţit în acelaşi număr de puncte ca şi intervalul

Page 38: Curs Programare

parcurs de variabila ω. Graficul se va reprezenta prin linie continuă, albastră, cu markeri în formă de cerc, grosimea liniei va fi de 2 puncte, culoarea conturului markerilor va fi mov, mărimea markerilor va fi de 8 puncte, iar culoarea de umplere a acestora va fi galben. Fişier script C04S3.m omega = -

pi:pi/10:pi;

tau =

1:9/(length(o

mega)-1):10;

y =

cos(omega.*ta

u);

plot(omega,y,

'-

bo','LineWidt

h',2,...

'MarkerEdgeCo

lor',[0.5 0

1],...

'MarkerFaceCo

lor','y',...

'MarkerSize',

8)

Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

10 | P a g e Fig. 4.5 Graficul funcţiei cos(ω*τ) 4.1.3 Stabilirea titlului si a etichetelor

Page 39: Curs Programare

axelor. Funcțiile title(), xlabel(), ylabel(). Afișarea de text formatat Titlul unui grafic reprezintă un şir de caractere afişat deasupra zonei de reprezentare grafică. El poate fi specificat folosind funcţia title(). Exemplu: pentru graficul reprezentat în fig. 4.5, să se stabilească un titlu sugestiv. Prin adăugarea liniei title('Graficul

functiei

cos(\omega*\tau

)',

'FontWeight',

'bold')

imediat după apelul funcţiei plot(), va apărea rezultatul din fig. 4.6. De remarcat că literele grecești ω și τ au fost scrise folosind secvenţele \omega și \tau, incluse în șirul de caractere din descrierea titlului. Fig. 4.6 Specificarea unui titlu graficului funcţiei cos(ω*τ) Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si

Page 40: Curs Programare

limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

11 | P a g e Lista comenzilor TeX care pot fi utilizate pentru a produce apariţia caracterelor speciale în legendă este prezentată în tabelul 4.5. Tab. 4.5 Caractere speciale și secvenţe prin care acestea pot fi reproduse în MATLAB Character Sequence Symbol Character Sequence Symbol Character Sequence Symbol \alpha α \upsilon υ \sim ~ \beta β \phi Φ \leq ≤ \gamma γ \chi χ \infty ∞ \delta δ \psi ψ \clubsuit ♣

\epsilon ɛ \omega ω \diamondsuit

♦ \zeta ζ \Gamma Γ \heartsuit ♥

\eta η \Delta Δ \spadesuit ♠

\theta Θ \Theta Θ \leftrightarr

ow ↔ \vartheta ϑ \Lambda Λ \leftarrow ←

Page 41: Curs Programare

\iota ι \Xi Ξ \uparrow ↑ \kappa κ \Pi Π \rightarrow

→ \lambda λ \Sigma Σ \downarrow ↓ \mu μ \Upsilon ϒ \circ º \nu ν \Phi Φ \pm ± \xi ξ \Psi Ψ \geq ≥ \pi π \Omega Ω \propto ∝ \rho ρ \forall ∀ \partial ∂ \sigma σ \exists ∃ \bullet • \varsigma ς \ni ∍ \div ÷ \tau τ \cong ≅ \neq ≠ \equiv ≡ \approx ≈ \aleph ℵ \Im ℑ \Re ℜ \wp ℘ \otimes ⊗ \oplus ⊕ \oslash ∅ \cap ∩ \cup ∪ \supseteq ⊇ \supset ⊃ \subseteq ⊆ \subset ⊂ \int ∫ \in ∈ \o ο \rfloor ë \lceil é \nabla ∇ \lfloor û \cdot · \ldots ... \perp ⊥ \neg ¬ \prime ´ \wedge ∧ \times x \0 ∅ \rceil ù \surd √ \mid | \vee ∨ \varpi ϖ \copyright ©

Page 42: Curs Programare

\langle ∠ \rangle ∠ Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

12 | P a g e Etichetele unui grafic reprezintă şiruri de caractere afişate în apropierea axelor, cu scopul de a oferi informaţii despre conţinutul valorilor de pe axele respective. Ele pot fi specificate folosind funcţiile xlabel(), ylabel(), pe graficele 2D, respectiv xlabel(), ylabel()

şi zlabel() pe graficele 3D. Exemplu: pentru graficul reprezentat în fig. 4.6, să se stabilească etichete sugestive pe axe. Prin adăugarea liniilor: xlabel('\omeg

a')

ylabel('cos(\

omega*\tau)')

imediat după apelul funcţiei title(), va apărea rezultatul din fig. 4.7. Fig. 4.7 Specificarea

Page 43: Curs Programare

etichetelor pe axele graficului funcţiei cos(ω*τ) 4.1.4 Afişarea grilei. Comanda grid Grila reprezintă un set de linii orizontale și verticale, prezente într-o fereastră grafică, cu rolul de a facilita interpretarea graficului sau culegerea de date de pe graficul funcţiei reprezentate. Exemplu: pentru graficul reprezentat în fig. 4.7, să se afișeze grila. Prin adăugarea liniei: grid on

imediat după apelul funcţiei ylabel(), va apărea rezultatul din fig. 4.8. Comanda grid în varianta grid off

va realiza dezactivarea grilei. Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

13 | P a g e Fig. 4.8 Afișarea grilei pentru

Page 44: Curs Programare

graficul funcţiei cos(ω*τ) 4.1.5 Reprezentări grafice multiple În situaţia în care este necesară reprezentarea mai multor grafice în aceeaşi fereastră de tip figură, se pot specifica la apelul funcţiei plot() mai multe seturi de date care să fie reprezentate, fiecare cu setările respective de stil de linie, markeri etc. Ex4. Să se reprezinte simultan graficele funcţiilor sin 2x, respectiv cos 2x, în acelaşi sistem de axe carteziene, pentru valorile lui x cuprinse în intervalul [0, π]. Să se reprezinte titlul graficelor, etichetele pe axe, grila. Fişierul script C04S4.m x = 0:pi/20:pi;

y1 = sin(2*x);

y2 = cos(2*x);

plot(x,y1,'b-

',x,y2,'g--',

'LineWidth', 2)

title('Reprezen

tari grafice

multiple')

xlabel('Valoril

e lui x')

ylabel('sin(2*x

), cos(2*x)')

grid on

Page 45: Curs Programare

Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

14 | P a g e Fig. 4.9 Reprezentări grafice multiple 4.1.6 Definirea legendei. Funcția legend() În cazul reprezentărilor grafice multiple, pentru a face distincţie între reprezentările grafice, este utilă definirea unei legende. În acest scop se va folosi funcţia legend(). Adăugând la scriptul C04S4.m linia legend('sin(2*x

)', 'cos(2*x)')

aceasta va produce apariţia legendei, prezente în fig. 4.10. Fig. 4.10 Definirea unei legende 4.1.7 Comanda hold Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

15 | P a g e În situaţia în care se doreşte reprezentarea grafică a mai

Page 46: Curs Programare

multor funcţii în aceeaşi fereastră, dar adăugarea funcţiilor suplimentare se doreşte să se facă în etape distincte în program, se poate utiliza comanda hold. Prin utilizarea opţiunii hold on

graficul curent va fi menţinut în fereastra grafică, iar graficele ulterioare vor fi reprezentate în acelaşi sistem de axe, până la întâlnirea comenzii hold off

Comanda hold fără niciun parametru comută starea acesteia, din on în off şi invers. Fişierul script de mai jos are, prin urmare, acelaşi efect cu cel anterior. Fişierul script C04S5.m x = 0:pi/20:pi;

y1 = sin(2*x);

y2 = cos(2*x);

plot(x,y1,'b-

','LineWidth',

2)

hold on

plot(x,y2,'g--

', 'LineWidth',

2)

title('Reprezen

tari grafice

multiple')

xlabel('Valoril

e lui x')

Page 47: Curs Programare

ylabel('sin(2*x

), cos(2*x)')

grid on

legend('sin(2*x

)', 'cos(2*x)')

hold off

4.1.8 Tipărirea graficului sau exportarea într-un fişier grafic. Comanda print

În vederea tipăririi la imprimantă a graficului dintr-o fereastră de tip figură, se poate utiliza comanda print. De o importanţă deosebită o are exportarea graficului într-un fișier grafic, de exemplu JPEG pe 24 biţi și importarea acestuia într-un document de tip office. Comanda >>print -djpeg fig_sin_cos introdusă în script sau chiar în fereastra de comenzi, produce exportarea ferestrei curente (de exemplu, reprezentarea grafică multiplă de la ultimul exemplu), în fișierul grafic fig_sin_cos.jpg. Salvarea acestui fișier se face în directorul curent, pentru o

Page 48: Curs Programare

consultare ulterioară. 4.1.9 Divizarea ferestrei grafice. Funcția subplot() În funcţie de necesitate, fereastra grafică poate fi împărţită într-un tablou de m x n ferestre mai mici, în fiecare dintre ele putându-se reprezenta grafic una sau mai multe funcţii. Ferestrele sunt numerotate în ordine, pornind de la 1, până la mxn. Ex5. Să se reprezinte grafic funcţiile sin 3πx, cos 3πx, sin 6πx, cos 6πx, într-un tablou de 2x2 subplot-uri. Fișierul script C04S6.m x = 0:0.01:1;

subplot(221)

plot(x,sin(3*pi

*x))

xlabel('x')

ylabel('sin

3\pix')

subplot(222)

plot(x,cos(3*pi

*x))

xlabel('x')

ylabel('cos

3\pix')

subplot(223)

plot(x,sin(6*pi

*x))

xlabel('x')

ylabel('sin

6\pix')

subplot(224)

Page 49: Curs Programare

plot(x,cos(6*pi

*x))

xlabel('x')

ylabel('cos

6\pix')

În scriptul de mai sus, apelul funcţiei subplot(221), similar subplot(2,2,1), produce divizarea ferestrei într-un tablou 2x2, din care se selectează prima subfereastră. Efectul execuţiei acestui script poate fi verificat în fig. 4.11. Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

16 | P a g e Fig. 4.11 Reprezentări grafice multiple sub formă de tablou 4.1.10 Mărirea/micşorarea reprezentării grafice. Comanda zoom 4.1.11 Ştergerea unei reprezentări grafice. Comanda clf 4.1.12 Deschiderea unei ferestre grafice noi. Comanda figure

Page 50: Curs Programare

4.1.13 Controlul axelor. Funcția axis() 4.2 Reprezentări grafice 3D. Reprezentări de suprafețe

O suprafaţă este definită matematic printr-o funcţie f(x, y), pentru care, corespunzător fiecărei perechi de valori (x, y)

trebuie să se calculeze cota z: z = f(x, y). În vederea reprezentării grafice 3D, se folosesc următoarele funcţii: meshgrid() – generează tablouri X şi Y pentru reprezentări 3D; mesh() – creează suprafeţe parametrice de tip wireframe; contour() – reprezentare grafică sub formă de curbe de nivel. Ex6. Să se reprezinte grafic suprafaţa definită prin funcţia f(x, y) = (x – 3)2 – (y – 2)2

pentru 2 ≤ x ≤ 4 și 1 ≤ y ≤ 3.

Page 51: Curs Programare

Fișierul script C04S7.m [X,Y] =

meshgrid(2:.2:4

, 1:.2:3);

Z = (X-3).^2-

(Y-2).^2;

mesh(X,Y,Z)

title('Functia

Sa (de pus pe

cal)')

xlabel('x')

ylabel('y')

zlabel('z')

Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

17 | P a g e Fig. 4.12 Reprezentarea grafică 3D a funcţiei șa Ex7. Să se reprezinte grafic suprafaţa definită prin funcţia f(x, y) = 2( ) 2 2

xye x y

pentru -2 ≤ x ≤ 2 și -2 ≤ y ≤ 2. Să se determine valorile și poziţiile maximelor și minimelor funcţiei. Fișierul script C04S7.m [X,Y] =

meshgrid(-

2:.1:2,-

2:.2:2);

f = -

X.*Y.*exp(-

2*(X.^2+Y.^2));

figure (1)

mesh(X,Y,f)

xlabel('x')

ylabel('y')

zlabel('z')

grid on

figure (2)

contour(X,Y,f)

Page 52: Curs Programare

xlabel('x')

ylabel('y')

grid on

hold on

fmax =

max(max(f))

kmax =

find(f==fmax)

Pos = [X(kmax),

Y(kmax)]

plot(X(kmax),Y(

kmax),'*')

text(X(kmax),Y(

kmax),'

Maximum')

Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 4. Reprezentări grafice 2D şi 3D în MATLAB

Fig. 4.13 Reprezentarea grafică 3D a funcţiei f(x, y) = 2( ) 2 2 xye x y

Fig. 4.14 Reprezentarea grafică de tip contour, cu evidenţierea extremelor

1 | P a g e

Programare si limbaje II Anul I, AR+ITT 1 Recapitulare Curs 4 + Laborator 7 + Laborator 8 1.1 Comenzi grid

hold

print

Page 53: Curs Programare

1.2 Funcții real()

imag()

whitebg()

set()

title()

xlabel()

ylabel()

zlabel()

legend()

subplot()

meshgrid()

mesh()

contour()

figure()

text()

1.3 Diverse Specificatori de stiluri de linie

Specificatori de marker

Specificatori de culoare

LineWidth

MarkerEdgeColor

MarkerFaceColor

MarkerSize

Comenzi TeX Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 5. Derivare, integrare, limite, ecuaţii în

MATLAB

2 | P a g e

Page 54: Curs Programare

Curs 5. Derivarea şi integrarea în MATLAB. Calculul limitelor. Rezolvarea ecuațiilor, a sistemelor de ecuații şi a ecuațiilor diferențiale 5.1 Derivarea în MATLAB 5.1.1 Derivarea folosind calculul simbolic. Funcția symbolic/diff() Sintaxă: diff(S) diff(S,'v') diff(S,n) diff(S,'v',n)

Descriere: Forma diff(S) diferenţiază expresia simbolică S în raport cu variabila sa liberă, determinată de funcţia findsym(). Forma diff(S,'v') sau diff(S,sym('v')) diferenţiază expresia simbolică S în raport cu variabila v. Forma diff(S,n) diferenţiază expresia simbolică S de n ori (n – mărime întreagă şi pozitivă). Forma diff(S,’v’,n) sau diff(S,n,’v’)diferenţiază expresia simbolică S de n ori (n – mărime întreagă şi pozitivă) în raport cu variabila v. Ex.1. Fie variabila simbolică x: >> syms x

şi funcţia: >> y = sin(3*x)

y =

sin(3*x)

Comanda >> diff(y)

derivează funcţia y în raport cu variabila x: ans =

3*cos(3*x)

Ex.2. Fie funcţia z definită astfel: >> z = exp(x)*cos(x)

z =

exp(x)*cos(x)

Derivata acesteia în raport cu x este: >> diff(z)

ans =

exp(x)*cos(x) - exp(x)*sin(x)

Derivata de ordin doi se poate calcula aşa: >> diff(z,2)

ans =

(-2)*exp(x)*sin(x) Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 5. Derivare, integrare, limite,

ecuaţii în MATLAB

3 | P a g e

Page 55: Curs Programare

sau aşa: >> diff(diff(z))

ans =

(-2)*exp(x)*sin(x)

Ex.3. Parametru de intrare - matrice simbolică: >> syms a x

>> A = [cos(a*x),sin(a*x);-sin(a*x),cos(a*x)]

A =

[ cos(a*x), sin(a*x)]

[ -sin(a*x), cos(a*x)]

>> diff(A)

ans =

[ -a*sin(a*x), a*cos(a*x)]

[ -a*cos(a*x), -a*sin(a*x)]

Ex.4. Derivate parţiale (derivarea expresiilor cu mai multe variabile): >> syms s t

>> f = sin(s*t)

f =

sin(s*t)

>> diff(f,t)

ans =

s*cos(s*t)

>> diff(f,s)

ans =

t*cos(s*t)

Observaţii: 1. Funcţia findsym() determină variabilele dintr-o expresie sau matrice simbolică. Sintaxă: findsym(S) findsym(S,n)

Descriere: findsym(S) returnează toate variabilele simbolice din expresia sau matricea simbolică S, în ordine alfabetică, separate prin virgulă. Dacă S nu conţine variabile simbolice, va fi returnat tabloul vid. findsym(S,n) returnează cele n variabile cel mai apropiate alfabetic de x. Exemple: >> syms a x y z t

>> findsym(sin(pi*t))

ans =

t

>> findsym(x+i*y-j*z)

ans =

x,y,z

>> findsym(a+y,1)

ans =

y

2. În cazul în care, din cauza complexităţii expresiilor simbolice, MATLAB nu simplifică în mod automat rezultatul, se poate folosi funcţia symbolic/simplify(). Sintaxă: Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 5. Derivare, integrare, limite, ecuaţii în MATLAB

4 | P a g e

Page 56: Curs Programare

R = simplify(S)

R = simplify(S, n)

Descriere: R = simplify(S) simplifică fiecare element din matricea simbolică S, folosind regulile de simplificare MuPAD. R = simplify(S, n) utilizează numărul întreg şi pozitiv n pentru a controla numărul de încercări de simplificare. Valoarea implicită: n = 50 (dacă n nu este specificat). Exemple: >> syms x a b c

>> simplify(sin(x)^2 + cos(x)^2)

ans =

1 >> simplify(exp(c*log(sqrt(a+b))))

ans =

(a + b)^(c/2)

>> S = [(x^2+5*x+6)/(x+2),sqrt(16)]

S =

[ (x^2 + 5*x + 6)/(x + 2), 4]

>> R = simplify(S)

R =

[ x + 3, 4]

5.1.2 Derivarea numerică. Funcția diff() Funcţia diff() diferenţiază şi aproximează derivate. Sintaxă: Y = diff(X)

Y = diff(X,n)

Y = diff(X,n,dim)

Descriere: Y = diff(X) calculează diferenţele între elementele adiacente ale lui X. Dacă X este un vector, diff(X) returnează un vector mai scurt cu un element, al diferenţelor între elementele învecinate: [X(2)-X(1) X(3)-X(2) ... X(n)-X(n-1)]

Y = diff(X,n) aplică diferenţierea recursiv de n ori, rezultând diferenţa de ordin n. Astfel, diff(X,2) este echivalent cu diff(diff(X)). Y = diff(X,n,dim) calculează diferenţa de ordin n în raport cu dimensiunea specificată de scalarul pozitiv dim. Dacă ordinul n este mai mare sau egal cu lungimea dimensiunii dim, rezultatul va fi tabloul vid. Ex.1. Cantitatea diff(y)./diff(x) este o derivată numerică aproximativă. >> x = [1 2 3 4 5];

>> y = diff(x)

y =

1 1 1 1

>> z = diff(x,2)

z =

0 0 0

Ex.2. Fiind dată matricea 4D: >> A = rand(1,3,2,4);

diff(A) este diferenţa de ordin 1 în raport cu dimensiunea 2: >> diff(A)

ans(:,:,1,1) = Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 5. Derivare, integrare, limite,

ecuaţii în MATLAB

5 | P a g e

Page 57: Curs Programare

0.0911 -0.7788

ans(:,:,2,1) =

-0.2810 -0.5348

ans(:,:,1,2) =

0.2684 0.4106

ans(:,:,2,2) =

-0.8073 0.8130

ans(:,:,1,3) =

-0.4718 0.3149

ans(:,:,2,3) =

0.2799 0.4940

ans(:,:,1,4) =

0.1673 -0.3038

ans(:,:,2,4) =

0.8134 0.0849

iar diff(A,3,4) este diferenţa de ordin 3 în raport cu dimensiunea 4: >> diff(A,3,4)

ans(:,:,1) =

-2.0585 0.2382 1.0004

ans(:,:,2) =

1.5913 -0.5757 1.0010

5.2 Integrarea în MATLAB 5.2.1 Integrarea folosind calculul simbolic. Funcția symbolic/int() Sintaxă: int(S) int(S,v) int(S,a,b) int(S,v,a,b)

Descriere: int(S) returnează integrala nedefinită din expresia simbolică S în raport cu variabila sa simbolică, determinată de funcţia findsym(). int(S,v) returnează integrala nedefinită din expresia simbolică S, în raport cu variabila v. int(S,a,b) returnează integrala definită de la a la b (a, b – scalari simbolici sau de tip double) din expresia simbolică S, în raport cu variabila simbolică implicită. int(S,v,a,b) returnează integrala definită de la a la b din expresia simbolică S, în raport cu variabila v. Ex.1. Fie variabilele simbolice: >> syms x t z alpha;

Expresia: >> int(-2*x/(1+x^2)^2)

returnează: ans =

1/(x^2 + 1)

Expresia: >> int(x/(1+z^2),z)

returnează: Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 5. Derivare, integrare, limite, ecuaţii în

MATLAB

6 | P a g e

Page 58: Curs Programare

ans =

x*atan(z)

Expresia: >> int(x*log(1+x),0,1)

returnează: ans =

1/4

5.3 Calculul limitelor în MATLAB 5.3.1 Calculul limitelor din expresii simbolice. Funcția limit() Sintaxă: limit(F,x,a) limit(F,a) limit(F) limit(F,x,a,'right') limit(F,x,a,'left')

Descriere: limit(F,x,a) calculează limita din expresia simbolică F, când x -> a. limit(F,a) foloseşte findsym(F) pentru determinarea variabilei independente. limit(F) foloseşte a = 0 pentru calculul limitei. limit(F,x,a,'right') sau limit(F,x,a,'left') specifică direcţia unei limite unilaterale. Exemple. Fie variabilele simbolice: >> syms x a t h;

Se calculează următoarele limite: >> limit(sin(x)/x)

ans =

1

>> limit(1/x,x,0,'right')

ans =

Inf

>> limit(1/x,x,0,'left')

ans =

-Inf

>> limit((sin(x+h)-sin(x))/h,h,0)

ans =

cos(x)

>> v = [(1 + a/x)^x, exp(-x)];

>> limit(v,x,inf)

ans =

[ exp(a), 0]

5.4 Rezolvarea simbolică a ecuațiilor şi a sistemelor de ecuații algebrice în MATLAB 5.4.1 Rezolvarea simbolică a ecuațiilor şi a sistemelor de ecuații algebrice. Funcția solve() Sintaxă: solve(eq) solve(eq,var) Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 5. Derivare,

integrare, limite, ecuaţii în MATLAB

7 | P a g e

Page 59: Curs Programare

solve(eq1,eq2,...,eqn) g = solve(eq1,eq2,...,eqn,var1,var2,...,varn)

Descriere: solve(eq) rezolvă ecuaţia eq = 0, specificată printr-o expresie simbolică sau un şir de caractere care nu conţine semnul egal, în raport cu variabila implicită, determinată de findsym(). solve(eq,var) rezolvă ecuaţia eq = 0, în raport cu variabila var. solve(eq1,eq2,...,eqn) rezolvă sistemul de ecuaţii dat, în raport cu n variabile determinate de findsym(). g = solve(eq1,eq2,...,eqn,var1,var2,...,varn) determină soluţiile sistemului de ecuaţii, în raport cu variabilele specificate. Exemple: >> solve('a*x^2 + b*x + c')

ans =

-(b + (b^2 - 4*a*c)^(1/2))/(2*a)

-(b - (b^2 - 4*a*c)^(1/2))/(2*a)

>> solve('a*x^2 + b*x + c','b')

ans =

-(a*x^2 + c)/x

>> S = solve('x + y = 1','x - 11*y = 5')

S =

x: [1x1 sym]

y: [1x1 sym]

>> S.x

ans =

4/3

>> S.y

ans =

-1/3

>> A = solve('a*u^2 + v^2', 'u - v = 1', 'a^2 - 5*a + 6')

A =

a: [4x1 sym]

u: [4x1 sym]

v: [4x1 sym]

>> A.a

ans =

3

2

2

3

>> A.u

ans =

(3^(1/2)*i)/4 + 1/4

(2^(1/2)*i)/3 + 1/3

1/3 - (2^(1/2)*i)/3

1/4 - (3^(1/2)*i)/4

>> A.v

ans =

(3^(1/2)*i)/4 - 3/4

(2^(1/2)*i)/3 - 2/3

- (2^(1/2)*i)/3 - 2/3

- (3^(1/2)*i)/4 – 3/4

5.5 Rezolvarea simbolică a ecuațiilor şi a sistemelor de ecuații diferențiale în MATLAB 5.4.1 Rezolvarea simbolică a ecuațiilor şi a sistemelor de ecuații diferențiale ordinare. Funcția dsolve() Sintaxă: r = dsolve('eq1,eq2,...', 'cond1,cond2,...', 'v')

Page 60: Curs Programare

r = dsolve('eq1','eq2',...,'cond1','cond2',...,'v')

dsolve('eq1,eq2,...', 'cond1,cond2,...', 'v') Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare

si limbaje II Curs 5. Derivare, integrare, limite, ecuaţii în MATLAB

8 | P a g e

Page 61: Curs Programare

Descriere: eq1, eq2,... reprezintă ecuaţiile diferenţiale ordinare. cond1,cond2,... reprezintă condiţiile la limită şi/sau iniţiale. v reprezintă variabila independentă. Variabila independentă implicită este t. Litera D reprezintă diferenţierea în raport cu variabila independentă (d/dx). D2 este echivalent cu d2/dx2. D3y reprezintă derivata a treia a lui y(x) sau y(t). Condiţiile iniţiale sunt specificate prin ecuaţii de forma: y(a) = b sau Dy(a) = b, unde y este o variabilă dependentă, iar a şi b sunt constante. Dacă numărul condiţiilor iniţiale este mai mic decât numărul variabilelor dependente, soluţiile determinate vor conţine constante arbitrare. Exemple: >> dsolve('Dx = -a*x')

ans =

C2/exp(a*t)

>> dsolve('Df = f + sin(t)')

ans =

C4*exp(t) - sin(t)/2 - cos(t)/2

>> dsolve('(Dy)^2 + y^2 = 1','s')

ans =

-1

1

sin(C11 + s)

sin(C7 - s)

>> dsolve('Dy = a*y', 'y(0) = b')

ans =

b*exp(a*t)

>> dsolve('D2y = -a^2*y', 'y(0) = 1', 'Dy(pi/a) = 0')

ans =

cos(a*t)

>> z = dsolve('Dx = y', 'Dy = -x')

z =

y: [1x1 sym]

x: [1x1 sym]

>> z.x

ans =

(C20*i)/exp(i*t) - C19*i*exp(i*t)

>> z.y

ans =

C19*exp(i*t) + C20/exp(i*t)

1 | P a g e

Programare si limbaje II Anul I, AR+ITT 1 Recapitulare Curs 5 + Laborator 9 + Laborator 10

Page 62: Curs Programare

1.1 Comenzi 1.2 Funcții diff()

symbolic/diff()

findsym()

simplify()

symbolic/int()

limit()

solve()

dsolve()

1.3 Diverse Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 6. Interfeţe grafice utilizator în MATLAB

2 | P a g e

Page 63: Curs Programare

Curs 6. Proiectarea interfețelor grafice utilizator (GUI) în MATLAB 6.1 Interfața grafică utilizator (GUI) O interfaţă grafică utilizator (GUI – Graphical User Interface) reprezintă o colecţie de una sau mai multe ferestre, conţinând controale, denumite componente, care permit interacţiunea utilizatorului cu calculatorul, în vederea realizării anumitor sarcini. Prin utilizarea GUI, utilizatorul: - nu trebuie să creeze script-uri sau să introducă instrucţiuni în fereastra de comenzi; - nu trebuie să cunoască detalii despre modul în care sarcinile sunt îndeplinite. Componentele GUI: - meniuri (Menu); - bare de instrumente (Toolbar); - butoane cu apăsare (Push Button); - bare de derulare (Slider); - butoane de selecţie (Radio Button); - casete de selectare (Check Box); - casete de editare de text (Edit Text); - text static sau etichete (Static Text); - meniu de tip vertical (Pop-up Menu); - casete de tip listă (Listbox); - butoane de comutare (Toggle Button); - tabele (Table); - sisteme de axe de coordonate (Axe); - panouri (Panel); - grupuri de butoane (Button Group); - controale ActiveX (ActiveX Control). Fig. 6.1. Exemplu de GUI (controlsuite) Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 6. Interfeţe

grafice utilizator în MATLAB

3 | P a g e

Page 64: Curs Programare

Fig. 6.2. Exemplu de GUI (controlsuite) în etapa de proiectare folosind guide 6.2 Crearea unui GUI Există două moduri de a crea o interfaţă grafică utilizator: - folosind comanda guide (graphical use interface development environment); - prin scrierea de cod sursă. Comanda guide oferă un mod facil de creare a interfeţelor grafice utilizator, folosind instrumente grafice pentru formatarea ferestrei grafice, stabilirea dimensiunilor şi aspectului, respectiv popularea interfeţei cu controale. Pentru fiecare entitate care va fi introdusă în GUI, există posibilitatea de a stabili sau modifica o mulţime largă de proprietăţi (atribute), folosind componenta Property Inspector. În urma utilizării comenzii guide, vor rezulta două fişiere: - un fişier binar, cu extensia .fig, conţinând descrierea ferestrei interfeţei grafice; - un fişier text, cu extensia .m, care conţine descrierea funcţiilor care vor asigura funcţionalitatea interfeţei grafice. Crearea interfeţei grafice utilizator prin scrierea „manuală” de cod sursă presupune cunoaşterea temeinică a tuturor comenzilor, funcţiilor şi proprietăţilor asociate controalelor, dar are avantajul realizării unui cod compact şi perfect adaptat cerinţelor viitorului utilizator. La lansarea în execuţie a fişierului M care conţine descrierea proprietăţilor şi comportamenului componentelor, este creată figura interfeţei, este populată cu componente şi sunt tratate interacţiunile dintre acestea şi utilizator. Figura interfeţei nu este salvată separat, ea este generată la fiecare lansare în execuţie a codului sursă. Cele două moduri de abordare pot fi combinate, doar dacă GUI-ul este creat cu guide şi apoi modificat prin editarea programului. 6.2.1 Crearea unui GUI folosind comanda guide Sintaxă: guide guide('filename.fig') Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 6. Interfeţe

grafice utilizator în MATLAB

4 | P a g e

Page 65: Curs Programare

guide('fullpath') guide(HandleList)

Descriere: guide porneşte mediul de creare sau editare interactivă a GUI-urilor. La pornire se poate specifica deschiderea unui GUI existent sau crearea unuia nou, pornind de la zero sau pe baza unui model (template) existent. guide('filename.fig') deschide fişierul .fig cu numele specificat, dacă acesta se află în directorul curent. guide('fullpath') deschide fişierul cu numele specificat, chiar dacă acesta nu se află în directorul curent. guide(HandleList) deschide conţinutul fiecărui fişier din HandleList, în copii separate ale mediului de proiectare GUIDE. Descrierea uneltelor GUIDE Fig. 6.3 Componentele mediului de proiectare GUIDE Ex.1. Crearea unui GUI folosind GUIDE, în vederea reprezentării grafice de suprafeţe. Fig. 6.4 Componentele utilizate în aplicaţia din Ex.1 Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II

Curs 6. Interfeţe grafice utilizator în MATLAB

5 | P a g e

Page 66: Curs Programare

Pornirea GUIDE: 1. >>guide

2. Start -> MATLAB -> GUIDE (GUI Builder) 3. File -> New -> GUI 4. Folosind pictograma GUIDE de pe toolbar. Fig. 6.5 GUIDE Quick Start Selectare: Blank GUI, Save new figure as: Ex_GUI.fig. Fig. 6.6 Fereastra GUIDE implicită File -> Preferences -> GUIDE -> Show names in component palette Conf.dr.ing. Ovidiu-Aurelian Deteşan –

Programare si limbaje II Curs 6. Interfeţe grafice utilizator în MATLAB

6 | P a g e

Page 67: Curs Programare

Fig. 6.7 Fereastra GUIDE implicită, cu nume în paleta componentelor Tools -> Grid and Rulers -> Show rulers, Show grid, Show guides. Fig. 6.8 Redimensionare la aproximativ 400x300 pixeli Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje

II Curs 6. Interfeţe grafice utilizator în MATLAB

7 | P a g e

Page 68: Curs Programare

Fig. 6.9 Adăugarea a trei butoane cu apăsare Fig. 6.10 Adăugarea componentelor: Static Text, Pop-up Menu, Axes Conf.dr.ing. Ovidiu-Aurelian Deteşan –

Programare si limbaje II Curs 6. Interfeţe grafice utilizator în MATLAB

8 | P a g e

Page 69: Curs Programare

Fig. 6.11 Alinierea butoanelor Fig. 6.12 Modificări suplimentare ale aspectului Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs

6. Interfeţe grafice utilizator în MATLAB

9 | P a g e

Page 70: Curs Programare

Fig. 6.13 Adăugarea de text pe butoane: Surf, Mesh, Contour Fig. 6.14 Adăugarea setului de date pe Pop-up menu: Peaks, Membrane, Sinc Conf.dr.ing. Ovidiu-Aurelian

Deteşan – Programare si limbaje II Curs 6. Interfeţe grafice utilizator în MATLAB

10 | P a g e

Page 71: Curs Programare

Fig. 6.15 Modificarea etichetei: Select Data Salvare: Buton Save Figure (Toolbar) Activare GUI: Tools -> Run (Ctrl - T) sau Buton Run Figure (Toolbar) Fig. 6.16 Activare GUI Adăugarea de cod în fişierul M Generarea datelor pentru reprezentările grafice Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs

6. Interfeţe grafice utilizator în MATLAB

11 | P a g e

Page 72: Curs Programare

Fig. 6.17 Editarea funcţiei Ex_GUIDE_Opening_Fcn() După linia % varargin...

din funcţia Ex_GUIDE_Opening_Fcn() se introduce codul: % Create the data to plot.

handles.peaks=peaks(35);

handles.membrane=membrane;

[x,y] = meshgrid(-8:.5:8);

r = sqrt(x.^2+y.^2) + eps;

sinc = sin(r)./r;

handles.sinc = sinc;

% Set the current data value.

handles.current_data = handles.peaks;

surf(handles.current_data)

Fig. 6.18 Aspectul ferestrei GUI după introducerea codului Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si

limbaje II Curs 6. Interfeţe grafice utilizator în MATLAB

12 | P a g e

Page 73: Curs Programare

Programarea meniului Pop-up Fig. 6.19 Selectarea callback-ului asociat meniului pop-up În funcţia % --- Executes on selection change in popupmenu1.

function popupmenu1_Callback(hObject, eventdata, handles)

% hObject handle to popupmenu1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hints: contents = get(hObject,'String') returns popupmenu1 contents as cell array

% contents{get(hObject,'Value')} returns selected item from popupmenu1

după linia % handles structure with handles and user data (see GUIDATA)

se introduce codul: % Determine the selected data set.

str = get(hObject, 'String');

val = get(hObject,'Value');

% Set current data to the selected data set.

switch str{val};

case 'Peaks' % User selects peaks.

handles.current_data = handles.peaks;

case 'Membrane' % User selects membrane.

handles.current_data = handles.membrane;

case 'Sinc' % User selects sinc.

handles.current_data = handles.sinc;

end

% Save the handles structure.

guidata(hObject,handles)

Programarea butoanelor push În funcţia pushbutton1_Callback() % --- Executes on button press in pushbutton1.

function pushbutton1_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

se introduce codul: % Display surf plot of the currently selected data.

surf(handles.current_data); Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 6. Interfeţe

grafice utilizator în MATLAB

13 | P a g e

Page 74: Curs Programare

În funcţia pushbutton2_Callback() se introduce codul: % Display mesh plot of the currently selected data.

mesh(handles.current_data);

În funcţia pushbutton3_Callback() se introduce codul: % Display contour plot of the currently selected data.

contour(handles.current_data);

Salvare, lansare în execuţie, testare: Fig. 6.20 Testarea GUI-ului pentru diferite tipuri de date 6.2.2 Crearea unui GUI prin scrierea de cod sursă Ex.2. Următorul cod (pitagora.m) generează un GUI care permite citirea valorilor a două catete şi calculează valoarea ipotenuzei unui triunghi dreptunghic, folosind teorema lui Pitagora: function [] = pitagora()

% Arata cum se actualizeaza un control cu date din altele.

% Creeaza doua casete de text si un pushbutton. Cand se apasa pushbutton,

% se afiseaza ipotenuza generata pe baza valorilor catetelor

% introduse in casetele de text.

S.fh = figure('units','pixels',...

'position',[400 400 120 100],...

'menubar','none',...

'name','Pitagora',...

'numbertitle','off',...

'resize','on');

S.pb = uicontrol('style','push',...

'unit','pix',...

'position',[10 10 100 20],...

'string','Fara numar...',...

'tooltip','Apasa pentru calcul ipotenuza');

S.ed(1) = uicontrol('style','edit',...

'unit','pix',...

'position',[10 70 100 20],...

'string','cat e a?');

S.ed(2) = uicontrol('style','edit',...

'unit','pix',...

'position',[10 40 100 20],...

'string','dar b?'); Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 6. Interfeţe grafice utilizator în MATLAB

14 | P a g e

Page 75: Curs Programare

set(S.pb,'callback',{@pb_call,S}); % Seteaza callback-ul, transmite parametri.

function [] = pb_call(varargin)

% Callback pentru pushbutton.

S = varargin{3}; % Citeste structura.

R = [get(S.ed(1),'string'), get(S.ed(2),'string')]; % Citeste valorile a si b.

% str = 'Fara numar.'; % Mesaj implicit.

str = ['Ipotenuza: ', num2str(sqrt(str2num(R(1))^2+str2num(R(2))^2))];

set(S.pb,'string',str)

Fig. 6.21 Etape în execuţia GUI-ului Pitagora Ex.3. Următorul cod (simple_gui2.m) generează un GUI similar celui din Ex.1, creat cu GUIDE: function simple_gui2

% SIMPLE_GUI2 Select a data set from the pop-up menu, then

% click one of the plot-type push buttons. Clicking the button

% plots the selected data in the axes.

% Create and then hide the GUI as it is being constructed.

f = figure('Visible','off','Position',[360,500,450,285]);

% Construct the components.

hsurf = uicontrol('Style','pushbutton','String','Surf',...

'Position',[315,220,70,25],...

'Callback',{@surfbutton_Callback});

hmesh = uicontrol('Style','pushbutton','String','Mesh',...

'Position',[315,180,70,25],...

'Callback',{@meshbutton_Callback});

hcontour = uicontrol('Style','pushbutton',...

'String','Contour',...

'Position',[315,135,70,25],...

'Callback',{@contourbutton_Callback});

htext = uicontrol('Style','text','String','Select Data',...

'Position',[325,90,60,15]);

hpopup = uicontrol('Style','popupmenu',...

'String',{'Peaks','Membrane','Sinc'},...

'Position',[300,50,100,25],...

'Callback',{@popup_menu_Callback});

ha = axes('Units','Pixels','Position',[50,60,200,185]);

align([hsurf,hmesh,hcontour,htext,hpopup],'Center','None');

% Create the data to plot.

peaks_data = peaks(35);

membrane_data = membrane;

[x,y] = meshgrid(-8:.5:8);

r = sqrt(x.^2+y.^2) + eps;

sinc_data = sin(r)./r;

% Initialize the GUI.

% Change units to normalized so components resize

% automatically.

set([f,ha,hsurf,hmesh,hcontour,htext,hpopup],...

'Units','normalized');

%Create a plot in the axes.

current_data = peaks_data;

surf(current_data);

% Assign the GUI a name to appear in the window title.

set(f,'Name','Simple GUI') Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 6. Interfeţe grafice utilizator în MATLAB

15 | P a g e

Page 76: Curs Programare

% Move the GUI to the center of the screen.

movegui(f,'center')

% Make the GUI visible.

set(f,'Visible','on');

% Callbacks for simple_gui. These callbacks automatically

% have access to component handles and initialized data

% because they are nested at a lower level.

% Pop-up menu callback. Read the pop-up menu Value property

% to determine which item is currently displayed and make it

% the current data.

function popup_menu_Callback(source,eventdata)

% Determine the selected data set.

str = get(source, 'String');

val = get(source,'Value');

% Set current data to the selected data set.

switch str{val};

case 'Peaks' % User selects Peaks.

current_data = peaks_data;

case 'Membrane' % User selects Membrane.

current_data = membrane_data;

case 'Sinc' % User selects Sinc.

current_data = sinc_data;

end

end

% Push button callbacks. Each callback plots current_data in

% the specified plot type.

function surfbutton_Callback(source,eventdata)

% Display surf plot of the currently selected data.

surf(current_data);

end

function meshbutton_Callback(source,eventdata)

% Display mesh plot of the currently selected data.

mesh(current_data);

end

function contourbutton_Callback(source,eventdata)

% Display contour plot of the currently selected data.

contour(current_data);

end

end

Fig. 6.22 Exemple de execuţie a GUI-ului simple_gui2 6.3 Funcționarea unui GUI Majoritatea interfeţelor grafice utilizator aşteaptă o acţiune din partea utilizatorului, pentru ca ele să reacţioneze într-un mod care a fost în prealabil studiat şi programat. Fiecare control şi GUI-ul în sine, au asociate una sau mai multe rutine (cod MATLAB executabil) scrise de către programator, denumite callbacks (funcţii de apel invers). Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 6. Interfeţe grafice

utilizator în MATLAB

16 | P a g e

Page 77: Curs Programare

Execuţia fiecărui callback este declanşată de acţiunea utilizatorului, cum ar fi apăsarea unui buton, selectarea unei opţiuni dintr-un meniu, introducerea unei valori într-o casetă de editare, apăsarea unui buton de mouse sau trecerea cursorului peste un control. Prin funcţiile definite, GUI-ul răspunde la aceste aşa-numite evenimente. Programare condusă de evenimente Execuţie asincronă a callback-ului – declanşată de evenimente externe software-ului. Callback-urile pot fi programate în două moduri: - ca şi funcţii MATLAB, scrise în fişiere M (mai puternice şi mai flexibile, din cauza accesului la argumente); - ca şiruri de caractere conţinând expresii sau comenzi.