Apunts complets, Ejercicios de Matemáticas. Universitat de València (UV)
ijome
ijome

Apunts complets, Ejercicios de Matemáticas. Universitat de València (UV)

148 páginas
8Número de visitas
Descripción
Asignatura: Eines informatiques, Profesor: Paco Aràndiga, Carrera: Matemàtiques, Universidad: UV
20 Puntos
Puntos necesarios para descargar
este documento
Descarga el documento
Vista previa3 páginas / 148
Esta solo es una vista previa
3 páginas mostradas de 148 páginas totales
Descarga el documento
Esta solo es una vista previa
3 páginas mostradas de 148 páginas totales
Descarga el documento
Esta solo es una vista previa
3 páginas mostradas de 148 páginas totales
Descarga el documento
Esta solo es una vista previa
3 páginas mostradas de 148 páginas totales
Descarga el documento
apunts_va.dvi

Eines Informàtiques

Paco Arandiga

Índex

1 Algoritmes bàsics en MATLAB 4 1.1 Programació en Matlab . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.1.1 Introducció . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1.2 Introducció de matrius . . . . . . . . . . . . . . . . . . . . . 4 1.1.3 Operacions amb matrius, operacions a coordenades . . . . . . 6 1.1.4 Declaracions, expressions i variables; emmagatzemament d’u-

na sessió . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.1.5 Format d’eixida . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.1.6 Funcions en MATLAB . . . . . . . . . . . . . . . . . . . . . 9 1.1.7 For, while, if — i relacions . . . . . . . . . . . . . . . . . . . 11 1.1.8 Submatrius i notació de dos punts . . . . . . . . . . . . . . . 14 1.1.9 Comparació de l’eficiència d’algoritmes: etime, cputime, tic, toc 16 1.1.10 Cadenes de text, missatges d’error, input . . . . . . . . . . . . 16 1.1.11 Arxius .m . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.1.12 Gràfics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 1.1.13 Consulta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

1.2 Càlcul Matricial Bàsic . . . . . . . . . . . . . . . . . . . . . . . . . 34 1.2.1 Normes de vectors . . . . . . . . . . . . . . . . . . . . . . . 34 1.2.2 Tipus de matrius . . . . . . . . . . . . . . . . . . . . . . . . 36 1.2.3 Matrius simètriques. . . . . . . . . . . . . . . . . . . . . . . 38

2 Solució d’equacions no lineals 39 2.1 Introducció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 2.2 Mètodes Iteratius . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

2.2.1 Tipus de convergència . . . . . . . . . . . . . . . . . . . . . 40 2.3 Mètode de la Bisecció . . . . . . . . . . . . . . . . . . . . . . . . . . 42 2.4 Mètode de régula falsi . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.5 Mètode de Newton-Raphson . . . . . . . . . . . . . . . . . . . . . . 50 2.6 Mètode de la secant . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 2.7 Arrels múltiples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 2.8 Problemes resolts . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 2.9 Problemes proposats . . . . . . . . . . . . . . . . . . . . . . . . . . 60

1

ÍNDEX 2

3 Introducció a LATEX 61 3.1 Introducció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 3.2 Software necesari . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 3.3 Per què utilitzar LATEX(LATEX2ε) . . . . . . . . . . . . . . . . . . . . 62

3.3.1 Pros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 3.3.2 Contres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

3.4 Compilant TEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 3.5 Iniciant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

3.5.1 Caracters especials i comands . . . . . . . . . . . . . . . . . 65 3.5.2 Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

3.6 Entorns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3.6.1 Verbatim . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3.6.2 Llistes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3.6.3 Espaiat i Centrat . . . . . . . . . . . . . . . . . . . . . . . . 68 3.6.4 Taules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

3.7 Fórmules Matemàtiques . . . . . . . . . . . . . . . . . . . . . . . . . 71 3.7.1 Numerant equacions . . . . . . . . . . . . . . . . . . . . . . 74

