Sunteți pe pagina 1din 41

CURS 11

CUPRINS
• Programarea în Octave (V)
❑ Algoritmi uzuali de căutare în vectori
✓Căutarea secvențială
✓Căutarea binară
❑ Funcții anonime și funcții inline (recapitulare)
❑ Calcul simbolic în Octave / Matlab
✓Instalarea pachetului Symbolic în Octave
✓Funcţii utilizate în vederea efectuării de calcule
simbolice cu aplicații în Algebră
✓Aplicații rezolvate
✓Funcţii utilizate în vederea efectuării de calcule
simbolice cu aplicații în Analiza matematică
✓Aplicații rezolvate
2
Algoritmi de căutare
• Algoritmii de căutare rezolvă următoarea problemă: dacă v
este un vector cu valori oarecare, să se decidă dacă o
anumită valoare x se află printre elementele sale.
• Multe situaţii din lumea reală necesită cunoaşterea acestui
lucru, iar algoritmii dezvoltaţi în această direcţie urmăresc să
rezolve această sarcină cât mai eficient.
• Sortarea şi căutarea sunt două sarcini deseori
interdependente – pentru a face o sortare este necesară
căutarea, pentru căutare uneori este necesară (sau
avantajoasă) sortarea.
3
Algoritmi de căutare
Căutarea secvențială
• Algoritmul de căutare secvențială
• este unul dintre cei mai simpli algoritmi de căutare
• urmăreşte să verifice apartenenţa unui element la un şir de
elemente de aceeaşi natură (în speţă a unui număr la un şir
de numere)
• Pentru aceasta, se parcurge şirul de la un capăt la celălalt
şi se compară numărul căutat cu fiecare element din şir
(pentru aflarea răspunsului, vectorul este parcurs
secvențial).
• În cazul în care s-a găsit corespondenţă (egalitate), un
indicator flag este poziţionat.
• La sfârşitul parcurgerii şirului, indicatorul va arăta dacă
numărul căutat aparţine sau nu şirului. 4
Algoritmi de căutare
• Căutarea secvențială (algoritm – implementare Octave (I) )
clc
clear

% citire vector
n=input('Nr. de elemente ale vectorului: ');
for i=1:n
printf('Dati elementul %i: ',i);
v(i)=input('');
endfor

% afisare vector
disp(v);

% citire element cautat


x=input('Ce element cautati? ');

5
Algoritmi de căutare
• Căutarea secvențială (algoritm – implementare Octave (II) )
% cautarea secventiala a lui x in vector
gasit=0;
for i=1:n
if(v(i)==x)
gasit=1;
endif
endfor

if(gasit==1)
printf('S-a gasit in vector numarul %.0f \n',x);
else
printf('Nu s-a gasit in vector numarul %.0f \n',x);
endif

6
Algoritmi de căutare
Căutarea binară
• Algoritmul de căutare binară
• oferă performanţe mai bune decât algoritmul de căutare
secvenţială
• funcţionează astfel:
• se compară numărul căutat cu elementul aflat la mijlocul
şirului (element care se mai numeşte şi pivot).
• În cazul în care cele două elemente coincid, căutarea s-a
încheiat cu succes.
• Dacă numărul căutat este mai mare decât pivotul, se
continuă căutarea în aceeaşi manieră în subşirul delimitat
de pivot şi sfârșitul şirului iniţial.
• Dacă numărul căutat este mai mic decât pivotul, se
continuă căutarea în aceeaşi manieră în subşirul delimitat
de pivot şi începutul şirului iniţial.
7
Algoritmi de căutare
Căutarea binară
• Algoritmul de căutare binară

• Algoritmul prezentat se încadrează în clasa algoritmilor


elaboraţi conform tehnicii de programare Divide et Impera.
• Unul dintre dezavantajele acestui algoritm este că şirul în
care se face căutarea trebuie să fie iniţial sortat.

8
Algoritmi de căutare
Căutarea binară
• Căutarea binară (algoritm – implementare Octave (I) )
clc
clear

% citire vector
n=input('Nr. de elemente ale vectorului: ');
for i=1:n
printf('Dati elementul %i: ',i);
v(i)=input('');
endfor

% sortare vector
v=sort(v);

