programaciÓ en matlab · matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0...

34
Introducció a la programació Matlab 1 PROGRAMACIÓ EN MATLAB Objectius L’objectiu d’aquest document és donar una introducció a la programació en Matlab. Per això: Es presentaran les característiques principals de l'entorn que proporciona Matlab i les bases del llenguatge de programació. S’ensenyarà com treballar amb vectors i matrius en Matlab i s’analitzarà el seu ús en la representació de gràfiques en 2D i 3D. S'introduirà la utilització dels fitxers .m. Es mostrarà com utilitzar les sentències de control de flux i s’aprendrà a utilitzar el debugger per trobar errors en un programa. Es presentaran diferents maneres per treballar amb inputs i outputs. MATLAB MATLAB és un programa que permet realitzar càlculs d’una forma ràpida i fiable. A diferència de programes com el Maple o el Mathematica, Matlab no és un manipulador algebraic i només pot operar amb variables reals i complexes. Matlab és el nom abreviat de ‘MATrix LABoratory’. Tal i com el seu nom indica, és un programa pensat per a treballar amb matrius de manera que permet implementar còmodament i ràpidament qualsevol algoritme que les utilitzi. Descripció de l'entorn Matlab En arrencar Matlab s'obre una finestra similar a la mostrada a la Figura 1. Fig. 1: Finestra inicial de Matlab. Command window Current Directory / Workspace Command History

Upload: others

Post on 06-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 1

PROGRAMACIÓ EN MATLAB Objectius L’objectiu d’aquest document és donar una introducció a la programació en Matlab. Per això: • Es presentaran les característiques principals de l'entorn que proporciona Matlab i

les bases del llenguatge de programació. • S’ensenyarà com treballar amb vectors i matrius en Matlab i s’analitzarà el seu ús

en la representació de gràfiques en 2D i 3D. • S'introduirà la utilització dels fitxers .m. • Es mostrarà com utilitzar les sentències de control de flux i s’aprendrà a utilitzar el

debugger per trobar errors en un programa. • Es presentaran diferents maneres per treballar amb inputs i outputs. MATLAB MATLAB és un programa que permet realitzar càlculs d’una forma ràpida i fiable. A diferència de programes com el Maple o el Mathematica, Matlab no és un manipulador algebraic i només pot operar amb variables reals i complexes. Matlab és el nom abreviat de ‘MATrix LABoratory’. Tal i com el seu nom indica, és un programa pensat per a treballar amb matrius de manera que permet implementar còmodament i ràpidament qualsevol algoritme que les utilitzi. Descripció de l'entorn Matlab En arrencar Matlab s'obre una finestra similar a la mostrada a la Figura 1.

Fig. 1: Finestra inicial de Matlab.

Command window Current Directory / Workspace

Command History

Page 2: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 2

Es poden distingir tres pantalles que engloben els quatre entorns de treball de Matlab següents:

• Command Window: és la part on s'executen les comandes. El símbol >> indica que el programa està preparat per rebre instruccions.

• Current Directory: és la finestra on es mostren els arxius del directori que es té actiu.

• Workspace: mostra les variables que s'han definit i el seu valor. • Command History: mostra les últimes comandes executades a la

Command Window. Una cosa important a l’hora de començar a treballar amb Matlab, és modificar el directori de treball Current Directory de manera que en aquest directori hi tinguem tots els fitxers que utilitzarem. És útil saber que dins de l'entorn Current Directory podem utilitzar el botó dret del ratolí per a crear carpetes. A més, podem esborrar i crear fitxers com en qualsevol carpeta de l'ordinador. Exercici: Genereu un nou directori de nom introduccio_matlab i feu que aquest nou directori sigui el directori de treball de Matlab. Com a la majoria d'aplicacions de Windows, a la part superior de la finestra de Matlab apareixen diverses pestanyes. Entre elles, cal destacar:

• Desktop: dóna accés a diferents mòduls de Matlab que es poden tenir instal·lats. De la mateixa manera que accionant el botó Start que es troba a l'extrem inferior esquerre.

• Help: Matlab disposa d'un Help molt potent i útil. A la pestanya del Help es

poden trobar, entre altres, les següents opcions: § Matlab Help: Anant a l'apartat de cerca (Search), es pot trobar

com implementar qualsevol instrucció. § Demos: Dóna accés a alguns exemples resolts amb Matlab. § About Matlab: Proporciona la informació del programa que es té

instal·lat. Per a sortir de Matlab es pot utilitzar l'opció Exit Matlab del menú File o bé escriure directament en la línia de comandes la instrucció quit. També l'accés ràpid Ctrl+Q ens permet sortir de Matlab. Finalment, si volem parar l'execució d'un càlcul, cal que ens posem sobre la Command Window i premem les tecles d'accés ràpid Ctrl+C. Aquesta opció ocasiona, en la majoria dels casos, que s'interrompi el procés actual i que ens aparegui de nou el prompt (símbol >>). Per conèixer millor com funciona el Help de Matlab o altres aspectes sobre l'entorn de treball podeu consultar el llibre “Aprenda Matlab 7.0 como si estuviera en primero”.

Page 3: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 3

Operacions bàsiques Encara que el programa està pensat per treballar amb vectors i matrius, també es pot utilitzar com un llenguatge de programació escalar. Les operacions algebraiques s'executaran segons la següent prioritat:

1. potències: ^ 2. productes i divisions d'esquerra a dreta: *, / 3. sumes i restes d'esquerra a dreta: +, -

Aquesta prioritat es pot alterar mitjançant la utilització de parèntesis. Exemple 1: » 2+3*2 ans = 8 Exemple 2: » (2+3)*2 ans = 10 Exemple 3: » (2/3^2*5)*(3-4^3)^2 ans = 4.1344e+003 Exercici: Realitzeu el següent càlcul

utilitzant el mínim nombre de parèntesis possible. És usual quan es treballa amb Matlab voler tornar a executar o modificar una comanda introduïda anteriorment. Això es pot fer de manera ràpida utilitzant qualsevol de les dues opcions següents:

• Command History: podem seleccionar la comanda que volem executar i/o modificar. Per executar-la de nou només cal fer doble clic sobre ella. Mitjançant el botó dret del ratolí podem també copiar-la i enganxar-la de nou per a poder-la modificar.

• Tecles ↑ i ↓ del teclat: si es premen les tecles ↑ i ↓ sobre la línia de

comandes (>>) Matlab ens va mostrant les comandes que hem executat anteriorment.

Exercici: Realitzeu el següent càlcul

aprofitant l'exercici anterior. Es pot canviar el format d'escriptura dels resultats numèrics mostrats al Command Window. La manera usual de fer aquesta modificació és mitjançant les comandes format short   i   format long   que s'utilitzen directament des de la línia de comandes i   que permeten ensenyar els nombres amb 4 o 15 decimals respectivament. Alternativament, també es pot canviar el format de visualització dels

Page 4: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 4

resultats mitjançant l'opció Preferences del menú File, anant a l'apartat Command Window i modificant el format numèric, Numeric Format. Les opcions short  i  long són equivalents a format short  i  format long respectivament.   Exercici: Mostreu el resultat de l'últim exercici amb 15 decimals. Assignació de variables Quan interessa guardar un valor o el resultat d'una operació per poder utilitzar-lo posteriorment, aquests s'assignen a una variable. La instrucció bàsica en Matlab és

