




























































































Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Eines informatiques, Profesor: Paco Aràndiga, Carrera: Matemàtiques, Universidad: UV
Tipo: Ejercicios
1 / 148
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!





























































































MATLAB és un sistema interactiu basat en matrius per a càlculs científics i d’inge- nieria. Es poden resoldre problemes numèrics relativament complexos sense escriure un programa en realitat. El nom MATLAB és una abreviatura per a MATrix LABora- tory. El propòsit d’aquestes notes és ajudar en la iniciació a MATLAB. La millor forma d’utilitzarles és posar mans a l’obra. S’aconsella, en general, treballar amb l’ordinador a la vegada que es llegeixen les notes, així com experimentar lliurement amb exemples. Es pot utilitzar l’ajuda de la instrucció help per a una informació més detalla- da. Després d’entrar en MATLAB, la instrucció help mostrarà una llista de fun- cions per a les que es pot obtindre ajuda mentre s’està treballant; la instrucció help nom_de_funció ens donarà informació sobre una funció específica. Així, la instrucció help eig, ens donarà informació sobre la funció eig, que calcula els autovalors d’una matriu. Es poden veure algunes de les capacitats de MATLAB utilitzant la in- strucció demo. L’alcanç i la potència de MATLAB van més enllà del que podem veure en aquestes notes. En algun moment podeu desitjar una informació més detallada. Serà, doncs, el moment de consultar algun manual més avançat.
MATLAB treballa essencialment amb un sol tipus d’objectes: una matriu numèrica rectangular amb entrades possiblement complexes; totes les variables representen ma- trius. De vegades, les matrius 1 × 1 es consideren escalars, i les matrius amb una sola fila o columna es consideren com a vectors. Hi ha diverses formes diferents per a introduir una matriu en MATLAB. A saber:
4
Disposem en MATLAB de les següents operacions amb matrius:
Aquestes operacions per a matrius s’apliquen també a escalars (matrius 1×1). Si els tamany de les matrius són incompatibles per a l’operació matricial s’obté un missatge d’error, exceptuant el cas en que un dels operands siga un escalar i l’altre una matriu (per a l’adició, la substracció, la divisió i la multiplicació). En esta situació s’opera l’escalar amb cada terme de la matriu. La divisió matricial mereix un comentari especial. Si A és una matriu invertible i b és una columna, resp. fila, compatible, aleshores
x=A\b
és la solució de A ∗ x = b i, resp.,
x=A/b
és la solució de x ∗ A = b. En la divisió esquerra, si A és quadrada, es factoritza utilitzant eliminació gaus- siana. Amb els factors es resol A ∗ x = b. Si la matriu A no és quadrada, es fac- toritza utilitzant la ortogonalizació de Householder amb pivoteig de columnes. Amb els factors es resol el sistema indeterminat o sobredeterminat en el sentit dels mínims quadrats. La divisió dreta es defineix a partir de l’esquerra per b/A = (A′\b′)′. Operacions a coordenades. Les operacions d’adició i substracció operen intrínse- cament a coordenades però les altres operacions matricials donades abans no: Són op- eracions matricials. És important observar que per a aquestes altres operacions, ∗, ˆ, , i /, pot fer-se que operen a coordenades precedint-les d’un punt. Per exemple, tant
[1,2,3,4].*[1,2,3,4]
com
[1,2,3,4].^
donaran
[1,4,9,16]
Intenteu-ho. Açò és particularment útil quan s’utilitzen els gràfics de MATLAB.
MATLAB és un llenguatge de expressions ; les expressions que s’escriuen són inter- pretades i avaluades. Les instruccions de MATLAB són, normalment, de la forma variable = expressió , o simplement expressió Les expressions es componen, usualment, a partir d’operadors, funcions i nombres de variables. L’avaluació d’una expressió produeix una matriu, que es mostra en pan- talla, i s’assigna a la variable per al seu us posteriorment. Si omitim la variable i el signe =, es crea una variable anomenada ans (per answer) a la que s’assigna el resultat de l’expressió. Una instrucció acaba, normalment, amb el retorn de carro (comandament return). Si es desitja continuar una expressió en la línia següent, és suficient escriure tres (o més) punts abans del retorn de carro. Si pel contrari, desitgem escriure diverses in- struccions en una mateixa línia, podem fer-ho separant-les per comes o punts i comes. Si l’últim caracter d’una instrucció és un punt i coma, el resultat no es mostrarà per pantalla, encara que per descomptat es realitzarà l’assignació. Açò és essencial per a evitar pèrdues de temps al mostrar els resultats intermedis. MATLAB distingeix les lletres majúscules de les minúscules en els nombres d’in- struccions, funcions i variables. Així, resolvent no és el mateix que ReSoLvEnT. La instrucció who mostra les variables que es troben en l’espai de treball. Per exemple, amb el comandament who llista les variables que tenim són
who
Your variables are:
A ans
Per a veure el tamany de les variables hem d’escriure whos i apareixerà
Name Size Bytes Class
A 2x2 32 double ans 1x1 8 double
que crea un fitxer anomenat enter.dat que conté
3.4119357e-01 7.2711322e-01 8.3849604e- 5.3407902e-01 3.0929016e-01 5.6807246e-
Encara que tots els càlculs en MATLAB s’efectúen en doble precisió, el format d’eix- ida per pantalla pot ser controlat amb les següents instruccions.
format short coma fixa amb 4 decimals (per defecte) format long coma fixa amb 14 decimals format short e notació científica amb 4 decimals format long e notació científica amb 15 decimals
Una vegada s’ordena un format, es manté fins que s’ordena un canvi. L’ordre format compact evitarà la major part de les línies en blanc, amb el que es pot mostrar més informació en pantalla. És independent de les demés instruccions de format.
Exercici 1.1.1. Calcular A=rand(4,2) i veure com queda en cadascun dels formats anteriors.
Funcions per a la construcció de matrius
Les següents funcions estan disponibles en MATLAB:
eye matriu identitat zeros matriu de zeros ones matriu d’uns diag veure més endavant triu part triangular superior d’una matriu tril part triangular inferior d’una matriu rand matriu generada aleatòriament hilb matriu de Hilbert magic matriu màgica toeplitz veure help toeplitz
Per exemple, zeros(m,n) produeix una matriu nul·la m × n, i zeros(n) pro- dueix una altra quadrada d’ordre n; si A és una matriu, aleshores zeros(size(A)) produeix una matriu de zeros del mateix ordre que A.
Si x és un vector, diag(x) és la matriu diagonal amb x en la seua diagonal; si A és una matriu quadrada, diag(A) és un vector format per la diagonal de A. Què serà llavors diag(diag(A))? Intenteu-ho.
Les matrius es poden construir per blocs. Per exemple, si A és 3 × 3 , llavors
B = [A, zeros(3,2); zeros(2,3), eye(2)]
donarà una certa matriu 5 × 5. Intenteu-ho.
Funcions escalars
Algunes funcions de MATLAB operen essencialment sobre escalars, tot i que ho fan també sobre matrius (element a element). Les funcions més comuns entre aquestes són:
sin asin exp abs round cos acos log (natural) sqrt f loor tan atan rem (residu) sign ceil
Funcions vectorials
Altres funcions de MATLAB operen fonamentalment sobre vectors (fila o columna), encara que també poden operar sobre matrius m × n (m ≥ 2 ) fent-ho en aquest cas columna a columna, produint, per tant, un vector fila que conté el resultat de la seua aplicació a cada columna. Per a conseguir que actuen per files serà suficient usar la transposada; per exemple, mean(A’)’. Vegem algunes d’aquestes funcions:
max sum median any min prod mean all sort std
Per exemple, l’entrada màxima d’una matriu A s’obté amb max(max(A)) en comptes de amb max(A). Intenteu-ho.
donaran com a resultat un cert vector mentre que
x = []; for i = n:-1:1, x=[x,i^2], end
donarà el mateix vector en ordre invers. Proveu-ho. Les instruccions
for i = 1:m for j = 1:n H(i, j) = 1/(i+j-1); end end H
produiran i imprimiran en pantalla la matriu de Hilbert m × n. El punt i coma de la instrucció interior suprimeix la impressió no desitjada dels resultats intermedis mentre que l’últim H mostra el resultat final. while. La forma general d’un bucle while és while relació instruccions end
Les instruccions es repetiran mentre la relació siga certa. Per exemple, donat un nombre a, les instruccions següents calculen i mostren el menor sencer no negatiu n tal que 2 n^ ≥ a:
n = 0; while 2^n < a n = n + 1; end n
if. La forma general d’un bucle if simple és if relació instruccions end Les instruccions s’executaran sols si la relació és certa. També són possibles les rami- ficacions múltiples, com s’il·lustra en l’exemple següent
if n < 0 paritat = 0; elseif rem(n,2) == 0
paritat = 2; else paritat = 1; end
Si sols tenim dues ramificacions podem ometre, per descomptat, la porció corresponent a elseif. Relacions. Els operadors relacionals en MATLAB són
< menor que
major que <= menor o igual que = major o igual que == igual ∼= no igual.
Fem notar que s’usa “=” en les assignacions mentre que per a les relacions s’usa “==”. Les relacions poden connectar-se o quantificar-se pels operadors lògics
& y | o ∼ no.
Quan s’apliquen a escalars, una relació és realment l’escalar 1 o 0 depenent de si la relació és vertadera o falsa:
Exercici 1.1.2. Veure els resultats obtinguts amb
3 < 5, 3 > 5, 3 == 5, 3 == 3
Quan s’aplica a matrius del mateix ordre, una relació entre elles dóna lloc a una matriu de zeros i uns, donant el valor de la relació entre les corresponents entrades.
Exercici 1.1.3. Veure el resultat obtingut amb
a = rand(5), b = triu(a), a == b.
Quan s’utilitza una relació entre matrius en un bucle while o if, la relació s’en- tén vertadera si cada una de les entrades de la matriu de relació és no nul·la. Per tant, si es vol executar alguna cosa quan les matrius A i B siguen iguals, es pot escriure:
if A == B alguna cosa end
mentre que amb
5:-1:
s’obté el vector
[5 4 3 2 1]
Les següents instruccions, per exemple, generaran una taula de sinus. Proveu-ho.
x = [0.0:0.1:2.0]’; y = sin(x); [x y]
Fem notar que al operar sin a coordenades, produeix un vector y a partir de x. La notació de dos punts permet accedir a submatrius. Per exemple, A(1:4,3) és el vector columna amb les quatre primeres entrades de la tercera columna de A. Dos punts sense més especificació denoten una fila o columna completa: A(:,3) és la tercera columna de A, i A(1:4,:) són les quatre primeres files. Es poden utilitzar com índexs vectors sencers arbitraris: A(:,[2 4]) està formada per les columnes segona i quarta de A. Aquestos índexs es poden utilitzar a ambdós costats d’una instrucció d’assignació: A(:,[2 4 5]) = B(:,1:3) reemplaça les columnes 2, 4 i 5 de A per les tres primeres de B. Es mostra i assigna la matriu A alterada completa. Proveu-ho. Les columnes 2 i 4 de A poden multiplicar-se per la dreta per una matriu 2 × 2 :
A(:,[2,4]) = A(:,[2,4])*[1 2;3 4]
Exercici 1.1.4. Donat
A=round(10*rand(4,5))
calculeu
A(1:4,3) A(:,3) A(1:4,:) A(:,[2 4]) B(:,[2 4 5]) = A(:,1:3) A(:,[2,4]) = A(:,[2,4])*[1 2;3 4]
Si denotem per x un vector amb n components, quin és l’efecte de la instrucció x = x(n:-1:1)? Feu la prova. Per a comprovar la utilitat d’aquesta notació, compareu aquestes instruccions de MATLAB amb una rutina de Pascal, FORTRAN, o C que dóne els mateixos resultats.
La funció clock dóna l’hora actual aproximada fins la centèssima de segon (veure help clock). Donats dos temps t1 i t2, etime(t2,t1) proporciona el temps transcurrit de t1 a t2. Es pot, per exemple, mesurar el temps que requereix la resolu- ció d’un sistema d’equacions donat Ax = b usant eliminació gaussiana com segueix:
temps = clock;x = A\b;temps=etime(clock,temps)
Fem notar que, en màquines que operen a temps compartit, etime no és una mesura fiable de l’eficiència d’un algoritme ja que la velocitat d’execució depèn de l’ocupada que estiga la màquina en un moment determinat. La funció cputime dóna el temps de CPU en segons que ha segut utilitzat per MATLAB des de que es va iniciar la sessió. Així
t1 = cputime; x = A\b; cputime-t
ens dóna el temps CPU que s’ha utilitzat per a calcular x=A\b. Pot ser utilitzat per a calcular temps parcials entre distintes operacions. Amb els comandaments tic, toc calculem el temps transcorregut entre un i l’al- tre. Per exemple,
tic, x = A\b; toc
Les cadenes de text s’introdueixen en MATLAB entre cometes simples. Per exemple,
s = ’Açò és una prova’
assigna la cadena de text donada a la variable s. Les cadenes de text poden mostrar-se amb la funció disp. Per exemple:
disp(’Aquest missatge s’’està mostrant ací’)
Els missatges d’error es mostren millor amb la funció error
error(’Ho sent, la matriu deu ser simètrica’)
% ental(m,n) produeix una matriu mxn amb entrades % senceres entre 0 i 9 a = floor(10*rand(m,n));
Una versió més general d’aquesta funció és la següent:
function a = ental(m,n,a,b) % ENTAL Matriu sencera generada aleatòriament. % ental(m,n) produeix una matriu mxn amb entrades % senceres entre 0 i 9 % ental(m,n,a,b) produeix les entrades de la matriu entre a i b. if nargin < 3, a = 0; b = 9; end a = floor((b-a+1)*rand(m,n))+a;
Açò deu escriu-re’s en l’arxiu ental.m (corresponent al nombre de la funció). La primera línia declara el nom de la funció, arguments d’entrada, i arguments d’eixida; sense aquesta línia l’arxiu seria un d’instruccions. La instrucció
z = ental(4,5),
per exemple, faria que els nombres 4 i 5 passen a las variables m i n en l’arxiu de funció i el resultat s’assigna a la variable z. Com les variables en un arxiu de funció són locals, els seus noms són independents dels que es troben en l’espai de treball. Fem notar que l’ús de nargin (“nombre d’arguments d’entrada”) permet assignar un valor per defecte a una variable que s’ometa—com a i b en l’exemple. Una funció pot tenir també arguments d’eixida múltiples. Per exemple:
function [mitja, desv] = estad(x) % ESTAD Mitja i desviació típica. Per a un vector x, % estad(x) dóna la mitja i la desviació típica de x. % Per a una matriu x, estad(x) dóna dos vectors fila contenint, % resp., la mitja i la desviació típica de cada columna. [m n] = size(x); if m == 1 m = n; % cas d’un vector fila end mitja = sum(x)/m; desv = sqrt(sum(x.^2)/m - mitja.^2)
Una vegada situat en l’arxiu de disc estad.m, la instrucció de MATLAB
[xm, xd] = estad(x),
per exemple, assignarà la mitja i la desviació típica de x a les variables xm i xd, respectivament. Quan es disposa d’una funció amb argument d’eixida múltiple, es pot efectuar assignacions simples. Per exemple,
xm = estad(x)
(no són necessaris els claudàtors al voltant de xm) assignarà la mitja de x a xm. El símbol % indica que la resta de la línia és un comentari; MATLAB ignorarà la resta de la línia. Les primeres línies de comentari, que documenten l’arxiu, són acces- sibles amb la instrucció help. Així, per a que es mostren en pantalla serà suficient escriure help estad. Dita documentació deu inclou-re’s sempre en un arxiu de funció. Aquesta funció il·lustra algunes de les formes en que MATLAB pot usar-se per a obtindre un codi eficient. Cal notar, per exemple, que x.ˆ2 és la matriu dels quadrats de les entrades de x, que sum és una funció vectorial (secció 1.1.6), que sqrt és una funció escalar (secció 1.1.7), i que la divisió en sum(x)/m opera una matriu amb un escalar. La següent funció, que dóna el màxim comú divisor de dos sencers via l’algoritme d’Euclides, il·lustra l’ús d’un missatge d’error (veure secció següent).
function a = mcd(a,b) % MCD Màxim comú divisor % mcd(a,b) és el màxim comú divisor de a i b no nul.ls a la vegada. a = round(abs(a)); b = round(abs(b)); if a == 0 & b == 0 error(’El mcd no està definit si ambdós nombres són nul.ls’) else while b ~= 0 r = rem(a,b); a = b; b = r; end end
Matlab està preparat per a fer operacions amb matrius i vectors molt més ràpid que si les programàrem com ho faríem si no existiren eixes operacions directes. Així, és convenient vectoritzar l’algoritme al màxim en les M- files per a obtenir algoritmes més ràpids. Sempre que siga possible hi ha que convertir seqüències for i while en operacions matricials o vectorials. Per exemple, és equivalent calcular