Taller de MATLAB: P0

Aquest material està pensat per introduir-vos en les matemàtiques des d'un punt de vista numèric. Per això es necessita una èina com el Matlab (Matrix Laboratory) de MathWorks, que faciliti els càlculs i a la vegada sigui prou flexible i potent per poder resoldre problemes en tots els camps de l'Enginyeria.
Espero que a partir d'ara el Numèric us acompany!!
TS.

La Interfície de Matlab

Una vegada executem el Matlab, s'obre la finestra principal (interficie) que està descomposada en 3 columnes principals:

Instruccions de Matlab

Per comunicar-nos amb el nucli del Matlab i fer els càlculs numèrics que necessitem, ens cal un lleguatge de programació (propi de Matlab) que proporciona les instruccions que ens faran falta per realitzar el càlcul.
Per passar-li instruccions al Matlab, ho podem fer de dues formes
>>x = 2; %si posem punt i coma el resultat no es mostra per pantalla
>>y = 3;
>>x + y
Ja veurem exemples, però es tracta d'escriure totes les instruccions en un fitxer ( també anomenat script ) i fer play. Anem a fer-ho:
  1. Premeu sobre la icona del signe + de la interficie. S'obrirà un full en blanc dins de la finestra de l'editor.
  2. Copieu les 3 linies dins l'espai amb fons gris d'aquí sota
  3. Premeu sobre el botó de run. Us demamarà un nom pel fitxer, podeu posar-li el que volgueu, per exemple: prac0. Automàticament s'executarà i sortirà el resultat al Command Window
x = 2;
y = 3;
x + y
ans = 5

Operacions Elementals

suma = x+y
suma = 5
resta = x-y
resta = -1
producte = x*y
producte = 6
divisio = x/y
divisio = 0.6667
potencia = x^y
potencia = 8

Funcions Matemàtiques Elementals

arrelquad=sqrt(x)
arrelquad = 1.4142
arrelcub=x^(1/3)
arrelcub = 1.2599
sinus_a=sin(x)
sinus_a = 0.9093
cosinus_a=cos(x)
cosinus_a = -0.4161
tangent_a=tan(x)
tangent_a = -2.1850
valor_pi=pi %és una variable de matlab pel número pi (no utilitzar aquest nom com a variable!!)
valor_pi = 3.1416
% de la mateixa manera: asin,acos,atan,sinh,cosh,asinh,acosh,
% exp i log (que és el logaritme NEPERIÀ)

Alliberar una variable

si volem esborrar una variable farem us de la comanda clear
clear x;
% si per error assignem una variable de matlab i ho volem tornar a arreglar
% farem servir clear
pi = -1
pi = -1
clear pi;
pi
ans = 3.1416
% COMPTE!! si escribim: 'clear all' o tant sols 'clear' esborrem TOTES les variables del Workspace

Conversió entre tipus de nombres

x = pi;
xt = ceil(x); %enter més proper per sobre
xb = floor(x); %enter més proper per sota
xr = round(x); %arrodoniment a l'enter més proper
[x, xt, xb, xr] %mostrem el resultats junts (és com crear un vector com veurem deseguida)
ans = 1×4
3.1416 4.0000 3.0000 3.0000
x32 = single(x) %nombre real però només amb 32bits (=4bytes)
x32 = single
3.1416
nb = dec2bin(2*x) %representació binària de round(2*x)=6 (només serveix per enters)
nb = '110'
ndec = bin2dec('110') %el pas contrari a l'anterior
ndec = 6

Manipulació de Vectors

Per crear un vector podem definir-lo de dues formes:
  1. directament: v=[1,2,3,4] (valors separats per comes o espais en blanc)
  2. per rangs: v=1:4 (el format és v=Inici:pas:Final (per defecte pas=1 i no cal posar-lo))
  3. per valors equiespaiast: linspace(1,4,4) (consulteu la funció linspace)
vectorF = [1,2,3,4]
vectorF = 1×4
1 2 3 4
vectorF = [1 2 3 4] %l'espai en blanc és equivalent a la coma
vectorF = 1×4
1 2 3 4
vecRang = 1:2:8 %rang de valors
vecRang = 1×4
1 3 5 7
vectorC = [1;2;3;4]
vectorC = 4×1
1
2
3
4
vecRang(4) = 19 %accedim a la component 4 i la modifiquem. Noteu els parèntesis rodons.
vecRang = 1×4
1 3 5 19
vecRang(1:3) = 6 %modifiquem els valors de les components 1 a la 3
vecRang = 1×4
6 6 6 19
ind=[4,3];
vecRang(ind) %mostrem les components 4 i 3 del vector vecRang
ans = 1×2
19 6

Altres manipulacions que es poden fer amb vectors