3.8 Qüestió de detall . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 3.8.1 Funcions matemàtiques . . . . . . . . . . . . . . . . . . . . . 78 3.8.2 Alfabets matemàtics . . . . . . . . . . . . . . . . . . . . . . 79 3.8.3 Alfabets matemàtics . . . . . . . . . . . . . . . . . . . . . . 79 3.8.4 Símbols diversos . . . . . . . . . . . . . . . . . . . . . . . . 79 3.8.5 Relacions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 3.8.6 Operadors binaris . . . . . . . . . . . . . . . . . . . . . . . . 80 3.8.7 Relacions Binaries . . . . . . . . . . . . . . . . . . . . . . . 81

3.9 La meua pròpia pàgina . . . . . . . . . . . . . . . . . . . . . . . . . 81 3.9.1 Nombre de pàgines . . . . . . . . . . . . . . . . . . . . . . . 83

3.10 Caixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 3.11 Inclusió de gràfics . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 3.12 Elements flotants . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 3.13 Seccions,... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 3.14 Títol, Autor, Resum i Índex . . . . . . . . . . . . . . . . . . . . . . . 86 3.15 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 3.16 Aprendre més . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

4 Càlcul Simbòlic 89 4.1 Introducció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.2 Definint variables simbòliques . . . . . . . . . . . . . . . . . . . . . 90 4.3 Expressions i equacions simbòliques . . . . . . . . . . . . . . . . . . 92

4.3.1 Substitucions . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.3.2 Quines variables simbòliques hi ha en F? . . . . . . . . . . . 94

4.4 Resolució d’equacions . . . . . . . . . . . . . . . . . . . . . . . . . 95 4.5 La funció inline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

ÍNDEX 3

4.5.1 Operadors relacionals i lògics . . . . . . . . . . . . . . . . . 97 4.5.2 La funció inline . . . . . . . . . . . . . . . . . . . . . . . . . 98

4.6 Expressions simbòliques i funcions . . . . . . . . . . . . . . . . . . . 100 4.7 Dominis, límits i continuïtat . . . . . . . . . . . . . . . . . . . . . . 103

4.7.1 Càlcul de límits: Límits laterals. . . . . . . . . . . . . . . . . 104 4.7.2 Continuïtat de funcions . . . . . . . . . . . . . . . . . . . . . 106

4.8 Simplificadors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 4.9 Càlcul de derivades. . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 4.10 Aplicacions de la derivada: Màxims-mínims-Punts d’Inflexió. Optim-

ització. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 4.11 Càlcul integral e integració numèrica . . . . . . . . . . . . . . . . . 123

5 Sistemes numèrics i fonts d’errors 126 5.1 Introducció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 5.2 Representacions numèriques . . . . . . . . . . . . . . . . . . . . . . 127 5.3 Aritmètica del punt flotant . . . . . . . . . . . . . . . . . . . . . . . 131 5.4 Conseqüències de l’aritmètica de precisió finita . . . . . . . . . . . . 138 5.5 Inestabilitat numèrica . . . . . . . . . . . . . . . . . . . . . . . . . . 142 5.6 Problemes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

Capítol 1

Algoritmes bàsics en MATLAB

1.1 Programació en Matlab

1.1.1 Introducció

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.

1.1.2 Introducció de matrius

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

1.1. PROGRAMACIÓ EN MATLAB 5

• Introduint una llista explícita d’elements,

• Generant-la mitjançant funcions i declaracions,

• Creant-la en un arxiu .m , veure seccions 1.1.8 i 1.1.10)

• Carregant-la d’un arxiu de dades extern (ho veurem més endavant).

Per exemple, qualsevol de les declaracions

A = [1 2 3; 4 5 6; 7 8 9]

i

A = [ 1 2 3 4 5 6 7 8 9 ]

crea la matriu 3×3 que s’espera i l’assigna a una variable A. Intenteu-ho. Els elements en una fila d’una matriu poden separar-se tant per comes com per espais en blanc.