% citire element cautat


x=input('Ce element cautati? ');

9
Algoritmi de căutare
Căutarea binară
• Căutarea binară (algoritm – implementare Octave (II) )

% cautarea binara a lui x in vector


st=1; dr=n; gasit=0;
while (st<=dr && gasit~=1)
mijloc=floor((st+dr)/2);
if (v(mijloc)==x)
gasit=1;
elseif (x<v(mijloc))
dr=mijloc-1;
else
st=mijloc+1;
endif
endwhile
if (st>dr)
disp('Nu s-a gasit elementul cautat!');
else
disp('Elementul cautat apartine sirului!');
endif 10
Algoritmi de căutare
• Funcții de căutare în Octave / Matlab
❑ find - caută elementele sau indicii elementelor care îndeplinesc o
anumită condiţie
( https://www.mathworks.com/help/matlab/ref/find.html )
• Exemplu: dacă a = [1 5 2 4 3], atunci
find(a>3) va furniza rezultatul 2 4 (indicii elementelor > 3)
❑ lookup – caută valori într-un tabel sortat și întoarce indexul
elementului găsit
• Exemplu: dacă a = [5 9 6 8 7], atunci
lookup(sort(a),9)=5
lookup(sort(a),9,’b’)=1 % ’b’ indică dacă valoarea 9
segăsește în vector (1 dacă se găsește și 0 în caz contrar)
lookup(sort(a),2,’b’)=0
lookup(sort(a),2,’m’)=0 % ’m’ va determina afișarea indicelui
0 dacă elementul 2 nu se găsește în vector, la fel și în cazul:
lookup(sort(a),2)=0
11
Funcții anonime (recapitulare)
• Se definesc cu sintaxa:
f=@(lista argumente) expresie
• Exemplu:
>> f=@(x) x^2+x-3;
>> f(1)
ans = -1
>> feval(f,10)
ans = 107
>> t=3;
>> f(2*t)+f(t^2)
ans = 126

12
Funcții inline (recapitulare)
• Se definesc cu funcția inline() având drept argument un
string cu expresia funcției.
• Exemplu:

>> f=inline("2*x+sin(x)");
>> f(5)
ans = 9.0411
>> feval(f,3)
̀
ans = 6.1411

13
Calcul simbolic în Octave/Matlab
• Pe lângă evaluarea numerică (calcule cu valori numerice şi
rezultate întotdeauna numerice), Octave și Matlab permit şi
evaluare simbolică (calcule cu simboluri şi rezultate ce conţin
simboluri).
• În Matlab, pentru calculul simbolic se folosește modulul
Symbolic Math Toolbox.
• În Octave, pentru calcul simbolic se utilizează pachetul
Symbolic.

14
Calcul simbolic în Octave/Matlab
• Modulul Symbolic Math Toolbox (Matlab) / pachetul Symbolic
(Octave) suplimentează facilităţile numerice şi grafice ale mediului
Matlab/Octave, adăugând câteva tipuri diferite de calcule
matematice:
• 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
15
specificată.
Calcul simbolic în Octave
Instalarea pachetului Symbolic
• În Octave, pachetul Symbolic reprezintă o bibliotecă de
funcţii implementate în Python.
• Pentru a funcţiona corect în Octave, trebuie ca pe calculator
să fie instalat Python, împreună cu bibliotecile SimPy 1.0 şi
mpmath din Python.
• Descrierea pachetului Symbolic:
https://octave.sourceforge.io/symbolic/overview.html

16
Calcul simbolic în Octave
Instalarea pachetului Symbolic
1) Se verifică dacă pachetul Symbolic este instalat, cu comanda:
>> pkg list
• Este probabil ca pachetul să nu fie instalat. Atunci se vor parcurge
următorii paşi:
2) Se descarcă pachetul Symbolic de la adresa:
https://octave.sourceforge.io/symbolic/
3) Se instalează pachetul Symbolic în Octave cu comanda:
>> pkg install symbolic-2.7.1.tar.gz
• Verificaţi că pachetul s-a instalat:
>> pkg list
4) Se încarcă pachetul Symbolic, cu comanda:
17
>> pkg load symbolic
Calcul simbolic în Octave
Instalarea pachetului Symbolic
5) Se poate verifica folosirea pachetului Symbolic, scriind
comanda de creare a unei variabile simbolice:
>> syms x
• Dacă se obţine un mesaj de eroare, este posibil ca eroarea să
fie din cauză că nu este instalat Python sau versiunea de SymPy
este prea veche.
6) Se instalează Python 3.7 de la adresa:
https://www.python.org/ftp/python/3.7.2/python-3.7.2.exe
7) Se instalează Sympy 1.0 de la adresa:
https://github.com/sympy/sympy/releases/download/sympy-
18