variable = expressió; El ";" al final de la sentència serveix únicament per suprimir la resposta per pantalla. Exemple 4: » x=3.4; » y=2.7; » z=x+y z = 6.1000 Quan definim una variable, aquesta ens apareix al Workspace. En aquest entorn, podem mirar el valor de la variable i també podem esborrar-les, reanomenar-les, canviar el seu valor...   Quan s'escriu directament l'expressió, el resultat s'emmagatzema en una variable anomenada ans. Com a nom de les diferents variables es pot utilitzar qualsevol seqüència de caràcters alfanumèrics sempre que comencin per una lletra. Matlab utilitza els primers 31 caràcters del nom de la variable i distingeix entre majúscules i minúscules. Hi ha alguns noms especials que convé no utilitzar perquè corresponen a valors ja definits  en el programa  (eps, pi, realmax, realmin...).   La instrucció who proporciona un llistat de les variables que s'estan utilitzant, i per saber l'espai que ocupen en memòria cadascuna d'aquestes variables es té la instrucció whos. Finalment, la instrucció clear seguida del nom d'una variable esborrarà el seu contingut i si s'executa únicament clear o bé clear all s'esborraran totes les variables. Funcions de Matlab Matlab disposa de diverses funcions que ja estan programades i es poden utilitzar. Exemple 5: » a=sqrt(4) a = 2 » b=log(a) b = 0.6931

Page 5: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 5

Encara que al Help de Matlab es poden consultar totes les funcions disponibles, presentem aquí algunes de les més freqüentment utilitzades en l'àrea de matemàtiques:  abs valor absolut d'un nombre real o mòdul d'un nombre complex acos, asin, atan inversa del sinus, cosinus i tangent ceil arrodoneix al següent enter cos, sin, tan cosinus, sinus i tangent d'una angle expressat en radians exp exponencial floor arrodoneix a l'enter anterior gcd màxim comú divisor lcm mínim comú múltiple log, log2, log10 logaritme natural, en base 2 i en base 10 rem residu d'una divisió sqrt arrel quadrada Veure les referències [1], [2] i [3] per obtenir una llista detallada de les funcions disponibles a Matlab. A més, la comanda @ ens permet definir funcions senzilles que podrem avaluar de forma ràpida. En el següent exemple es defineix la funció f(x) = x2+8 i s'avalua en els punts 0 i 1. » f = @(x) x^2 + 8; » f(0) ans = 8 » f(1) ans = 9

Exercici: Definiu la funció següent funció

i avalueu-la en el punts 0 i 1. Vectors Com ja s'ha comentat, Matlab permet treballar còmodament amb vectors i matrius. Un dels avantatges que té Matlab a l’hora de treballar amb vectors i matrius és que per a definir-los no cal qui li diguem per avançat quina mida han de tenir. Això és un gran avantatge, ja que podem anar modificant-ne la mida a mesura que anem calculant. En aquest apartat veurem com es defineixen els vectors en Matlab i quines operacions es poden efectuar amb ells. Exemple 6: Per a definir un vector fila s’escriuen les seves components entre claudàtors, separades per comes o per espais en blanc.  » x=[1 2 5 -2 6] x = 1 2 5 -2 6 » x=[1,2,5,-2,6]

Page 6: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 6

x = 1 2 5 -2 6 » y=[-5:5] y = -5 -4 -3 -2 -1 0 1 2 3 4 5 » z=[0:0.5:2] z = 0 0.5000 1.0000 1.5000 2.0000 Exemple 7: Per a definir un vector columna s’escriuen les seves components entre claudàtors, separades per punts i coma o mitjançant salts de línia. » x=[2 3 -1 7] x = 2 3 -1 7 » y=[1;3;6;-9;0] y = 1 3 6 -9 0 Exemple 8: La comanda ' ens permet transposar vectors. » x=[1 2 5 -2 6]; » y=x' y = 1 2 5 -2 6 És important ressaltar que algunes operacions amb vectors poden canviar de significat segons estan definits aquests vectors. Exemple 9: Multiplicar un vector fila per un vector columna dóna com a resultat un escalar (producte escalar estàndard entre dos vectors). » x=[1 2 5 -2 6]; » y=[3;5;1;-2;0]; » x*y ans = 22 Exemple 10: Multiplicar un vector columna per un vector fila dóna com a resultat una matriu (en aquest cas el producte és el producte estàndard entre dues matrius). » y*x

Page 7: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 7

ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions amb vectors component a component: Exemple 11: Per elevar al quadrat tots els components d'un vector utilitzem un punt davant del símbol ^ » y=[3;5;1;-2;0]; » y.^2 ans = 9 25 1 4 0 Exemple 12: Per multiplicar dos vectors component a component utilitzem un punt davant del símbol * » x=[1 2 3]; » y=[4 5 6]; » x.*y ans = 4 10 18 Exemple 13: Matlab ofereix un operador per transposar vectors. Concretament, en el següent exemple el vector x' és un vector columna de tres files. » x=[1 2 3]; » x'; ans = 1 2 3 Finalment, si apliquem una de les funcions internes de Matlab a un vector, automàticament aquesta s’aplica sobre totes les components del mateix. De la mateixa manera, també podem aplicar una funció definida per l’usuari a un vector, però cal recordar que les operacions que defineixin la funció han de poder ser aplicades a un vector. Exercici: Calculeu el valor de la funció

en els punts [100,98,96,...,2,0]. Per ampliar tota aquesta informació, consultar [2].

Page 8: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 8

Gràfics 2D bàsics A continuació s'analitzaran alguns exemples de gràfics en 2D. Observeu que cal definir dos vectors. En el primer es guarden les abscisses dels punts i en el segon s'emmagatzemen les seves ordenades. Exemple 14: » x=linspace(0, 4*pi, 50); » y=sin(x)-cos(x); » plot (x,y); Observeu que s'ha definit el vector de les x mitjançant la funció linspace, obtenint així un vector de punts equiespaiats entre 0 i π4 , prenent 50 passos. A més, per calcular la funció f(x)=sin(x)-cos(x) s'utilitzen les funcions sin i cos que proporciona Matlab. Aquestes funcions prenen com a argument un vector i tornen com a resultat un altre vector. Per tant, el vector y conté les imatges dels punts emmagatzemats en el vector x. Exemple 15: » x=-3 : 0.1: 3; » y=exp(-x.^2); » plot (x,y); En aquest cas el vector de les 'x' s'ha definit mitjançant l'operador ":". Concretament, s'ha definit com un vector tal que la primera component val -3, l'última component val 3 i les components intermèdies s'incrementen de 0.1 a 0.1. Observeu que per calcular la funció f(x)=e-x2 s'ha utilitzat l'operador '.^' per fer el producte, component a component, del vector de les 'x'.

0 2 4 6 8 10 12 14-1.5

-1

-0.5

0

0.5

1

1.5

Page 9: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 9

Per a més informació de les opcions de representació en 2D, consultar el Help de Matlab o la bibliografia recomanada. Observacions i comentaris Els missatges d'error que el programa presenta quan s'ha implementat una operació incorrecta solen ser de gran ajuda. Per això és important llegir-los i interpretar-los correctament. Com a exemple, es mostren algun dels errors més freqüents:

• Error: ")" expected, "end of line" found.  No tenim els parèntesis ben tancats. Matlab avisa de que ha trobat el final de la línia quan esperava trobar un parèntesi )

 • Error: Missing operator, comma, or semicolon.  

Error: Falta algun operador, coma o dos punts. Hi ha algun error en l’escriptura.

 • ??? Error using ==> ^

Matrix must be square.

Error a l’utilitzar l’operador ^. La matriu ha de ser quadrada. L'operador potència només es pot aplicar a escalars o matrius quadrades. Error que surt generalment quan es vol calcular una potència de tots els elements d'un vector i no hem posat .^ sinó només ^  

 • ??? Error using ==> *