Quan algun dels nombres s’escriu en forma exponencial (per exemple 2.34e-9), deuen evitar-se els espais en blanc. L’escriptura d’una matriu gran deu fer-se pref- erentment en un arxiu .m, on és més senzill corregir errors (veure seccions 1.1.8 i 1.1.10)).

Les funcions internes rand, magic, i hilb, per exemple, proporcionen una for- ma senzilla per a crear matrius amb les que experimentar. La instrucció rand(n), resp. rand(m,n), crearà una matriu n × n, resp. m × n, amb entrades aleatòria- ment generades, distribuïdes uniformement entre 0 i 1. magic(n) crearà una matriu quadrada màgica (les files i les columnes sumen la mateixa quantitat) amb entrades senceres; hilb(n) crearà la matriu de Hilbert d’ordre n, la reina de les matrius mal condicionades. m i n, per descomptat, denoten sencers positius. També es poden crear matrius utilitzant bucles for (veure secció 1.1.6). Intenteu-ho.

Les entrades individuals d’una matriu o d’un vector es poden obtindre posant els índexs entre parèntesi de la forma usual. Per exemple, A(2, 3) denota la entrada en la segona fila i tercera columna de la matriu A i x(3) denota la tercera coordenada del vector x. Intenteu-ho. Sols es poden usar com a índexs de vectors i de matrius sencers positius.

1.1. PROGRAMACIÓ EN MATLAB 6

1.1.3 Operacions amb matrius, operacions a coordenades

Disposem en MATLAB de les següents operacions amb matrius:

+ adició

− substracció ∗ multiplicació ˆ potenciació ′ transposada

\ divisió esquerra / divisió dreta

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].^2

1.1. PROGRAMACIÓ EN MATLAB 7

donaran

>> [1,4,9,16]

Intenteu-ho. Açò és particularment útil quan s’utilitzen els gràfics de MATLAB.

1.1.4 Declaracions, expressions i variables; emmagatzemament d’u- na sessió

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

1.1. PROGRAMACIÓ EN MATLAB 8

Cada element d’una matriu real requereix 8 bytes de memòria. Escrivint what apareixerà

M-files in the current directory /home/paco/

obj plotf1 pn1 prod1 prod3 tra afun peli plotf2 pn2 prod2 prod4 trape

açò és, totes les *m files (que ja explicarem més endavant en que consisteixen) que tenim en el directori en el que estem treballant. Hi ha altres comandaments que també es poden fer directament des de MATLAB com són cd, ls, mkdir, etc.

Per a eliminar una variable de la memòria s’utiliza la instrucció clear nom_variable. Si s’escriu sols clear es borren totes les variables no permanents.

La variable permanent eps (épsilon) dóna la precisió de la màquina—al voltant de 10−16 en la majoria d’elles. És útil per a determinar la tolerància en processos iteratius.

Qualsevol tipus de càlcul, gràfic, o impressió pot detindries sense eixir del progra- ma amb CTRL-C (CTRL-BREAK en PC).

Emmagatzematge de sessions. Quan eixim de MATLAB es perden totes las vari- ables. Per a evitar-ho es pot utilitzar la instrucció save abans d’eixir. Açò fa que les variables s’emmagatzemen en l’arxiu de disc matlab.mat. A l’accedir de nou a MATLAB, es poden recuperar totes les variables amb la instrucció load.

Amb diary es poden salvar les dades en un fitxer que després es pot editar. Hi hauria que escriure

>> diary nom >> . . . >> >>diary off

i tot el que hem fet entre diary nom i diary off queda arxivat en un fitxer ASCII anomenat nom.

A l’acabar, es pot editar l’arxiu com es desitge. Amb save name puguem salvar dades en un fitxer binari anomenat name.dat.

Les dades emmagatzemades ací poden ser recuperades amb load. Si volem salvar les dades en format ASCII ho podem fer de la següent manera:

A=rand(3,2); save enter.dat A -ascii

1.1. PROGRAMACIÓ EN MATLAB 9

