Vous êtes sur la page 1sur 11

1

LUCRAREA 9

Operatori relaionali i logici.


Operatorii relaionali i logici sunt utilizai la crearea expresiilor
logice necesare fluxului unui program scris n MATLAB. O
caracteristic comun a acestor operatori este tipul de date de intrare i de
ieire.. Astfel ca date de intrare sunt acceptate doar datele numerice i
sunt interpretate astfel: orice numr diferit de 0 este interpretat drept
valoarea logic adevrat (A), iar valoarea 0 drept valoarea logic fals
(F). Datele de ieire nu pot fi dect numerele 1 sau 0, interpretate ca fiind
valorile logice A, respectiv F.
n MATLAB sunt definii 6 operatori relaionali:

Operator relaional Semnificaie
<
<=
>
>=
==
~=
Mai mic
Mai mic sau egal
Mai mare
Mai mare sau egal
egal
diferit

Operatorii relaionali pot fi folosii pentru a compara:
a) Dou matrici de aceiai dimensiune. n acest caz rezultatul este
tot o matrice de aceiai dimensiune cu matricile de comparat.
Compararea se face element cu element. Dac elementele
corespunztoare verific aceast condiie atunci matricea
rezultat elementul corespunztor va fi 1. Dac aceast condiie nu
este verificat atunci elementul corespunztor va fi 0.
b) O matrice cu un scalar. n acest caz rezultatul este tot o matrice
de dimensiunea matricii de comparat, iar compararea se face prin
compararea fiecrui element al matricii cu scalarul dat.
Vom considera matricile A i B definite prin:

>> A=[1 0 -2 10 0;-5 30 -10 0 1;2 0 1 1 1;-1 3 2 0 0]
2

A =
1 0 -2 10 0
-5 30 -10 0 1
2 0 1 1 1
-1 3 2 0 0

>> B=2*A
B =
2 0 -4 20 0
-10 60 -20 0 2
4 0 2 2 2
-2 6 4 0 0

Vom determina elementele pozitive ale lui A i elementele lui A egale cu
elementele lui B astfel:

>> A>0
ans =

1 0 0 1 0
0 1 0 0 1
1 0 1 1 1
0 1 1 0 0

>> A==B
ans =

0 1 0 0 1
0 0 0 1 0
0 1 0 0 0
0 0 0 1 1

In ambele matrici ce au rezultat pe poziiile elementelor cu valoarea 1
sunt elemente ce verific aceste condiii.
n lucrarea 2 am precizat faptul c indicii de accesare a unui
element dintr-o matrice pot fi nu numai scalari ci i vectori i chiar
matrici. Cum rezultatul unei comparaii cu operatorii relaionali este o
matrice rezult c putem utiliza n principiu o comparaie pentru a accesa
elementele unei matrici. Acest tip de accesare se numete indexare
logic. Rezultatul este un vector cu acele elemente ale matricii ce verific
3
aceast condiie. De exemplu dac dorim s obinem elementele lui A
mai mari ca 5 vom scrie:
>> A(A>5)

ans =

30
10
Doar dou elemente ale lui A sunt mai mari ca 5: 30 i 10.
Observaie. Exist mai multe posibiliti pentru a accesa toate
elementele lui A. Prima ar fi s utilizm o matrice cu toate elementele 1,
adic o condiie adevrat pentru fiecare element, drept indice. De
exemplu s dm comanda A(A==A). Alta ar fi s utilizm operatorul :
(revezi lucrarea 2)., A(:). Recomandm a doua metod ca fiind mai scurt
i mai rapid.
Operatorii logici constituie o cale de a defini expresii logice( cu
ajutorul operatorilor relaionali) . Exist trei operatori logici:

Operatori logici Semnificaie
&
|
~
i (and)
Ori (or)
Nu (not)

Mai exist un operator logic definit ca o funcie: xor(A,B)- sau
exclusiv-. Prezentm acum tabelul de definiie al operatorilor logici ( 1
reprezint adevrat (A), iar zero reprezint valoarea logic fals (F)).:

A B A&B A|B ~A xor(A,B)
0
1
0
1
0
0
1
1
0
0
0
1
0
1
1
1
1
0
1
0
0
1
1
0

Putem acum construi exemple mai complexe de determinare a unor
elemente a le unor matrici. Astfel ca s determinm elementele lui A
(matricea din exemplul de mai sus) din intervalul (1,20) trebuie s dm
comanda A((A>1)&(A<20)) Si obinem elementele 2, 3, 2, 10. Apariia
elementelor este n ordinea coloanelor matricii A. Pentru obinerea
elementelor ce sunt n afara acestui interval avem dou posibiliti: fie
utilizm expresia logic de mai sus i adugm n faa ei operatorul ~
4
adic dm comanda A(~((A>1)&(A<20))) , fie utilizm operatorul | i
dm comanda A((A<=1)|(A>=20)).
Exist mai multe funcii numite funcii relaionale i logice. Ele
au caracteristic faptul c au ca rspuns numai numerele 0 (A) sau 1
(F).Le vom prezenta pe scurt pe fiecare,
any(v) Rspunde cu 1 dac vectorul v are cel puin un element nenul
i cu 0 dac toate elementele sunt 0.
all(v) Rspunde cu 1 dac toate elementele lui v sunt nenule i cu 0
dac exist cel puin un element nul.
Fiind cele mai utilizate funcii pentru clarificare prezentm un exemplu.
Fie vectorii [0 1 2], [1 2 3] i [0 0 0]. Atunci:

vector v any(v) all(v)
[0 1 2] 1 0
[1 2 3] 1 1
[0 0 0] 0 0

fiind(x) Rspunde cu un vector coninnd indicii elementelor nenule
ale lui x.
isnan(x) Rspunde cu un vector de aceiai dimensiune cu x ale crui
elemente sunt 1 sau 0 dup cum elementul corespunztor al lui x este
NaN sau nu.
isfinite(x) Rspunde cu un vector de aceiai dimensiune ca x ale crui
elemente sunt 1 sau 0 dup cum elementul corespunztor al lui x este
finit sau nu. NaN este considerat nefinit.
>> v=[1 NaN inf -inf]
v =
1 NaN Inf -Inf

>> isfinite(v)
ans =
1 0 0 0








5
APLICAII

1. Fie vectorii x = [1 5 2 8 9 0 1] i y = [5 2 2 6 0 0 2]. Executai i
explicai rezultatele urmtoarelor comenzi:

a) x > y
b) y < x
c) x == y
d) x <= y
e) y >= x
f) x | y
g) x & y
h) x & (~y)
i) (x > y) | (y < x)
j) (x > y) & (y < x)

2.Fie vectorii x = 1:10 i y = [3 1 5 6 8 2 9 4 7 0]. Execut i
interpreteaz urmtoarele comenzi de indexare logic:

a) x((x > 3) & (x < 8))
b) x(x > 5)
c) y(x <= 4)
d) x( (x < 2) | (x >= 8) )
e) y( (x < 2) | (x >= 8) )
f) x(y < 0)

3. Fie x=[3 15 9 12 -1 0 -12 9 6 1]. Determinai comanda care:

a) definete vectorul a obinut din x prin schimbarea elementelor pozitive
cu 0;
b) definete vectorul b obinut din x prin schimbarea elementelor ce se
divid cu 3, cu valoarea 1;
c) definete vectorul c obinut din x prin schimbarea elementelor pare cu
valoarea lor multiplicat cu 5;
d) definete vectorul d ce va conine doar acele elemente ale lui x ce sunt
mai mari ca 10;
e) definete vectorul e obinut din x prin schimbarea elementelor ce sunt
mai mici ca media elementelor lui x, cu 0;
6
f) definete vectorul f obinut din x prin schimbarea elementelor ce sunt
mai mari dect media elementelor lui x cu diferena dintre valoarea lor i
medie.