1.0/sympy-1.0.win32.exe
Calcul simbolic în Octave
Instalarea pachetului Symbolic
8) Se instalează mpmath de la adresa:
https://storage.googleapis.com/google-code-archive-
downloads/v2/code.google.com/mpmath/mpmath-0.17.win32.exe
9) Dacă în continuare apare eroare că nu se poate deschide Python, se
definește în Octave o variabilă sistem, cu comanda:
>> setenv("Python","calea completă la
python.exe")
• De exemplu:
>> setenv("Python","C:\\Python\\Python36-
32\\python.exe")
9) Verificați din nou, cu comanda:
>> syms x
19
Calcul simbolic în Octave/Matlab
• Funcţii utilizate în vederea efectuării de calcule simbolice cu
aplicații în Algebră:
Funcție Semnificație
det(A) Calculează determinantul simbolic al matricei A
inv(A) Calculează inversa simbolică a matricei A
transpose(A) Determină transpusa simbolică a matricei A
simplify(E) Simplifică simbolic o expresie E
factor(E) Factorizează expresia E
[r,p,k]= Se obţine descompunerea în fracţii simple pe baza
residue(B,A) parametrilor de ieşire: r (vectorul coloană al
reziduurilor), p (vectorul coloană al polilor), k (vectorul
linie al termenilor liberi)

20
Calcul simbolic în Octave/Matlab
Funcție Semnificație
expand(E) Realizează expandarea expresiei E
coeffs(P,x) Determină coeficienţii polinomului P în raport cu x
solve(eq) Rezolvă ecuaţia eq=0 în raport cu variabila din
expresia eq
solve(eq,var) Rezolvă ecuaţia eq=0 în raport cu variabila var
din expresia eq
solve(eq1,…,eqn, Rezolvă sistemul format din ecuațiile eq1=0, …,
var1,…,varn) eqn=0 în raport cu variabilele var1, …, varn

21
Calcul simbolic în Octave/Matlab
• Variabilele
utilizate în calcule simbolice se declară prin
comanda “scurtă” syms:
syms var1 var2 … Este notația scurtă pentru:
var1=sym(‘var1’);
var2=sym(‘var2’); …
syms var1 var2 … real Este notația scurtă pentru:
var1=sym(‘var1’,’real’);
var2=sym(‘var2’,’real’); …
syms var1 var2 … positive Este notația scurtă pentru:
var1=sym(‘var1’,’positive’);
var2=sym(‘var2’,’positive’); …
22
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
1) Să se definească două variabile simbolice a și b.
>> a=sym(‘a’)
>> b=sym(‘b’)
sau, mai scurt:
>> syms a b
2) Să se calculeze (simbolic) expresiile:
a) 𝑎 + 3𝑎 + 2𝑎2 − 2𝑏 + 4𝑏3
>> E=a+3*a+2*a^2-2*b+4*b^3
E = (sym)
2 3
2*a + 4*a + 4*b - 2*b
b) 𝑎2 − 𝑏2
>> E=a^2-b^2
E = (sym)
2 2 23

a - b
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
3) Să se simplifice expresia:
3𝑛+2 5𝑛 + 3𝑛 5𝑛+1
𝐸 = 𝑛+1 𝑛
3 5 + 2 ∙ 3𝑛+1 5𝑛

>>syms n
>>E=(3^(n+2)*5^n+3^n*5^(n+1))/(3^(n+1)*5^n+2*3^(n
+1)*5^n);
>> simplify(E)
ans = (sym) 14/9