que crea un fitxer anomenat enter.dat que conté

3.4119357e-01 7.2711322e-01 8.3849604e-01 5.3407902e-01 3.0929016e-01 5.6807246e-01

1.1.5 Format d’eixida

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.

1.1.6 Funcions en MATLAB

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.

1.1. PROGRAMACIÓ EN MATLAB 10

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 floor 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.

1.1. PROGRAMACIÓ EN MATLAB 11

Funcions matricials

Les funcions matricials més útils de MATLAB són les següents:

size tamany eig autovalors i autovectors chol factorització de Cholesky svd descomposició en valors singulars inv inversa lu factorització LU qr factorització QR hess forma de Hessenberg schur descomposició de Schur rref forma escalonada reduida per files expm matriu exponencial sqrtm matriu arrel quadrada poly polinomi característic det determinant norm norma 1, norma 2, norma de Frobenius, norma ∞ cond nombre de condició amb la norma 2 rank rang

Les funcions de MATLAB admeten arguments d’eixida simples o múltiples. Per ex- emple,

y = eig(A) , o simplemente eig(A) genera un vector columna contenint els autovalors de A mentre que

[U,D] = eig(A) produeix una matriu U de manera que les seues columnes són els autovectors de A i una matriu diagonal D amb els autovalors de A en la seua diagonal. Proveu-ho.

1.1.7 For, while, if — i relacions

Bàsicament, les instruccions per al control de flux de MATLAB operen com en la major part dels llenguatges usuals.

for. Per exemple, les instruccions

>> x = []; for i = 1:n, x=[x,i^2], end

o

>> x = []; >> for i = 1:n >> x = [x, i^2] >> end

1.1. PROGRAMACIÓ EN MATLAB 12

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 2n ≥ 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

1.1. PROGRAMACIÓ EN MATLAB 13

>> 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

1.1. PROGRAMACIÓ EN MATLAB 14

però si es desitja executar la mateixa instrucció si A i B són distintes, hi ha que recurrir a:

if any(any(A ~= B)) alguna cosa

end

o, més simplement,

if A == B else alguna cosa

end

Recalquem que l’aparentment obvia

if A ~= B, alguna cosa, end

no faria el que desitgem ja que la instrucció sols s’executaria si totes les entrades de A són distintes de les de B. Les funcions any i all poden utilitzar-se de forma creativa per a reduir relacions entre matrius a relacions entre vectors i escalars. Es requereixen dos anys en l’exemple anterior ja que any és un operador vectorial (veure secció 1.1.6).

1.1.8 Submatrius i notació de dos punts

Els vectors i submatrius són utilitzats sovint en MATLAB per a conseguir efectes de manipulació bastant complexos. La “notació de dos punts"(que s’utilitza per a generar vectors i submatrius), i la indexació per vectors són les claus per a una manipulació eficient d’aquestos objectes. El seu us de forma creativa permet minimitzar el nombre de bucles (que alenteixen MATLAB) i fan que les instruccions siguen més simples i llegibles. Deu fer-se un esforç especial per a familiaritzar-se amb aquesta notació.

La expressió 1:5 (que ja trobàvem en els bucles for) és realment un vector fila: el [1 2 3 4 5]. Els nombres no tenen que ser sencers ni l’increment un. Per exemple,

>> 0.2:0.2:1.2

dóna com a resultat

[0.2 0.4 0.6 0.8 1.0 1.2]

1.1. PROGRAMACIÓ EN MATLAB 15

mentre que amb

5:-1: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.

1.1. PROGRAMACIÓ EN MATLAB 16

1.1.9 Comparació de l’eficiència d’algoritmes: etime, cputime, tic, toc

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

1.1.10 Cadenes de text, missatges d’error, input

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’)

1.1. PROGRAMACIÓ EN MATLAB 17

ja que aquesta fa que l’execució isca de l’arxiu .m. En un arxiu .m l’usuari pot ser avisat per a introduir dades interactivament amb la

funció input. Si MATLAB es troba, per exemple, amb la instrucció