4. a) Creai vectorul x=randperm(35) (funcia randperm(n) genereaz o
permutare aleatoare a numerelor naturale de la 1 la 35). Evaluai funcia:

( )
2 6
4 6 20
36 20 35
daca x
y x x daca x
x daca x
<

= <= <=

<= <=


utiliznd indexarea logic. Verificai rspunsul desennd graficul lui
y(x).
b) Desenai graficul funciei de semnal sinusoidal discontinuu :

( )
sin( ) sin( ) 0
0 sin( ) 0
t daca t
x t
daca t
>
=

pentru t=1,,10s,
utiliznd indexarea logic.

5. Problema evitrii operaiilor neconvenabile. n unele situaii avem un
vector cu unele elemente0.Dac cu acest vector facem diverse calcule
putem ajunge ca s efectum operaii interzise ca de exemplu mpriri cu
0. De exemplu:

>> x=[7 3 0 5 -2 0 -1 0 pi]
x =
7.0000 3.0000 0 5.0000 -2.0000 0 -1.0000 0 3.1416
>>y= sin(x)./x
Warning: Divide by zero.
y =
0.0939 0.0470 NaN -0.1918 0.4546 NaN 0.8415 NaN 0.0000

Se observ faptul c unde am avut elemente 0 la rezultat avem NaN fapt
ce va conduce la rezultate eronate dac , de exemplu, vom dori s
calculm suma elementelor vectorului y. Cum ieim din aceast situaie?

6. O problem de balistic. nlimea i viteza unui proiectil lansat cu
viteza iniial v
0
i cu un unghi sunt date de:
( )
2
0
1
sin
2
h t v t gt =
7
( )
2 2 2
0 0
2 sin v t v v gt g t = +
Unde g este acceleraia gravitaional. Proiectilul va atinge solul cnd
h(t)=0 , ceea ce conduce la timpul de revenire ( )
0
2 / sin
g
t v g = (se
egaleaz cu 0 prima ecuaie). Pentru 40
o
= , v
0
=20 m/s, i g=9.81 m/s
2
,
determinai timpul cnd nlimea h nu este mai mic de 6m iar viteza
este simultan cel mult 16 m/s.

Indicaii

3.
>> x = [3 15 9 12 -1 0 -12 9 6 1]
x =
3 15 9 12 -1 0 -12 9 6 1
a)>> a=x;a(x>0)=0
b)Se va utiliza funcia rem(x,n), x un vector de numere ntregi, iar n un
numr natural. Funcia ne d un vector n care elementele sunt restul
mpririi fiecrui element al lui x la n. n situaia noastr rem(x,3) ne va
da resturile mpririi la 3. Dar pe noi ne intereseaz ca n acest vector pe
poziia n care este 0, adic elementul se mparte exact la 3, s avem
valoarea 1( adic adevrat) i 0 n rest (adic fals, nu se mparte exact la
3),\.Acest lucru se obine pur i simplu aplicnd operatorul ~ (not) la
funcie. Deci
>> b=x;b(~rem(x,3))=5
c) >> c=x;c(~rem(x,2))=5*c(~rem(x,2))
d) >> d=x(x>10)
e)media elementelor unui vector este dat de funcia mean(x). Deci
>> e=x;e(x<mean(x))=0
f) >> f=x;f(x>mean(x))=f(x>mean(x))-mean(x)