Per exemple:
u = vectorF*vectorC
u = 30
trasP = vectorC' % vector trasposat
trasP = 1×4
1 2 3 4
length(vectorF)
ans = 4
length(vectorC)
ans = 4
pEsc = dot(vectorF,vectorC') %els dos vectors han de ser files
pEsc = 30

Ordenació de les components d'un vector: sort

v = [5,2,-1,9,0];
w = sort(v) %dona els valors ordenats
w = 1×5
-1 0 2 5 9
% de forma equivalent
[vOrdenat,perm] = sort(v) %perm dona les posicions de v amb l'ordre creixent
vOrdenat = 1×5
-1 0 2 5 9
perm = 1×5
3 5 2 1 4
w = v(perm) %ho veiem ordenat sense perdre l'ordre del vector original
w = 1×5
-1 0 2 5 9

Consultar qualsevol funció o comanda en Matlab

Una de les avantatges que te Matlab és que hi ha molta documentació a internet. Podeu googlejar qualsevol pregunta relacionada amb Matlab. De totes formes, si sabem el nom de la funció o instrucció que volem consultar, és suficient utilitzar la comanda doc
doc max %obre la pàgina de la documentació associada a la funció max

Operacions sobre tot un vector: element wise

Totes les funcions matemàtiques elementals permeten la seva avaluació en tot un vector i no només en un escalar. Així, sin(x) retorna un vector si x és un vector
x=[0, pi/2, pi, 3*pi/2, 2*pi];
y=sin(x);
[x; y] %mostrem els resultats un sobre l'altre (és com crear una matriu, veure més abaix)
ans = 2×5
0 1.5708 3.1416 4.7124 6.2832
0 1.0000 0.0000 -1.0000 -0.0000
Ara be, si tenim un vector i volem fer una operació que no seria la correcta matemàticament parlant, per exemple elevar les seves components al quadrat, llavors no es pot fer v^2, cal fer v.^2
A a quest punt se'l denomina element wise operator
v = 1:5
v = 1×5
1 2 3 4 5
vq = v.^2
vq = 1×5
1 4 9 16 25
anàlogament, si volem aplicar una funció a totes les components d'un vector farem us d'aquest operador. Per exemple, per calcular w = x*sin(x) per tot un vector x, farem
x = -2:2;
w = x.*sin(x) % com s'ha comentat, les funcions elementals ja estan preparades per actuar sobre
w = 1×5
1.8186 0.8415 0 0.8415 1.8186
% vectors i per tant no cal escriure w = x.*sin(x.);
Si la operació és lineal no calen els punts perquè ja està ben definida pels vectors w = 3x+sin(x)
w = 3*x+sin(x) %tot i que el sin(x) no és lineal ja retorna un vector
w = 1×5
-6.9093 -3.8415 0 3.8415 6.9093
%que és de la mateixa mida que x i per això es pot sumar.
Un cas especial de no linealitat és la divisió
w = 1./x %fa l'invers de tots els elements de x
w = 1×5
-0.5000 -1.0000 Inf 1.0000 0.5000
w = x./sin(x.^2)
w = 1×5
2.6427 -1.1884 NaN 1.1884 -2.6427

Infinits i Indeterminacions

Noteu que en els resultats anteriors han aparegut dues noves variables amb Matlab Inf i NaN, que representen infinit i una indeterminació (not a number) respectivament. Això és degut a una divisió per zero en el primer cas i un 0/0 en el segon.
Matlab permet l'aritmètica amb els infinits i detecta les indeterminacions
w1 = Inf^2 + 1024
w1 = Inf
w2 = 0/Inf
w2 = 0
w3 = Inf - Inf
w3 = NaN

Exercici:

Doneu la sentència de Matlab per avaluar sobre vectors les funcions:

Manipulació de Matrius

Ja dedicarem una altra pràctica a la manipulació de matrius, però només com a introducció i perquè veieu la versatilitat del Matlab, sapigueu que:
Per crear una matriu podem definir-la a partir de diversos vectors:
A = [ 1 2 3 2; 0 -2 3 1; 6, 7, 8, -6] %matriu 3x4 definida per files
A = 3×4
1 2 3 2
0 -2 3 1
6 7 8 -6
v = [10 20 30]
v = 1×3
10 20 30
B = [1 2; 3 4; -1 -2]
B = 3×2
1 2
3 4
-1 -2
A = [B,v']
A = 3×3
1 2 10
3 4 20
-1 -2 30
C = [v; B']
C = 3×3
10 20 30
1 3 -1
2 4 -2
% mireu d'entendre els resultats obtinguts
Afila1 = A(1,:) %tota la primera fila
Afila1 = 1×3
1 2 10
Acolumna2 = A(:,2) %tota la segona columna
Acolumna2 = 3×1
2
4
-2
Asub = A(1:2, [1,3]) %submatriu formada per les files 1 i 2 i les columnes 1 i 3
Asub = 2×2
1 10
3 20
(c) Numerical Factory 2019