Inner matrix dimensions must agree.

Error freqüent a l'operar amb matrius/vectors. Probablement, estem intentant multiplicar dos vectors o matrius i les seves dimensions no concorden.

Matrius En aquest apartat es repassen la definició de vectors i matrius i es mostren les operacions més habituals amb vectors i matrius. • Definició de matrius:

o Per files: Exemple 16: » [2 4; -1 0] ans = 2 4 -1 0

o Mitjançant vectors: Exemple 17: » x=[5 6 7]; » y=[0 -1 2]; » M=[x;y] M = 5 6 7 0 -1 2

Page 10: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 10

o Mitjançant funcions pròpies per a la generació de matrius: Matlab té

definides algunes funcions per crear matrius com ones(m,n), zeros(m,n), eye(m,n), rand(m,n). Exemple 18: » ones(3,5) ans = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Crea una matriu de 3 files i 5 columnes plena d'uns. De la mateixa manera, zeros(m,n) crea una matriu de m files i n columnes amb tots els seus coeficients nuls. A més, eye(m,n) crea una matriu de dimensió mxn amb uns a la diagonal. Per crear una matriu amb coeficients aleatoris s'utilitza la funció rand(m,n).

• Operacions: Exemple 19: Suma de matrius. » A=[2 3 0; -3 5 6; 0 9 1] A = 2 3 0 -3 5 6 0 9 1 » B=[1 0 0; 0 9 7; -3 -4 5] B = 1 0 0 0 9 7 -3 -4 5 » A+B ans = 3 3 0 -3 14 13 -3 5 6 Exemple 20: Suma d'una constant a tots els coeficients d'una matriu. » A+1 ans = 3 4 1 -2 6 7 1 10 2 Exemple 21: Producte de matrius. » A*B ans = 2 27 21 -21 21 65 -3 77 68

Exemple 22: Càlcul del producte » A/B ans = 1.1370 0.2055 -0.2877

1−AB

Page 11: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 11

-2.2192 0.6712 0.2603 -2.2192 0.6712 -0.7397

Exemple 23: Càlcul del producte » A\B ans = 1.1573 1.1124 -0.7753 -0.4382 -0.7416 0.5169 0.9438 2.6742 0.3483 Exemple 24: Operacions component a component de matrius: » A.*B ans = 2 0 0 0 45 42 0 -36 5 » A.^2 ans = 4 9 0 9 25 36 0 81 1

• Accés a una de les components de la matriu. Indexació.

Exemple 25: » A=rand(6,5) A = 0.9501 0.4565 0.9218 0.4103 0.1389 0.2311 0.0185 0.7382 0.8936 0.2028 0.6068 0.8214 0.1763 0.0579 0.1987 0.4860 0.4447 0.4057 0.3529 0.6038 0.8913 0.6154 0.9355 0.8132 0.2722 0.7621 0.7919 0.9169 0.0099 0.1988 » A(2,1) ans = 0.2311

Exemple 26: Definició de matrius a partir de submatrius. » A(2:5,3:4) ans = 0.7382 0.8936 0.1763 0.0579 0.4057 0.3529 0.9355 0.8132

Observeu que s'ha considerat la matriu A de l'exemple anterior.

Exercici: Definiu de forma hàbil les següents matrius

BA 1−

Page 12: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 12

Exercici: Anomeneu A a la darrera matriu de l'exercici anterior i extraieu els següents objectes, amb una sola instrucció de Matlab en cada cas:

• la primera columna de la matriu com a vector columna • la tercera fila de la matriu com a vector columna • una matriu 2x2 que contingui els elements de les cantonades de la matriu A

Arxius .m En lloc de treballar a la Comand Window, es poden crear arxius amb les instruccions que es volen executar i després cridar-los amb Matlab mitjançant el seu nom. Es tracta d'arxius de tipus .m. Per treballar amb aquests arxius cal obrir l'editor de Matlab i des d'aquí es van modificant. Anem a veure com fer un programa que defineix dos nombres i calculi la seva suma. Per a obrir l’editor de Matlab, anirem al menú File i farem clic sobre New i posteriorment sobre Blank M-File.

   Això ens obrirà la finestra de l’editor de Matlab on podrem escriure les operacions tal i com ho fèiem a la Command Window.

   A l’hora de guardar el fitxer, recordeu que cal guardar-lo al directori de treball. En aquest cas generarem una carpeta introduccio_matlab i guardarem el fitxer que hem generat com a suma.m. Al fer-ho, en la part de dalt de l’editor ens apareixerà el nom suma.m i també si anem a la finestra del Current Directory haurem de veure el fitxer.

Page 13: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 13

   Hi ha diverses maneres d’executar l’arxiu suma.m des de Matlab. La primera és escrivint el nom a la línia de comandes de Matlab. En aquest cas és important primer comprovar que el fitxer suma.m està efectivament en el directori de treball ja bé mirant l’entorn Current Directory o bé mitjançant la comanda dir per a llistar els fitxers de la carpeta de treball. » dir . .. suma.m » suma a = 1 b = 2

 La segona manera d'executar el fitxer és anant a l’entorn Current Directory, fer clic amb el botó dret del ratolí sobre el fitxer suma.m i després fer Run File.  

   Finalment una opció molt útil és seleccionar en l’editor de Matlab les línies que volem executar del programa i prémer F9. Una altra opció és un cop seleccionades les línies, fer clic amb el botó dret i marcar la opció Evaluate Selection. Hem vist com generar i executar un fitxer que contingui comandes de Matlab. Ara bé, Matlab treballa amb dos tipus diferents d'arxius .m: • Program scripts

Exemple 27: volum_cilindre.m programa que calcula el volum d'un cilindre les dimensions del qual s'introdueixen per teclat. En aquest arxiu cal d'observar la utilització de les funcions:

o input: per introduir des del teclat el valor d'una variable. o disp: per escriure a pantalla el valor d'una variable o d'una constant

alfanumèrica.

• Function scripts: es poden definir funcions utilitzant fitxers .m. El nom del fitxer ha de ser el mateix que el de la funció. Exemple 28: discriminant.m funció que calcula el discriminant d'una equació de segon grau donats els coeficients. En aquest arxiu cal observar que els paràmetres de la funció es passen entre parèntesis i separats per comes.

Page 14: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 14

Input/Output per pantalla i teclat En un arxiu .m es poden introduir valors pel teclat. Per això, si es vol escriure alguna cosa per pantalla, s'ha d'utilitzar la instrucció disp seguit de l'expressió entre parèntesis i comes. De la mateixa manera, si es volen llegir valors pel teclat, cal utilitzar la instrucció input. Exemple 29: En el programa volum_cilindre.m, s'utilitzen aquestes expressions. D'una banda es demana que s'entri el radi del cilindre del que es vol calcular el volum pel teclat i, de l'altra, es treu per pantalla el valor del volum calculat: r = input( 'Radi de la base del cilindre: ' ); disp( 'El volum del cilindre es:' ) Exercici: Genereu un script que demani per teclat els coeficients a, b i c d'una equació de segon grau i que, utilitzant la funció discriminant.m, mostri per pantalla el discriminant de l'equació. Calculeu utilitzant aquest script els discriminants de les següents equacions: x2+2x+1 , x2+x+1 , x2-1. Gràfics 2D i 3D L'entorn Matlab ofereix moltes facilitats per a representar dades gràficament. En el següent exemple es mostra la utilització d'alguns d'ells. Exemple 30: A continuació es veurà un exemple d'arxiu .m que realitza diferents tipus de gràfics: grafiques1.m. A l'executar-lo s'obtenen:

Fig 1: Representació gràfica de la funció 12)( +−= xxexf .

-1 -0.5 0 0.5 1 1.5 21.5

2

2.5

3

3.5

4

4.5Funcion f(x)=exp(x)-2*x+1

x

f(x)

Page 15: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 15

Observeu que les coordenades x i y dels punts a representar es passen a la funció plot mitjançant dos vectors. Concretament, per generar les abscisses, s'ha utilitzat la funció de Matlab linspace:

x = linspace( -1, 2, 25 );

Així, s'obtenen 25 punts equiespaiats a l'interval [-1,2].

Fig 2: Representació gràfica de les funcions )2sin()( xxf π= i )6sin()( xxf π= .

Per representar dues funcions en una mateixa finestra a Matlab es pot fer de dues maneres:

o plot( x1, y1, '-', x2, y2, '--' ) o plot( x, y1, '-') hold on plot(x2, y2, '--' ) hold off

Fig 3: Representació gràfica de tres funcions en una mateixa finestra.

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

x

y

y1 = sen(2 pi x)y2 = sen(6 pi x)

Page 16: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 16

Per generar els punts (x, y) de la segona gràfica d'aquesta finestra, s'utilitza la funció meshgrid. Aquesta és un recurs de Matlab que transforma un domini donat per dos vectors x i y, en dues matrius xx i yy que es podran utilitzar per avaluar funcions de dues variables. Concretament, la matriu xx conté a cadascuna de les seves files el vector x. De manera semblant, la matriu yy conté a cadascuna de les seves columnes el vector y. Per a més informació, consulteu el Matlab Help. Sentències de control de flux i Debugger L'objectiu principal d'aquest apartat és aprendre com escriure fitxers de Matlab per a implementar algoritmes numèrics. Com hem vist, quan executem els fitxers de Matlab més senzills, Matlab els executa seqüencialment. És a dir, Matlab va executant les línies del fitxer una per una començant per l'inici i anant-se desplaçant cap avall. Aquest tipus de programació és molt limitada, i per això els llenguatges de programació incorporen comandes que permeten seguir camins no seqüencials. En aquest apartat estudiarem tres d'aquestes comandes: if, for i while. Execució condicional IF o Estructura if condició 1 bloc d'instruccions 1 elseif condició 2 bloc d'instruccions 2 ! else bloc d'instruccions final end

Per escriure les condicions es poden utilitzar els següents operadors relacionals: > més gran que >= més gran o igual que < més petit que <= més petit o igual que == igual a ~= diferent de

que es poden combinar amb els diferents operadors lògics:

& i | o ~ negació

Exemple 31: equacio2.m, programa que troba les arrels d'una equació de segon grau. Observeu com s'utilitza la sentència IF per discutir si el discriminant és positiu, nul o negatiu. En aquest programa s'utilitza la funció discriminant.m vista en un apartat anterior. Exemple 32: volums.m, programa que calcula el volum d'un cilindre, un con o una esfera. En aquest programa s'il·lustra com:

Page 17: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 17

o Identificar, mitjançant una sentència IF, de quin tipus de sòlid s'ha de calcular el volum.

o Utilitzar funcions per calcular el volum de diferents sòlids. Debugger (depurador) El debugger és una eina que ens serveix per anar veient pas per pas com el Matlab executa un procediment. És molt útil a l’hora de localitzar errors, ja que podem anar seguint les operacions que fa Matlab pas a pas i detectar en quin pas el programa no fa el que caldria. Recordeu que podem anar executant les línies de codi que desitgem seleccionant-les i prement F9 o bé fent clic amb el botó dret i triant l'opció Evaluate Selection. Ara bé, Matlab té una eina específica per a executar pas a pas els programes. El procés d'executar el fitxer pas a pas per localitzar un error s'anomena debug (depuració). Per començar a "debugar" cal obrir la pestanya Debug de l'editor de Matlab i triar l'ordre Run o prement F5. Es poden afegir breakpoints en els punts on es vol que "debugger" s'aturi. Per finalitzar el procés s'ha d'anar a la pestanya exit debug mode de la pestanya corresponent al debug. A continuació veurem com funciona el debugger de Matlab amb un exemple. Per això cal que obrim amb l’Editor de Matlab els fitxers equacio2.m i discriminant.m que hem vist en l'apartat anterior, com es veu a la següent figura. De fet, seria suficient tenir obert només l'script equacio2.m.

Fixeu-vos que si en l’editor de Matlab tenim més d’un fitxer obert, ens apareix una pestanya a la part inferior que ens permet canviar d’un fitxer a l’altre i tancar, en el cas de que ho vulguem, algun fitxer.

Page 18: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 18

Observeu a més, que si feu algun canvi al fitxer equacio2.m, us apareixerà un asterisc al costat del nom del fitxer. Això vol dir que no hem guardat la última versió del programa. És important sempre, abans d’executar un programa guardar-los tots (és a dir, assegurar-nos que cap fitxer tingui un asterisc). Com ja hem dit abans, per començar a executar el Debugger cal obrir la pestanya Debug de l'editor de Matlab i triar l'ordre Run o bé prémer F5. Si fem això, Matlab ens executarà el programa de dalt a baix. Per a poder parar l’execució en un punt concret del programa, cal introduir un breakpoint (punt d’aturada). Per a fer-ho, observeu que en les línies que no són comentaris o estan en blanc, ens apareix un guió al costat del número de línia. Per afegir un breakpoint, es pot fer de dues maneres:

1. fent clic sobre el guió que hi ha al costat del número de línia

2. posant-nos sobre de la línia on volem aturar-nos i prémer la icona

Un cop hem posat un breakpoint, si tornem a activar l'opció Run del Debug o premem F5, el programa ja no s’executarà de dalt a baix, sinó que només executarà les línies abans del breakpoint. A més, ens apareixerà una fletxa verda que indicarà que estem a mitja execució.

Page 19: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 19

La fletxa verda ens indica que les línies anteriors ja han sigut executades. Per a seguir executant el programa tenim diverses opcions:

• si obrim la pestanya Debug de l'editor de Matlab i triem l'ordre Step o bé premem F10 passem al pas següent. D'aquesta manera podem anar executant tots els passos. Recordeu que en cada pas podem veure el resultat del que s’executa a la Command Window. Quan arribem a la última línia del codi, el debugador finalitza (fixeu-vos en la línia verda que està orientada cap abaix)

Per a sortir cal que tornem a fer un pas més (prement un altre cop F10).

• si enlloc de fer un pas (step), escollim l'opció Step In del Debuger o la tecla d'accés ràpid F11 equivalent, el que farà Matlab és executar la línia, però si en aquesta línia hi ha la crida a una funció, ens entrarà dins d'aquesta funció. És a dir, si portem el debugger a la línia 14 del fitxer equacio2.m i premem F11, en aquest cas l’editor de Matlab ens mostrarà el fitxer de la funció discriminant.m.

Page 20: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 20

Per a fer els passos un a un, anirem prement F10 per a anar executant pas per pas. Quan hem acabat d'executar totes les línies de la funció i volem sortir de la funció, cal seleccionar l'opció Step Out o prémer Shift+F11.

• Finalment, per tancar el debugador, cal obrir la pestanya Debug i triar l'ordre Exit Debug Mode.

També podem executar tot això amb les següents icones:

Set/clear breakpoint: Col·loca/esborra un breakpoint a la línia on està el cursor.

Clear all breakpoints: Esborra tots els breakpoints.

Step: Avança un pas. En cas que hi hagi una funció, no hi entra.

Step in: Avança un pas. Si ha una funció .m accessible, hi entra.

Step out: Surt d’una funció

Continue: Continua l’execució fins al següent breakpoint.

Exit Debug Mode: Acaba amb el debugger. Recordeu anar mirant el Workspace a mesura que aneu debugant els programes per veure quins valors van prenent les diferents variables a mesura que aneu executant les línies del codi. Per a més informació sobre les opcions de depuració, es pot consultar l'apartat 2.6 de la referència [1]. Bucle FOR o Estructura for variable = inici : pas : fi instruccions end O bé, for variable = [vector] instruccions end

Es van executant les instruccions de dins del bucle fins que el comptador arriba al final. Exemple 33: circumferencia.m, programa que calcula i dibuixa els punts de coordenades enteres que es troben a l'interior o sobre una circumferència. Observeu que en aquest exemple s'utilitza:

o la sentència FOR per "escombrar" les coordenades dels punts en cadascuna de les direccions x i y. Noteu que els bucles en aquest cas estan un dins de l'altre.

o la sentència IF per comprovar si el quadrat de la distància de cada punt al centre de la circumferència és menor que el radi de la mateixa al quadrat.

Page 21: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 21

Exercici: Genereu l'script circumferencia2.m a partir de circumferencia.m introduint les següents modificacions: • que els punts sobre la circumferència es dibuixin mitjançant cercles negres • que només es mostrin els punts de coordenades enteres sobre la circumferència

i dins el primer i el tercer quadrants • dibuixi els punts a una velocitat quatre vegades més ràpida que l'actual

Exemple 34: suma.m, programa que calcula la suma dels n primers naturals. Observeu que en aquest programa s'il·lustra:

o la utilització de la sentència FOR per sumar els n primers naturals. o com emmagatzemar unes variables en un vector i després accedir a les seves

components. Exercici: Genereu l'script sumaparells.m que enlloc de calcular la suma de tots els n primers nombres naturals calculi la suma dels n primers nombres naturals parells. El valor d'n s'ha de demanar per pantalla. Coneixeu alguna alternativa per a fer el mateix sense utilitzar un bucle for explícit? Exemple 35: rotacions.m. En aquest programa es dibuixa una hèlix mitjançant una sentència de Plot3D. Per a això es calculen les coordenades de diversos punts sobre les corbes utilitzant un bucle FOR i les seves coordenades x, y, z s'emmagatzemen en una matriu de tantes files com punts i de tres columnes. Bucle FOR implícit El fet que Matlab estigui especialment dissenyat per a treballar de forma molt senzilla amb vectors i matrius permet programar utilitzant bucles for's implícits. A continuació mostrem algun dels exemples d'aquests bucles for implícits que hem treballat en els apartats anteriors: PROBLEMA Programació estàndard Bucle FOR implícit Generar el vector v=[1,3,...,99]

v = []; for i = 1 : 50 v(i) = 2*i-1; end

v = [1:2:99];

Calcular

s = 0; for i = 1 : 100 s = s + i; end

i = [1:100]; s = sum(i); % o bé s = i*ones(100,1);

Calcular

s = 0; for i = 10 : 200 s = s + i^2; end

i = [10:200]; s = sum(i.^2);

Calcular el producte escalar de u = [1,2,3,4,5] i v = [2,4,6,8,10]

u = []; v = []; for i = 1 : 5 u(i) = i;

u = [1:5]; v = [2:2:10]; s = u*v’; % o bé

Page 22: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 22

v(i) = 2*i; end s = 0; for i = 1 : 5 s = s + u(i)*v(i); end

s = sum(u.*v);

Avaluar la funció f(x)=sin(x)2/x en els punts x = [-1:0.1:1]

x = [-1:0.1:1]; y = []; for i = 1 : length(x) y(i)=sin(x(i))^2/x(i); end

x = [-1:0.1:1]; y = sin(x).^2./x;

Exemple 36: horner.m, programa que avalua un polinomi mitjançant la regla de Horner. Observeu que en aquest programa s'il·lustra:

o com avaluar un polinomi de forma eficient, reduint el cost computacional. o mostra resultats per pantalla amb un format avançat mitjançant la comanda sprintf.

La regla de Horner permet avaluar un polinomi en un punt amb menys esforç computacional que l’avaluació directa d’aquest. Considerem per exemple el polinomi 2x4+20x3+70x2+100x+48. Observeu que aquest polinomi pot ser reescrit com:

 Per avaluar l’expressió original del polinomi, necessitem 4 sumes i 10 productes. En canvi, per avaluar l'última expressió necessitem 4 sumes i només 4 productes. Exercici: Modifiqueu el fitxer horner.m i si és necessari el fitxer eval_horner.m per a convertir el for explícit en un for implícit. Anomeneu els nous fitxers hornerImp.m i eval_hornerImp.m. Ajut: si genereu dos vectors fila x i y amb els valors on cal avaluar el polinomi i les seves imatges, la comanda sprintf us permetrà mostrar els valors utilitzant la següent instrucció: disp( sprintf( '%15.7f %15.7f \n', [x; y]' ) ) Bucle WHILE o Estructura while condició