4. a) Mai nti crem vectorul x:
>> x=randperm(35)
Apoi vom crea vectorul y de aceiai dimensiune cu x. Dimensiunea lui x
este dat de size(x). x=randperm(35)om crea vectorul y numai cu cifra 1:
>> y=ones(size(x))
Acum putem calcula valorile reale ale lui y utiliznd indexarea logic:
>> y(x<6)=2
>> y((x >= 6) & (x < 20))=x((x >= 6) & (x < 20))-4
>> y((x >= 20) & (x <= 35))=36-x((x >= 20) & (x <= 35))
Acum putem trasa graficul lui y n funcie de x cu comanda:
8
>> plot(x,y,'or')
b) Mai nti definim timpul t:
>>t=0:0.1:10;
Apoi definim funcia x(t):
>> x=sin(t);
Punem valoarea 0 n locul valorilor negative ale lui x:
>> x=x.*(x>0);
Facem graficul i punem etichetele:
>> plot(t,x)
>> axis([0 10 -0.1 1.1])
>> xlabel('Timpul [s]')
>> ylabel('Amplitudinea')
>> title('Semnal sinusoidal discontinuu')

5. Definim x ca n problem:
>> x=[7 3 0 5 -2 0 -1 0 pi]
Ideea este c vom utiliza n locul valorii 0 cea mai mic valoare relativ
pozitiv pe care calculatorul o poate reprezenta. Aceasta este:
eps=
52
2 2.2204e-016


Comanda de nlocuire este:
>> x=x+(x==0)*eps
Acum putem calcula:
>> sin(x)./x

6. Definim datele iniiale:
>> v0=20;g=9.81;theta=40*pi/180;
Calculm acum timpul de revenire al proiectilului tg, ceea ce ne d i
intervalul de definiie al timpului unde problema are sens:
>> tg=2*v0*sin(theta)/g
Definim acum intervalul de timp i calculm vitezele i nlimile pe
acest interval:
>> t=0:0.01:tg;
>> v=sqrt(v0^2-2*v0*g*sin(theta)*t+g^2*t.^2);
>> h=v0*t*sin(theta)-0.5*g*t.^2;
Determinm acum cnd nlimea nu este mai mic dect 6m i viteza nu
este mai mare dect 16 m/s :
>> u=find(h>6&v<16)
In vectorul u se afl rangurile elementelor din v i h ce verific aceast
condiie. Evident rangurile corespunztoare din t ne dau timpii n care
condiiile sunt ndeplinite . Aceti timpi aparin unui interval dat de
9
primul rang i ultimul rang din u. Determinm capetele acestui interval
astfel:
>> t1=t(u(1))
>> t2=t(u(end))
Soluia problemei este intervalul [t1,t2]

Soluii

1.
a) >> x > y
ans =
0 1 0 1 1 0 0
Vectorul rezultat are 1 pe poziia n care elementul lui x este mai mare
dect elementul lui y i 0 unde elementul lui x este mai mic sau egal cu
elementul corespunztor al lui y.
Analog pentru restul comenzilor.

2.
a) >> x((x > 3) & (x < 8))
ans =

4 5 6 7
Analog pentru restul comenzilor.

3.

a) a =
0 0 0 0 -1 0 -12 0 0 0
b) b =
5 5 5 5 -1 5 5 5 5 1
c) c =
3 15 9 60 -1 0 -60 9 30 1
d) d =
15 12
e) e =
0 15 9 12 0 0 0 9 6 0
f) f =
3.0000,10.8000,4.8000,7.8000,-1.0000,0,-12.0000,4.8000,1.8000, 1.0000

4. a) x =
10
Columns 1 through 15
24 31 8 21 25 15 27 30 26 2 29 22 16 19 10
Columns 16 through 30
33 7 35 4 28 3 11 14 32 6 12 23 9 5 20
Columns 31 through 35
18 13 34 17 1

y =
Columns 1 through 15
12 5 4 15 11 11 9 6 10 2 7 14 12 15 6
Columns 16 through 30
3 3 1 2 8 2 7 10 4 2 8 13 5 2 16
Columns 31 through 35
14 9 2 13 2









11
b)



5. x =
7.0000 3.0000 0.0000 5.0000 -2.0000 0.0000 -1.0000
0.0000 3.1416
>> sin(x)./x
ans =
0.0939 0.0470 1.0000 -0.1918 0.4546 1.0000 0.8415
1.0000 0.0000

6. [0.85, 1.78]

Vous aimerez peut-être aussi