24
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
4) Să se calculeze determinantul, transpusa și inversa simbolică pentru
matricea:
cos 𝑥 − sin 𝑥
𝐴=
sin 𝑥 cos 𝑥
>> syms x
>> A=[cos(x) -sin(x); sin(x) cos(x)];
>> det(A)
ans = (sym)
2 2
sin (x) + cos (x)
>> simplify(det(A))
ans = (sym) 1
>> transpose(A)
ans = (sym 2x2 matrix)
[cos(x) sin(x)]
[-sin(x) cos(x)]
>> simplify(inv(A))
ans = (sym 2x2 matrix) 25
[cos(x) sin(x)]
[-sin(x) cos(x)]
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
5) Să se factorizeze expresia:
𝐸 = 𝑥 3 + 𝑦𝑥 2 − 2 3𝑥 2 𝑦 − 2 3𝑥𝑦 2 + 3𝑦 2 𝑥 + 3𝑦 3

>> E=x^3+y*x^2-2*sqrt(3)*x^2*y-2*sqrt(3)*x*y^2+3*y^2*x+3*y^3;
>> factor(E)
ans = (sym)

/ 2 ___ 2\
(x + y)*\x - 2*\/ 3 *x*y + 3*y /

26
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
6) Să se calculeze suma:
3 5 1
𝑆𝑛 = 2 + + + ⋯ + 1 + 𝑛−1 , 𝑛 ∈ ℕ
2 4 2

>> syms n i
>> S=simplify(symsum(1+1/(2^(i-1)),i,1,n))
S = (sym)

-n + 1
- 2 + n + 2

27
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
7) Descompuneți în fracții simple expresia:
𝑥+1
𝑥 3 − 7𝑥 2 + 15𝑥 − 9
• Pasul 1. Scriem vectorul linie ce conţine coeficienţii polinomului de la numărătorul
fracţiei.
>> B=[1 1];

• Pasul 2. Scriem vectorul linie ce conţine coeficienţii polinomului de la numitorul fracţiei.


>> A=[1 -7 15 -9];

• Pasul 3. Apelăm funcţia residue.


>> [r,p,k]=residue(B,A)
>> r =
-0.50000
2.00000
0.50000 28
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
p =
3.0000
3.0000
1.0000
k = [](0x0)
• Prin urmare, există doi poli: primul de ordinul doi, p(1)=3 şi cel de-al doilea
de ordinul întâi, p(2)=1.
• Descompunerea nu conţine termeni liberi (deoarece k este vectorul nul).
• Pe baza rezultatelor obţinem următoarea descompunere în fracţii simple:
1 2 1
− + +
2 𝑥−3 𝑥−3 2 2 𝑥−1

• Observație. Descompunerea în fracții simple se obține astfel:


𝐵(𝑥) 𝑟(1) 𝑟(2) 𝑟(𝑛)
= + + ⋯+ + 𝑘(𝑛)
𝐴(𝑥) 𝑥−𝑝(1) 𝑥−𝑝(2) 𝑥−𝑝(𝑛)
29
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
8) Rezolvați ecuația în raport cu variabila 𝑥:
𝑥 2 − 2 𝑚 + 2 𝑥 + 𝑚2 − 1 = 0

>> syms x m
>> x=solve('x^2-2*(m+2)*x+m^2-1',x)
x = (sym 2x1 matrix)

[ _________ ]
[m - \/ 4*m + 5 + 2]
[ _________ ]
[m + \/ 4*m + 5 + 2]

30
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
9) Rezolvați sistemul de ecuații în raport cu 𝑥, 𝑦, 𝑧:
3𝑥 + 4𝑦 + 𝑚𝑧 = 0
ቐ 4𝑥 + 𝑚𝑦 + 3𝑧 = 6 ,𝑚 ∈ ℝ
𝑚𝑥 + 3𝑦 + 4𝑧 = 3 + 𝑚
>> syms x y z m
>> [x,y,z]=solve('3*x+4*y+m*z','4*x+m*y+3*z-6’,
'm*x+3*y+4*z-3-m',x,y,z)

x = (sym)
/ 2 \
-18*m + (m + 3)*\m - 12/ + 96
------------------------------
3
m - 36*m + 91