instruccions end

S'executen les instruccions de l'interior del bucle mentre la condició sigui certa. Exemple 37: euclides.m, calcula el mcd de dos nombres enters naturals utilitzant l'algoritme d'Euclides. Aquest algoritme es basa en el següent: si tenim dos nombres enters a i b

Page 23: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 23

• si a > b, llavors el màxim comú divisor de a i b, mcm(a,b), és el mateix que el màxim comú divisor de b i r, mcm(b,r), on r és el residu de dividir a entre b

• el màxim comú divisor de qualsevol nombre a i 0, és a. Per exemple: Pas Operació 1 2366 dividit entre 273 és 8, amb residu 182 mcd(2366,273)=mcd(273,182) 2 273 dividit entre 182 és 1, amb residu 91 mcd(273,182) = mcd(182,91) 3 182 dividit entre 91 és 2, amb residu 0 mcd(182,91) = mcd(91,0)

Per tant, l'algoritme d'Euclides consisteix en, donats dos enters a i b, calcular el residu r de la divisió d' a entre b i, tot seguit, canviar el nom les variables de manera que a prengui l'antic valor de b i b el valor de r. Es repeteix aquest procés amb els nous valors fins que b sigui nul. El mcd entre aquests arxius dos valors correspon a l'últim valor d'a. Exercici: Utilitzeu el debugger de Matlab per a reproduir l'exemple anterior. Observeu què passa en el workspace quan entreu dins la funció mcm.m. Inputs i outputs per pantalla En els apartats anteriors ja s'ha vist com realitzar entrades i sortides de dades de forma interactiva mitjançant les sentències input i disp, respectivament. Aquestes dues comandes ens permeten recollir i mostrar dades per pantalla. Recordeu que la comanda disp mostra les variables/strings en el format que s'està treballant amb Matlab. Ara bé, la comanda disp es pot combinar amb la comanda sprintf per a obtenir formats de sortida més sofisticats. A continuació es mostra l'ajuda de la comanda sprintf ressaltant les característiques més importants d'aquesta comanda. SPRINTF Write formatted data to string. [S,ERRMSG] = SPRINTF(FORMAT,A,...) formats the data in the real part of array A (and in any additional array arguments), under control of the specified FORMAT string, and returns it in the MATLAB string variable S. ERRMSG is an optional output argument that returns an error message string if an error occurred or an empty string if an error did not occur. SPRINTF is the same as FPRINTF except that it returns the data in a MATLAB string variable rather than writing it to a file. FORMAT is a string containing C language conversion specifications. Conversion specifications involve the character %, optional flags, optional width and precision fields, optional subtype specifier, and conversion characters d, i, o, u, x, X, f, e, E, g, G, c, and s. See the Language Reference Guide or a C manual for complete details. The special formats \n,\r,\t,\b,\f can be used to produce linefeed, carriage return, tab, backspace, and formfeed characters respectively. Use \\ to produce a backslash character and %% to produce the percent character. SPRINTF behaves like ANSI C with certain exceptions and extensions. These include: 1. ANSI C requires an integer cast of a double argument to correctly use an integer conversion specifier like d. A similar conversion