>> iter=input(’Nombre d’’iteracions:’)

la cadena entre cometes es mostra i l’execució es deté mentre l’usuari introdueix les dades. Després de polsar el retorn de carro, les dades s’assignen a la variable iter i continua l’execució.

1.1.11 Arxius .m

MATLAB pot executar una successió d’instruccions emmagatzemades en arxius de disc. Aquestos arxius es denominen “arxius .m", degut a que el seu sufix deu ser “m". Gran part del treball amb MATLAB serà el de crear i refinar arxius .m.

Hi ha dos tipus d’arxius .m: arxius d’instruccions i arxius de funcions. Arxius d’instruccions. Un arxiu d’instruccions consisteix en una successió d’in-

struccions normals de MATLAB. Si tinguérem un arxiu denominat nombre.m, les instruccions de l’arxiu poden ser executades sense més ni més que escrivint la instruc- ció nombre. Les variables en un arxiu d’instruccions són globals i, per tant, canviaran els valors de l’espai de treball.

Els arxius d’instruccions són utilitzats sovint per a introduir dades en una matriu gran. En un arxiu d’aquest tipus és bastant senzill corregir els errors sense tindre que repetir tot el treball. Si, per exemple, s’escriu en l’arxiu dades.m

A = [ 1 2 3 4 5 6 7 8 ];

aleshores la instrucció de MATLAB dades faria que s’efectue l’assignació especifi- cada en dades.m.

Un arxiu .m pot fer referència a altres, incloent a ell mateix. Arxius de funcions. Els arxius de funcions fan que MATLAB tinga capacitat de

creixement. Es poden crear funcions específiques per a un problema concret, i, a partir de la seua introducció, tindran el mateix rang que les demés funcions del sistema. Les variables en les funcions són locals encara que es poden declarar les variables per a que siguen globals.

Veurem, en primer lloc, un exemple senzill d’arxiu de funció:

function a = ental(m,n) % ENTAL Matriu sencera generada aleatòriament.

1.1. PROGRAMACIÓ EN MATLAB 18

% 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

1.1. PROGRAMACIÓ EN MATLAB 19