31
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
9) Rezolvați sistemul de ecuații în raport cu 𝑥, 𝑦, 𝑧:
3𝑥 + 4𝑦 + 𝑚𝑧 = 0
ቐ 4𝑥 + 𝑚𝑦 + 3𝑧 = 6 ,𝑚 ∈ ℝ
𝑚𝑥 + 3𝑦 + 4𝑧 = 3 + 𝑚
y = (sym)
2
2*m - 3*m - 45
---------------
3
m - 36*m + 91

z = (sym)
2
- 3*m - 17*m + 102
-------------------
3
m - 36*m + 91 32
Calcul simbolic în Octave/Matlab
• Funcţii utilizate în vederea efectuării de calcule simbolice cu
aplicații în Analiză matematică:
Funcție Semnificație
limit(f,x,a) Calculează limita expresiei simbolice f când 𝑥 → 𝑎
limit(f,x,a, Calculează limita expresiei simbolice f când 𝑥 → 𝑎, 𝑥 > 𝑎
’right’)
limit(f,x,a, Calculează limita expresiei simbolice f când 𝑥 → 𝑎, 𝑥 < 𝑎
’left’)
symsum(s,v,a,b) Calculează simbolic σ𝑏𝑣=𝑎 𝑠
diff(f,’x’) Calculează simbolic 𝑓 ′ (𝑥)
diff(f,’x’,n) Calculează simbolic 𝑓 (𝑛) (𝑥)
int(f) Calculează simbolic ‫)𝑥(𝑓 ׬‬

33
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
1) Să se calculeze
1
lim 𝑒𝑥
𝑥→0,𝑥>0
>> syms x
>> limit(exp(1/x),x,0,'right')
ans = (sym) oo

2) Să se calculeze
𝑛 2𝑛 !
lim
𝑛→∞ 𝑛! 2
>> syms n
>> limit(('(2*n)!/(n!^2)')^(1/n),n,inf)
ans = (sym) 4

34
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
3) Să se calculeze
𝑛
𝑖 2 + 3𝑖 + 1
𝑛−෍ 2
𝑖 + 3𝑖 + 2
𝑖=1

>> syms n i
>> s=(i^2+3*i+1)/(i^2+3*i+2);
>> simplify(n-symsum(s,i,1,n))
ans = (sym)

n
---------
2*(n + 2)

35
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
4) Să se calculeze derivata 𝑓 ′ 𝑥 a funcției:
𝑓 𝑥 = 𝑐𝑜𝑠 2 𝑥

>> diff(cos(sqrt(x))^2)
ans = (sym)

/ ___\ / ___\
-sin\\/ x /*cos\\/ x /
-----------------------
___
\/ x
Sau:

>> f=@(x) cos(sqrt(x))^2;


>> diff(f(x)) 36
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
5) Să se calculeze derivata 𝑓 ′′ 𝑥 a funcției:
𝑓 𝑥 = 𝑥 ∙ 𝑎𝑟𝑐𝑡𝑔 𝑥 − ln(1 + 𝑥 2 )

>> diff(diff(x*atan(x)-log(1+x^2)))
ans = (sym)
2
2*x
---------
2
/ 2 \
\x + 1/

Sau:

>> diff(x*atan(x)-log(1+x^2),2) 37
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
6) Să se calculeze
2
න 2 ⅆ𝑥
𝑥
>> syms x
>> simplify(int(2/x^2))
ans = (sym)

-2
---
x

38
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
7) Să se calculeze
1

න 𝑥 + 1 ⅆ𝑥
0
>> syms x
>> f=@(x) x+1;
>> int(f(x),0,1)
ans = (sym) 3/2

39
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
8) Să se calculeze
1

න sin 𝑥 + 2𝑥 ⅆ𝑥
0
>> syms x
>> f=@(x) sin(x)+2*x;
>> double(int(f(x),0,1))
ans = 1.4597

40
Calcul simbolic în Octave/Matlab
Aplicații rezolvate
9) Să se reprezinte graficul funcției
𝑓 𝑥 = sin 𝑥 + 2𝑥
pe intervalul [−2𝜋, 2𝜋]

>> syms x
>> f=@(x) sin(x)+2*x;
>> ezplot(f(x), [-2*pi,2*pi])

41

S-ar putea să vă placă și