Page 24: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 24

is required when using such a specifier with non-integral MATLAB values. Use FIX, FLOOR, CEIL or ROUND on a double argument to explicitly convert non-integral MATLAB values to integral values if you plan to use an integer conversion specifier like d. Otherwise, any non-integral MATLAB values will be outputted using the format where the integer conversion specifier letter has been replaced by e. 2. The following non-standard subtype specifiers are supported for conversion characters o, u, x, and X. t - The underlying C datatype is a float rather than an unsigned integer. b - The underlying C datatype is a double rather than an unsigned integer. For example, to print out in hex a double value use a format like '%bx'. 3. SPRINTF is "vectorized" for the case when A is nonscalar. The format string is recycled through the elements of A (columnwise) until all the elements are used up. It is then recycled in a similar manner through any additional array arguments. See the reference page in the online help for other exceptions, extensions, or platform-specific behavior.

És a dir, la comanda sprintf de Matlab i de C es comporten de forma similar, i la sintaxi d'escriptura és similar (llevat de que en Matlab s'utilitzen ' enlloc de " per introduir el que es vol mostrar). Ara bé, és important tenir en compte que Matlab té implementada una extensió d'aquesta comanda que permet mostrar dades guardades en vectors/matrius, cosa que permet evitar utilitzar alguns bucles per a mostrar dades com es veu en el següent exemple: » A = [30 40 50 60 70]; » fprintf('%g miles/hour = %g kilometers/hour\n',[A;8*A/5]) 30 miles/hour = 48 kilometers/hour 40 miles/hour = 64 kilometers/hour 50 miles/hour = 80 kilometers/hour 60 miles/hour = 96 kilometers/hour 70 miles/hour = 112 kilometers/hour En aquest cas s'ha utilitzat la instrucció %g per a mostrar els resultats. Consultant l'ajuda veureu que la instrucció %g mostra els resultats utilitzant la versió més compacta entre %e (notació exponencial) o %f (notació amb coma fixa). Observeu també que enlloc d'utilitzar la comanda disp combinada amb la comanda sprintf s'ha utilitzat directament la comanda fprintf. És a dir, la comanda anterior és equivalent a disp(sprintf('%g miles/hour = %g kilometers/hour\n',[A;8*A/5])) La funció sprintf i la funció fprintf en aquest cas són anàlogues, llevat de que la funció sprintf retorna el resultat en una cadena de caràcters que després mostrem mitjançant la comanda disp. Això és útil, per exemple, per introduir títols, llegendes o altre tipus d'etiquetes en un gràfic. Per a més informació podeu consultar l'ajuda de Matlab o l'enllaç següent: http://www.mathworks.com/help/techdoc/ref/sprintf.html

Page 25: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 25

Inputs i outputs mitjançant fitxers A continuació es veurà com escriure i llegir dades d'un fitxer. Hi ha diverses funcions de Matlab que permeten llegir i escriure en fitxers de text. Per a veure un llistat de totes aquestes funcions només cal escriure help iofun a la línia de comandes. Per escriure dades en un fitxer extern s'han de realitzar les següents operacions:

o obrir l'arxiu mitjançant la sentència fopen o accedir i escriure a l'arxiu mitjançant sentències del tipus fprintf o tancar l'arxiu mitjançant la sentència fclose

A continuació es mostra mitjançant un exemple, corresponent a l'arxiu volum_esfera.m, com escriure dades en un fitxer de text.

Exemple 38: El programa volum_esfera.m:

1 % Entrada de dades 2 r = input( '\nRadi de l`esfera: ' ); 3 % Obertura del fitxer de resultats 4 fh = fopen( 'prog2.txt', 'wt' ); 5 % Escriptura de dades 6 fprintf( fh, 'Radi de l`esfera: %f', r ); 7 % Calcul 8 vol = 4/3 * pi * r^3; 9 % Escriptura de resultats 10 fprintf( fh, '\n\nEl volum de l`esfera es %f', vol ); 11 % Tancament del fitxer de resultats 12 fclose( fh ); A la línia 4 s'obre l'arxiu prog2.txt mitjançant la sentència fopen assignant-li l'identificador fh. Observeu que el primer argument de la sentència fopen és el nom del fitxer que cal obrir i que el segon argument són els permisos de l'usuari sobre el fitxer, que pot prendre diversos valors incloent 'r' per a llegir i 'w' per a escriure. En aquest cas, a més de dir que l'usuari tindrà permisos d'escriptura, la t del segon argument 'rt' indica que estem obrint el fitxer en mode text. L'identificador del fitxer, fh, s'utilitza per a especificar posteriorment en les sentències de lectura i escriptura per especificar el fitxer on cal escriure o llegir. A les línies 6 i 10 s'escriuen diferents variables en el fitxer mitjançant la sentència fprintf. Observeu que s'accedeix a l'arxiu mitjançant l'identificador fh. Finalment, es tanca l'arxiu (i s'elimina l'assignació i la variable fh) mitjançant la sentència fclose a la línia 12. Exercici: Genereu un script que generi una matriu de dimensions nxm de forma aleatòria mitjançant la instrucció rand i mostri el resultat en el fitxer matriu.txt utilitzant 5 decimals per a mostrar els nombres. Les dimensions s'han de demanar per teclat i l'script s'ha d'anomenar escriure_Matriu.m. Observació: L'escriptura de la matriu es pot fer utilitzant dos bucles for imbricats (en castellà "bucles anidados" o en anglès "nested loops") o aprofitar que la sentència fprintf permet treballar amb vectors i reduir el nombre de bucles for. Per llegir dades en un fitxer extern s'han de realitzar les següents operacions:

Page 26: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 26

o obrir l'arxiu mitjançant la sentència fopen o accedir i llegir a l'arxiu mitjançant sentències del tipus fscanf o tancar l'arxiu mitjançant la sentència fclose