>> [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

1.1. PROGRAMACIÓ EN MATLAB 20

>> i=0; >> for t=0:0.001:10; >> i=i+1; >> y(i)=sin(t); >> end

que

>> t=0:0.001:10; >> y=sin(t);

però amb la segon opció tardem 0.0048 segons i amb la primera 0.1637. Encara que en Matlab no és necessari predimensionar els vectors a vegades pot ser

convenient fer-ho. Si no els pre-dimensionem, Matlab redimensiona els vectors cada pas de la iteració. Açò s’elimina predimensionant i, d’aquesta forma, ho calcula més ràpidament. Per a predimensionar (hi ha que saber la dimensió que tindrà el vector y) cal fer y=zeros(1,10001). Si el vector y ja estava definit amb eixa dimensió no notarem la diferència ja que és equivalent a predimensionar-ho.

Exercici 1.1.5. Compareu la diferència, en temps computacional, d’executar els dos programes anteriors per avaluar y=sin(t) sense tenir els vectors predimensionats (fer clear t y prèviament) amb executar-los després d’haver-los predimensionat prèviament (t=zeros(1,10001);y=t;.

En matlab, donats dos vectors v i u de dimensió n × 1 és equivalent, calcular el seu producte interior escrivint p=v’*u que fent

function c=prodi(a,b) % Producto interio n=length(a); c=0; for i=1:n

c=c+a(i)*b(i); end

Gràcies a aquesta capacitat tenim que si volem multiplicar dues matrius següents, les funcions ens donen el mateix resultat:

function C=prod1(A,B) % Producte de les matrius A i B [n,m]=size(A); [p,q]=size(B); for i=1:n

1.1. PROGRAMACIÓ EN MATLAB 21

for j=1:q C(i,j)=0; for k=1:p

C(i,j)=C(i,j)+A(i,k)*B(k,j); end

end end

function C=prod2(A,B) % Producte de les matrius A i B [n,m]=size(A); [p,q]=size(B); for i=1:n

for j=1:q C(i,j)=A(i,:)*B(:,j);

end end

function C=prod3(A,B) % Producte de les matrius A i B [n,m]=size(A); for i=1:n

C(i,:)=A(i,:)*B(:,:); end

function C=prod4(A,B) % Producte de les matrius A i B C(:,:)=A(:,:)*B(:,:); % Açò és equivalent a C=A*B;

Si la matriu té una estructura especial puguem aprofitar-la per a fer menys opera- cions. Per exemple, si volem avaluar C = A ∗B on

A =

( A11 0 0 A22

)

; B =

( B11 0 0 B22

)

(1.1)

on A11, A22, B11 i B22 són matrius de dimensió n × n, amb qualsevol de les fun- cions prod anteriors estaríem moltes vegades multiplicant per zero i, per tant, fent operacions no necessàries. Obtindríem el mateix resultat fent

[n,m]=size(A11); C=[A11*B11, zeros(n);zeros(n),A22*B22];

1.1. PROGRAMACIÓ EN MATLAB 22

però amb moltes menys operacions.

Exercici 1.1.6. Donades les matrius

>> A11=hilb(20), A22=magic(20), B11=pascal(20) i B22=rand(20)

(utilitzeu el comandament help per a veure quines matrius hem obtés), volem avaluar (1.1), feu-ho utilitzant les distintes alternatives. Calculeu el temps necessari per a cada una de les alternatives (Utilitzeu les funcions de matlab ETIME, TIC, TOC, CLOCK i/o CPUTIME) i compareu-los,

1.1.12 Gràfics

MATLAB pot produir gràfics plans i gràfics de malla de superfícies tridimensionals. Per a veure algunes de les seues possibilitats escriviu plot demo.

Gràfics plans. La instrucció plot crea gràfics en el pla XY; si x i y són vectors de la mateixa longitut, l’ordre plot(x,y) accedeix a la pantalla gràfica i realitza un gràfic pla dels elements de x contra els elements de y. Per exemple, podem dibuixar la gràfica de la funció sinus sobre l’interval [−4, 4] amb les instruccions següents:

>> x = -4:.01:4; y = sin(x); plot(x,y)

Intenteu-ho. El vector x és una partició del domini amb pas 0.01 mentre que y és un vector (sin és vectorial) amb els valors que prenen el sinus en els nodes d’aquesta partició.

Per a tornar a la pantalla alfanumèrica des de la gràfica, es polsa qualsevol tecla. Pel contrari, per a accedir a la pantalla gràfica, s’usa l’ordre shg (show graph). Si l’ordinador suporta finestres múltiples amb una finestra gràfica apart, es pot mantenir la finestra gràfica exposta —encara que a un costat— i la finestra alfanumèrica activa.

Com un segon exemple, pot dibuixar la gràfica de y = e−x 2

sobre l’interval [−1.5, 1.5] com segueix:

>> x = -1.5:.01:1.5; y = exp(-x.^2); plot(x,y)

Fem notar que ˆ està precedit per un punt per a assegurar-nos que opera a coorde- nades (veure secció 1.1.2).

Poden fer-se també gràfics de corbes definides paramètricament. Per exemple,

>> t=0:.001:2*pi; x=cos(3*t); y=sin(2*t); plot(x,y)

1.1. PROGRAMACIÓ EN MATLAB 23

La instrucció grid farà un quadriculat en la gràfica actual. Poden posar-se títols, comentaris en els eixos o en qualsevol altra part amb els

següents comandaments que tenen una cadena com a argument: title títol del gràfic xlabel comentari en l’eix x ylabel comentari en l’eix y gtext text posicionat interactivament text text posicionat mitjançant coordenades

Per exemple, la instrucció

title(’La funció més bella’)

proporciona un títol a la gràfica. Obtindriem el mateix resultat posant

title(’t=1 segons’)

que

idx=1; lab=sprintf(’t= %d segons’,idx); title(lab)

El comandament gtext(’La mancha’) permet posicionar una creu en la grà- fica amb les fletxes o el ratolí, on es situarà el text quan es polse qualsevol tecla.

Per defecte, els eixos s’autoescalen. Per a evitar-ho s’usa el comandament axis. Si c = [xmin, xmax, ymin, ymax] és un vector amb 4 elements, aleshores axis(c) es- tableix l’escala d’eixos als límits prescrits. axis, per si mateix congela l’escalat actual per a gràfics subseqüents; Escrivint axis de nou tornem a l’autoescalat. El comanda- ment axis(’square’) assegura que s’use la mateixa escala en ambdós eixos.

Mostrem dues formes d’obtindre dibuixos múltiples:

>> x=0:.01:2*pi;y1=sin(x);y2=sin(2*x);y3=sin(4*x); >> plot(x,y1,x,y2,x,y3)

i formant una matriu Y contenint els valors funcionals com columnes

>> x=0:.01:2*pi; Y=[sin(x)’, sin(2*x)’, sin(4*x)’]; >> plot(x,Y)

Altra forma és amb hold. El comandament hold congela la pantalla gràfica actual de forma que les gràfiques posteriors es sobreimposen en ella. Escrivint hold de nou es allibera el hold. Els comandaments hold on i hold off també es poden utilitzar.

Es poden evitar els tipus de línia i de punt per defecte. Per exemple,

1.1. PROGRAMACIÓ EN MATLAB 24

>> x=0:.01:2*pi; y1=sin(x); y2=sin(2*x); y3=sin(4*x); >> plot(x,y1,’--’,x,y2,’:’,x,y3,’+’)

produeix línies de punts i traces per a les dues primeres, mentre que per a la tercera s’obté el símbol + en cada node. Els tipus de línies i de punts són:

Tipus de línia: sòlid (-), a traces (-). punts (:), punt i traça (-.) Tipus de punts: punt (.), més (+), estrella (*), cercle (o), ics (x)

Veure help plot per als colors de les línies i punts. El comandament subplot s’usa per a dividir la pantalla de forma que puguen

veure’s fins quatre gràfiques a la vegada. Veure help subplot. Un exemple del que hem vist seria

x=-10:.1:10; for idx=1:10; subplot(2,5,idx) plot(x+idx/2,sin(2*x)); axis([0 2*pi -1 1]) lab=sprintf(’t= %d segons’,idx); title(lab); end

Gràfiques de malla de superfícies tridimensionals. Les gràfiques de malla de superfícies tridimensionals es fan amb la funció mesh. La instrucció mesh(z) crea una gràfica tridimensional en perspectiva de la matriu z. La superfície de malla està definida per les coordenades z dels punts sobre un quadricula rectangular en el pla XY. Per exemple, proveu amb mesh(eye(10)).

Per a dibuixar la gràfica d’una funció z = f(x, y) sobre un rectangle, es defineixen en primer lloc els vectors xx i yy que donen particions dels costats del rectangle. Amb la funció meshdom (mesh domain; el nom és meshgrid en la versió 4.0) es crea una matriu x, en la que cada fila és igual a xx, i d’igual forma una matriu y, amb totes les seues columnes iguals a yy, com segueix:

[x,y] = meshgrid(xx,yy);

Aleshores es computa la matriu z, obtinguda avaluant f entrada a entrada sobre les matrius x i y, per a aplicar-li la funció mesh.

Es pot, per exemple, dibuixar la gràfica de z = e−x 2−y2 sobre el quadrat [−2, 2] ×

[−2, 2] com segueix (intenteu-ho):

>> xx = -2:.1:2; >> yy = xx; >> [x,y] = meshgrid(xx,yy); >> z = exp(-x.^2 - y.^2);

No hay comentarios
Esta solo es una vista previa
3 páginas mostradas de 148 páginas totales
Descarga el documento