A continuació es mostra mitjançant un exemple, corresponent a l'arxiu llegir_matriu.m, com llegir dades escrites en el fitxer matriu.txt des de Matlab. 1 % Obertura del fitxer de resultats 2 fh = fopen( 'matriu.txt', 'rt' ); 3 % Lectura de la primera linia que conte les dimensions 4 dim = fscanf( fh, 'Dimensions de la matriu: %d x %d'); 5 n = dim(1); 6 m = dim(2); 7 % Lectura de tota la matriu especificant les dimensions 8 A = fscanf( fh, '%f', [m,n]); 9 % La funcio fscanf retorna la matriu transposada 10 A = A'; 11 % Tancament del fitxer de resultats 12 fclose( fh ); 13 % Mostrem els resultats per pantalla 14 fprintf('La matriu te dimensions %d x %d i es\n\n', n, m); 15 disp(A) Les funcions de lectura de fitxers de Matlab són molt similars a les de C, però tenen implementades algunes millores que permeten treballar més còmodament amb vectors i matrius. A la línia 2 s'obre l'arxiu matriu.txt mitjançant la sentència fopen assignant-li l'identificador fh, però en aquest cas s'especifica mitjançant el segon argument 'rt' que s'està obrint el fitxer en mode lectura. A la línia 4 la instrucció que li donem a Matlab és "llegeix la cadena de caràcters 'Dimensions de la matriu: ', llegeix un nombre enter (%d), salta't la cadena de caràcters ' x ' i llegeix un altre enter". El resultat és un vector amb els dos enters que necessitem. Posteriorment, a la línia 8 llegim m*n nombres decimals. Observeu que Matlab llegeix els valors per files però col·loca els resultats en columnes, i per tant, la matriu que obtenim cal transposar-la. Alternativament es pot obligar a Matlab a obtenir el resultat desitjat directament amb la instrucció A = fscanf( fh, '%f', [m,inf])'; Aquesta opció permet llegir dades només amb la informació del nombre de columnes que cal llegir, ja que no cal especificar en quantes línies estan llistades les dades. Ara bé, igual que en el cas anterior, cal transposar el resultat per obtenir la matriu desitjada. Per a més informació, consulteu el Help de Matlab o bé el capítol 6.6 de llibre "Aprenda Matlab 7.0 como si estuviera en primero". Arxius .mat; Emmagatzematge de dades Al tancar el programa de Matlab s'esborren totes les variables emmagatzemades. No obstant això, de vegades és important guardar aquesta informació per recuperar-la més tard.

Page 27: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 27

Per poder gravar totes les variables que s'han utilitzat en cert moment, s'executa: » save Saving to: matlab.mat En aquest cas, es crea un arxiu anomenat matlab.mat que es guarda en el directori en el qual s'està treballant i conté totes les variables que s'estaven utilitzant en aquell moment (les que estaven en el Workspace). Per poder recuperar-lo, cal executar l'ordre » load Loading from: matlab.mat De la mateixa manera, es poden guardar només les variables que interessen en un arxiu. Exemple 39: » A = rand (20,50); » save matriu A Es guarda la matriu A en un fitxer matriu.mat. Per recuperar-la s'utilitza la següent sentència: » load matriu

Exercici: Llegiu la matriu del fitxer matriu.txt i guardeu-la en el fitxer matriu.mat. Esborreu totes les variables del Workspace escrivint la instrucció clear all a la línia de comandes o, alternativament, anant al Workspace i esborrant totes les variables. Recupereu la matriu carregant el fitxer MAT i calculeu la seva transposada per comprovar que heu recuperat correctament les dades. Aritmètica IEEE - Errors d'arrodoniment i propagació d'errors Quan treballem amb ordinadors o calculadores sempre hem de tenir present que es produeixen errors de diversos tipus, i per tant, és clau conèixer aquests errors per a poder-los predir. Entre els diversos errors que ens apareixen, n’hi ha dos inherents al càlcul per ordinador: els errors d’arrodoniment i els errors produïts a l’operar amb nombres que tenen errors, que forma part de la propagació d’errors. Per defecte Matlab realitza tots els càlculs aritmètics utilitzant aritmètica de coma flotant en doble precisió d'acord amb l'IEEE estàndard descrit en la referència: IEEE Standard 754-1985. IEEE Standard for Binary Floating-Point Arithmetic. IEEE, New York, 1985. És a dir, Matlab utilitza emmagatzema les dades en format double i per tant cada nombre ocupa 64 bits de memòria. Com que els ordinadors emmagatzemen els nombres amb un nombre finit de xifres, és impossible emmagatzemar números com π, 1/3, etc. Cal tenir present, a més, que els ordinadors emmagatzemen els nombres en forma binària, i que per tant, nombres com l’1/10 que en base decimal es poden representar de forma exacta, tampoc es pot emmagatzemar exactament en binari ja que si expressem 1/10 en binari obtenim un nombre periòdic.

Page 28: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 28

A més, el fet de només poder emmagatzemar un nombre finit de xifres també limita el nombre real màxim i mínim que es pot emmagatzemar. Les característiques a tenir en compte quan es treballa amb Matlab estan resumides a continuació:

o el nombre màxim que es pot emmagatzemar en Matlab és aproximadament 10+308. El valor exacte es pot obtenir mitjançant la instrucció realmax.

o el nombre mínim que es pot emmagatzemar en Matlab és aproximadament 10-308. El valor exacte es pot obtenir mitjançant la instrucció realmin.

o l'error relatiu màxim que es comet a l'emmagatzemar un nombre és 2-53 " 1.11 x 10-16. Aquest valor també s'anomena unitat d'arrodoniment o unit roundoff.

Quan el resultat d'un càlcul és més gran que el valor retornat per la funció realmax es produeix un fenomen d'overflow (desbordament) i el resultat és Inf (també escrit com a inf). Per altra banda, quan el resultat d'un càlcul és menor que realmin Matlab ens pot retornar un valor erroni: en alguns casos retorna zero o bé un nombre menor a realmin que no és correcte. Aquests fenòmens els podeu observar en el següent exemple:

>> realmax ans = 1.797693134862316e+308 >> 1.1*realmax ans = Inf >> -2*realmax ans = -Inf >> realmin ans = 2.225073858507201e-308 >> realmin*1e-16 ans = 0 >> realmin*1e-15 ans = 2.470328229206233e-323

La importància de la unitat d'arrodoniment 2-53 és que és una cota de l'error relatiu que es comet al emmagatzemar un nombre real utilitzant el format double. És a dir, donat un nombre real x, si anomenem xa el valor que emmagatzemem a Matlab, sabem que

Page 29: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 29

Expressat en termes senzills, Matlab emmagatzema els nombres decimals i realitza les operacions aritmètiques amb una precisió d'unes 16 xifres decimals significatives. D'aquesta manera quan calculem l'arrel de 2 elevada al quadrat menys 2 no obtenim zero sinó un nombre de l'ordre de 10-16:

>> (sqrt(2))^2-2 ans = 4.440892098500626e-16

La quantitat 10-16 també s’anomena zero de màquina. Finalment és important tenir present que els errors d'arrodoniment es propaguen quan manipulem aquests nombres que ja tenen un error, fenomen conegut com a propagació d'errors. L’error relatiu màxim que cometem a l’emmagatzemar un nombre amb Matlab és de l'ordre de 10-16, però aquest error es pot propagar i augmentar a l'operar amb els nombres. També cal tenir en compte que quan es treballa amb aritmètica finita, la magnitud de la propagació d'errors pot dependre de l'ordre de les operacions, com es veu en el següent exemple:

>> (1 + 1e-16) - 1 ans = 0 >> (1 + 2e-16) -1 ans = 2.2204e-16 >> (1 - 1e-16) - 1 ans = -1.1102e-16 >> 1 + (1e-16 -1 ) ans = 1.1102e-16

Bibliografia [1] “Aprenda Matlab 7.0 como si estuviera en primero” J. García Jalón, J.I. Rodríguez

i A. Brazález (http://mat21.etsii.upm.es/tayuda/index.htm) [2] “Introducción al Matlab”. Laboratori de Càlcul Numèric. UPC. [3] “Matlab Primer”. Kermit Sigmon. University of Florida.

http://math.ucsd.edu/~driver/21d-s99/matlab-primer.html [4] Ajuda on-line del programa Matlab a www.mathworks.com

Page 30: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 30

Exercicis de coneixements bàsics - Bare Essentials • Comprovar utilitzant Matlab que els vectors a = (1, 3, 2) i b = (2, 0, -1) són

ortogonals.

• Realitzeu l'exercici anterior mitjançant la comanda dot. Consulteu el Help de Matlab aquesta instrucció per saber-la utilitzar.

• Representar la funció

en l'interval [0,1].

• Definir les següents matrius

utilitzant només una línia de codi. Utilitzant la matriu A i una assignació, modifiqueu la matriu B perquè sigui

• Executar i entendre el funcionament dels programes analitzats: volum_cilindre.m, discriminant.m i grafiques1.m

• Representar en una mateixa gràfica les funcions f(x)=sin(4πx) i f(x)=cos(4πx) en l'interval [0,1].

• Fer un programa que dibuixi la corba y=sin(x) en l'interval [0,4π] i que escrigui els punts que s'han utilitzat per a realitzar la representació gràfica en un arxiu.

Exercicis d'ampliació dels coneixements bàsics - An Expanded Core of Knowledge • Donat un vector fila x de longitud 100 es vol calcular la suma de totes les seves

components. Es vol realitzar aquesta suma en Matlab sense utilitzar cap bucle for i utilitzant només una línia de Matlab. Buscar a l'ajuda de la comanda ones com generar un vector columna ple d'uns i utilitzar aquest vector i el producte escalar entre vectors per a realitzar aquesta suma. Aplicar el procediment obtingut al vector x = (1, 2, 3, ... , 99, 100) i comprovar que el resultat obtingut és correcte.

• Consultar al Help la instrucció plot. Concretament consultar com es modifica el color o la trama d'una corba (opció 'LineSpec'). En particular, representar la funció

Page 31: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 31

en l'interval [0,1] com es veu en la següent figura.

• Llegir de l'apartat 2.2 fins al 2.6 (ambdós inclosos) de la referència [1].

• Escriure una function, on la seva primera línia sigui function Aparells = parells(A) i que, donada una matriu A, proporcioni una matriu amb les components d'A que estiguin a les files i columnes parells. Escriure un script que cridi aquesta function i extregui la matriu amb les files i columnes parells de la matriu

Ajut: Consulteu l'ajuda de la comanda size per obtenir les dimensions d'una matriu.

• Escriure una function de Matlab, on la seva primera línia sigui function [A,P] = poligonregular(r,n), que calculi l'àrea A i el perímetre P d'un polígon regular d'n costats inscrits en una circumferència de radi r. Des d'un script que cridi a aquesta function, calcular l'àrea i el perímetre de l'hexàgon regular inscrit en una circumferència de radi 2.

• Llegir els apartats 3.1 al 3.5 (ambdós inclosos), del 4.1 al 4.7 (ambdós inclosos) i

el 6.3 de la referència [1].

• Genereu l'script ellipse.m a partir de l'script circumferencia.m de manera que es dibuixin els punts de coordenades enteres que estan sobre i dins d'una el·lipse d'equació

𝑥!

𝑎! +𝑦!

𝑏! = 1

Page 32: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 32

on els valors dels semieixos, a i b, es demanin per pantalla, tenint en compte que l'el·lipse es pot parametritzar segons

𝑥 = 𝑎 cos 𝜃 , 𝑦 = 𝑏  sin  (𝜃) • Convertiu el for explícit de l'script rotacions.m en un for implícit. Anomeneu rotacions2.m l'script resultant.

• Determineu el cost computacional d'avaluar un polinomi de grau n mitjançant una

avaluació directa i compareu-lo amb el cost computacional d'avaluar-lo mitjançant la regla de Horner. És a dir, compareu el cost dels següents càlculs

• Llegir l'apartat 6.1 de la referència [1] .

• Llegir els apartars 6.6, 8.1 i 8.2 de la referència [1].

Exercicis d'aprofundiment - Developing Mastery • Mitjançant la definició d'un vector, adequadament escollit, i consultant l'ajuda de la

comanda sum, realitzar el següent càlcul en una sola línia de codi

• Consultant l'ajuda de la comanda polar, realitzar les següents figures

tenint en compte que l'expressió de la corba de la dreta en polars és

• Consultant l'ajuda de la comanda diary, aprendre a guardar totes les comandes utilitzades en una sessió de Matlab.

Page 33: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 33

• Escriure una function, on la seva primera línia sigui function B = permutafiles(A,i,j) i que, donada una matriu A, i dos índexs de fila i i j, i<j, proporcioni una matriu amb les corresponents files d'A permutades. Escriure un script que, utilitzant aquesta function, permuti les files 1 i 4 i les 2 i 3 de la matriu

Ajut: Observeu que permutar les files i i j és equivalent a generar la matriu formada per les files [1, 2, ..., i-1, j, i+1, ..., j-1, i ,j+1,...n] on n és el nombre de files de la matriu A. Consulteu l'ajuda de la comanda size per aprendre a obtenir el nombre de files d'una matriu A. Alternativament, es pot obtenir la matriu B de la següent manera: primer guardem la fila i de la matriu A en un vector auxiliar, després posem la fila j a la posició de la fila i i finalment emmagatzemem el vector auxiliar a la fila i de la matriu.

• Escriure una function que prengui un vector columna v de n components i

retorni la matriu

on In  és la matriu identitat de dimensió n, e=v/#v# , i #v# és el mòdul del vector v. Escriure un script que, utilitzant aquesta function, comprovi que Mv=0. Obteniu el resultat esperat? Ajut: per a calcular la longitud del vector v podeu utilitzar la comanda length i per calcular el mòdul del vector v podeu ajudar-vos de la comanda sum per a sumar els quadrats de les components del vector.

• Des d'un script que cridi la funció poligonregular.m implementada

anteriorment, representar gràficament com varien A/r2 i P/2r a mesura que augmenta n. Comentar els resultats obtinguts. Ajut: És possible que hagueu de modificar lleugerament la funció poligonregular.m per a poder admetre com a argument d'entrada un vector que contingui diversos valors d'n.

• Implementeu l'algoritme d'Euclides de forma recursiva, és a dir, modifiqueu la funció mcm.m de manera que estigui implementada de forma recursiva. Anomeneu aquesta nova funció mcmrec.m.

• La comanda ginput recull informació de l'usuari via clics del ratolí. Per exemple, la sentència [x,y]=ginput(n) retorna en els vectors x i y les coordenades dels següents n clics del ratolí des de la figura actual. Un dels usos de la sentència ginput és determinar aproximadament les coordenades de punts en una figura. Representeu en una mateixa gràfica les funcions

Page 34: PROGRAMACIÓ EN MATLAB · Matlab 7 ans = 3 6 15 -6 18 5 10 25 -10 30 1 2 5 -2 6 -2 -4 -10 4 -12 0 0 0 0 0 A més de les operacions algebraiques, Matlab proporciona algunes operacions

Introducció a la programació Matlab 34

en l'interval [-1.5,1.5] i mitjançant la comanda ginput aproximeu els punts de tall de les dues funcions. Mostreu els resultats per pantalla amb 15 decimals.

• El fitxer imatge.txt conté dues matrius: la matriu X té dimensió 480x500 i els

seus coeficients són nombres naturals mentre que la matriu map té dimensió 220x3 i els seus coeficients són nombres reals. La primera línia del fitxer conté les dimensions de les matrius. En les línies següents, hi ha la matriu X i just després de la matriu X hi ha la matriu map. És a dir, la matriu X està en les files de la 2 a la 481 i la matriu map en les files de la 482 a la 722. En aquest exercici cal que llegiu les matrius X i map des del fitxer imatge.txt. Un cop tingueu aquestes matrius a Matlab, executeu les següents comandes image(X) colormap(map) axis off Quina figura obteniu?