INTRODUCCION A MATLAB
INTRODUCCI ´ON A MATLAB c
° Victoriano Carmona Centeno y Julio R. Fern´andez Garc´ıa
Profesores del Departamento de Matem´atica Aplicada II Escuela Universitaria Polit´ecnica
Universidad de Sevilla
ISBN 84-8264-257-X Dep´osito Legal SE-233-98
Imprime Librer´ıa Papeler´ıa Panella C/Virgen de Africa 8, 41011 Sevilla Febrero de 1998
MATLAB es una marca registrada de The Math Works, Inc.
INTRODUCCI ´ON
Hace ya bastante tiempo que el ordenador es utilizado en el c´alculo cient´ıfico y su uso cada vez se impone con m´as fuerza tanto en el terreno de la investigaci´on como pedag´ ogico-did´actico. Es por ello, que hayan salido al mercado distintos programas en los que aparecen implementados algunos de los m´etodos que utilizamos d´ıa a d´ıa en la resoluci´on de nuestros problemas.
Uno de estos programas es MATLAB (MATrix LABoratory, Laboratorio de Matrices) que procede de los proyectos LINPACK y EISPACK y que ha evolucionado durante varios a˜nos hasta su forma actual. MATLAB destaca por su f´acil aprendizaje, f´acil utilizaci´on, gran potencia y pocas exigencias de equipamiento inform´atico. Naturalmente, esta buena ”relaci´on calidad-precio” hace que sea uno de los programas de software matem´atico m´as extendido.
La potencia de MATLAB se manifiesta por dos caracter´ısticas fundamentales: la conjugaci´on entre programaci´on cl´asica y funcional y la gran variedad de problemas que es capaz de resolver (Sistemas de Ecuaciones, Optimizaci´on, Ecuaciones diferenciales...). Su f´acil uso y r´apido aprendizaje est´an ´ıntimamente relacionados con su car´acter funcional y con el ente primordial o elemental en MATLAB: La matriz. De esta forma, los datos en MATLAB son, casi exclusivamente, matrices y la resoluci´on de un determinado problema se lleva a cabo aplicando” a las matrices introducidas las ”funciones” que MATLAB dispone (o que el usuario ha definido previamente).
MATLAB se presenta entonces como una herramienta eficaz y flexible en el C´alculo Num´erico (sobre todo en el Calculo Num´erico Matricial) con excelente posibilidades gr´aficas, que ayudan al profesor y al alumno tanto en sus trabajos docentes y de estudio como en su labor de investigaci´on.
Estas p´aginas no pretenden agotar, en absoluto, todas las posibilidades que MATLAB ofrece. Aquellos que deseen profundizar m´as en este tema pueden hacerlo consultando alguno de los excelentes manuales de la bibliograf´ıa y las referencias que en ellos se citan. En ella hemos incluido libros de ALGEBRA LINEAL para aquellos lectores que necesiten repasar algunos de los conceptos que se van desarrollando.
El presente manual fue utilizado en 1997 como texto de referencia en el Curso de ”Introducci´on a Matlab”, celebrado en el Centro Inform´atico Cient´ıfico de Andaluc´ıa (C.I.C.A.) del 7 al 14 de Abril. Este curso, que fue dirigido por los autores, estuvo organizado por el Vicerrectorado de Relaciones Institucionales y Extensi´on Cultural de la Universidad de Sevilla y fue homologado por la Consejer´ıa de Educacion y Ciencia.
Por ´ultimo deseamos hacer constar la colaboraci´on del profesor D. Francisco F´elix Lara Mart´ın en la elaboraci´on de unos apuntes preliminares a esta obra.
´
Indice General
1 Elementos b´asicos 3
1.1 Formatos de salida . . . 16
1.2 Matrices por bloques . . . 18
1.3 Operaciones con Matrices. . . 20
1.4 Operaciones elemento a elemento . . . 23
2 Tipos especiales de matrices. Construcciones. 25 2.1 Matrices especiales. . . 25
2.2 Redefiniciones y construcciones a partir de la diagonal . . . 26
3 Sistemas de Ecuaciones Lineales y descomposiciones 29 3.1 Resoluci´on de S.E.L. . . 29
3.1.1 Sistemas cuadrados . . . 29
3.1.2 Sistemas superdeterminados. M´ınimos cuadrados . . . 30
3.1.3 Tiempo de c´alculo y n´umero de operaciones . . . 31
3.2 Descomposiciones . . . 33
3.2.1 Factorizaci´on LU. . . 33
3.2.2 Descomposici´on de Cholesky . . . 34
3.2.3 Factorizacion QR . . . 35
3.2.4 Ortonormalizaci´on y espacio nulo . . . 37
3.3 Normas y n´umero de condici´on . . . 39
3.3.1 Normas vectoriales y matriciales . . . 39
3.3.2 N´umero de condici´on y rango . . . 39
4 Autovalores y polinomios 43 4.1 Autovalores y autovectores . . . 43
4.2 Valores singulares y pseudoinversa . . . 45
4.3 Tratamiento de polinomios . . . 47
4.3.1 Polinomio caracter´ıstico de una matriz cuadrada . . . 47
4.3.2 Operaciones con polinomios . . . 48
4.3.3 Ra´ıces de polinomios . . . 50 4.3.4 Aproximaci´on por polinomios en el sentido de los m´ınimos cuadrados . 52
2 ´INDICE GENERAL
4.3.5 La orden polyvalm y semejantes . . . 54
5 Posibilidades gr´aficas 57 5.1 Gr´aficos en el plano . . . 57
5.1.1 Poligonales y curvas . . . 57
5.1.2 Curvas en polares . . . 60
5.1.3 Curvas en param´etricas . . . 61
5.1.4 Histogramas y diagramas de barras . . . 63
5.2 Curvas en el espacio y superficies . . . 63
5.2.1 Curvas en param´etricas . . . 63
5.2.2 Superficies . . . 65
5.2.3 Curvas de nivel y vector gradiente . . . 66
6 Funciones y programas en Matlab. M—Ficheros 73 6.1 Instrucciones en Matlab: input, if, error, while, break, pause, for . . . 73
6.2 Definici´on de funciones . . . 81
7 Aspectos de an´alisis num´erico 84 7.1 Resoluci´on de Ecuaciones y Sistemas no Lineales . . . 84
7.2 Integraci´on num´erica . . . 85
7.3 Optimizaci´on en una y varias variables . . . 87
7.4 Resoluci´on de Ecuaciones Diferenciales Ordinarias . . . 87
8 Consejos pr´acticos 91 8.1 Las ´ordenes help, lookfor y demo . . . 91
8.2 Informaci´on sobre variables declaradas. Instrucciones para guardar y salvar variables . . . 92
8.3 Relaci´on con el sistema operativo. El comando diary . . . 93
9 Resumen de los comandos y funciones m´as utilizados 95
Cap´ıtulo 1
Elementos b´
asicos
En esta primera secci´on explicaremos aquello que es necesario conocer para comenzar a utilizar MATLAB. En particular describiremos:
1. La introducci´on de matrices y sus elementos, declaraciones y variables MATLAB. 2. C´omo obtener informaci´on, terminar y salvar variables declaradas en una sesi´on. 3. N´umeros y expresiones aritm´eticas.
4. Utilizaci´on de la ayuda. 5. Funciones de MATLAB.
LA INTRODUCCI ´ON DE MATRICES
MATLABtrabaja esencialmente con matrices rectangulares cuyos elementos pueden ser reales, complejos y/o cadenas de caracteres. En ocasiones consideraremos matrices de orden 1 por 1, que son escalares, y matrices con una fila o una columna, que representar´an vectores. En MATLAB podemos introducir las matrices de varias formas:
• Introduciendo expl´ıcitamente una lista de elementos.
• Generando matrices usando variables y funciones incorporadas. • Creando matrices en M—ficheros.
• Leyendo matrices desde ficheros de datos externos.
El lenguaje MATLAB no contiene ninguna declaracion de dimensi´on u otro tipo de declaraciones, como sucede en algunos lenguajes de programaci´on. MATLAB asigna y almacena autom´aticamente, dependiendo de las caracter´ısticas de cada ordenador.
El modo m´as f´acil de introducir matrices peque˜nas es introducir expl´ıcitamente sus ele-mentos, siguiendo las convenciones: Separar expl´ıcitamente la lista de elementos con espacios
4 CAP´ITULO 1. ELEMENTOS B ´ASICOS
en blanco o comas, encerrar los elementos entre corchetes ([ ]) y usar ; para indicar el fin de cada fila.
Por ejemplo, introduciendo la asignaci´on >>A=[1 2 3;4 5 6;7 8 9] resulta la salida A = 1 2 3 4 5 6 7 8 9
MATLABguarda la matriz para poder usarla posteriormente.
Las matrices tambi´en pueden introducirse por l´ıneas, reemplazando el ; por un retorno de carro. Por ejemplo, si tecleamos
>>A=[1 2 3 4 5 6 7 8 9]
obtenemos la misma salida A =
1 2 3
4 5 6
7 8 9
Podemos introducir las matrices desde discos, utilizando ficheros.m. As´ı si un fichero se llama “pepe.m” y contiene las siguientes l´ıneas de texto
A=[1 2 3 4 5 6 7 8 9]
entonces, la instrucci´on “pepe” lee el fichero “pepe.m” y genera la matriz A: >>pepe
A =
1 2 3
4 5 6
7 8 9
El comando “load” y la funci´on “fread” permiten leer matrices generadas durante sesiones anteriores, importar matrices de otros programas o exportarlas. Pero este es un aspecto que ser´a tratado m´as adelante.
5
>>x=[-1.3 sqrt(3) (1+2+3)*4/5] resulta
>>x=
-1.3000 1.7321 4.8000
Los coeficientes de la matriz pueden referenciarse individualmente utilizando ´ındices encer-rados dentro de un par´entesis. Si continuamos con el ejemplo anterior, la asignaci´on
>>x(5)= abs(x(1)) produce
>>x=
-1.3000 1.7321 4.8000 0 1.3000
Obs´ervese que el tama˜no de x aumenta autom´aticamente, acomoda al nuevo elemento que hemos definido y da el valor cero a los elementos que no se han definido.
Si tecleamos >>r=[10 11 12];
no obtenemos salida alguna; ello se debe a que hemos a˜nadido el punto y coma al final. No obstante MATLAB si ha almacenado la matriz r, para comprobarlo tecleamos
>>r y resulta >>r =
10 11 12
Podemos introducir matrices grandes utilizando matrices peque˜nas como “elementos”de la misma. Por ejemplo podemos a˜nadir una fila a la matriz A.
>>A = [ A; r] A = 1 2 3 4 5 6 7 8 8 10 11 12
6 CAP´ITULO 1. ELEMENTOS B ´ASICOS >>A = A(1:3,:) A = 1 2 3 4 5 6 7 8 9
toma las tres primeras filas de la matriz A y todas las columnas, y nos devuelve el resultado introducido en la matriz original. Estos y otros aspectos los veremos m´as adelante con mucho m´as detalle.
ASIGNACIONES Y VARIABLES MATLAB
MATLABes un lenguaje de expresiones: interpreta y eval´ua las expresiones introduci-das. Las asignaciones MATLAB son con frecuencia de la forma
variable=expresi´on o simplemente
expresi´on
Podemos componer expresiones con operadores, caracteres especiales, funciones y vari-ables. La evaluaci´on produce en la mayor´ıa de los casos una matriz. La matriz aparece, si se desea, en pantalla y es asignada a una variable para su posterior uso. Si omitimos el nombre de la variable y el signo =, MATLAB autom´aticamente crea una variable con el nombre “ans” (variable de respuesta), donde almacena el resultado. Por ejemplo, si introducimos la expresi´on
>>sqrt(2)/15 se obtiene ans =
0.0943
Si una expresi´on es bastante complicada (y larga) y no es suficiente una l´ınea para es-cribirla completamente, podemos a˜nadir al final tres puntos ( . . . ) seguidos de un retorno de carro para indicar que la asignaci´on contin´ue en la l´ınea siguiente. Por ejemplo,
>>s= 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 ... - 1/8 + 1/9 - 1/10 + 1/11 - 1/12;
eval´ua la suma de estas fracciones y asigna dicha suma a la variable s. Los espacios en blanco tras los signos =, + y − son opcionales, pero se incluyen para facilitar la lectura.
7
Podemos dar nombres a variables y funciones que empezar´an siempre por letras y que pueden estar seguidas de otras letras o d´ıgitos. MATLAB s´olo reconoce los 19 primeros caracteres de un nombre.
MATLABes muy sensible: distingue entre letras may´usculas y min´usculas. A y a no son la misma variable. Todos los nombres de funciones deben escribirse con min´usculas; inv(A) es la inversa de A, pero INV(A) no est´a definida. El comando “casesen” anula (o activa) esta sensibilidad.
RECOGIENDO INFORMACI ´ON EN EL ESPACIO DE TRABAJO (WORKSPACE)
En los ejemplos previos hemos creado variables que han sido almacenadas en el espacio de trabajo de MATLAB. Podemos listar estas variables tecleando “who” o “whos” dependiendo de la informaci´on que necesitemos de las variables almacenadas.
>>who
Your variables are:
A ans r s x
Esto muestra que los ejemplos anteriores han generado cinco variables, incluyendo la variable “ans”.
VARIABLES PERMANENTES
La variable “ans” y la variable “eps” tienen un significado especial para MATLAB. Ellas son permanentes y no pueden borrarse con la orden clear1. La variable “eps” es una tolerancia para considerar cero aquellas variables que sean casi nulas (bastante ´util para detener los procesos iterativos). El valor estandar de “eps” para estaciones de trabajo y ordenadores compatibles es:
eps = 2−52
que es aproximadamente 2.22 · 10−16. Podemos inicializar “eps” a cualquier otro valor incluido el cero.
Relacionadas con estas variables nos encontramos con las funciones pi, Inf y NaN que generan valores especiales.
Por ejemplo, la funci´on “pi” nos devuelve el n´umero π, precalculado por el programa como 4 arctan(1) (cuatro veces el arco cuya tangente es uno). Otra posibilidad es calcular π tecleando imag(log(−1)) (parte imaginaria del logaritmo principal de −1).
La funci´on “Inf”, que se utiliza para infinito, se encuentra en algunas calculadoras o lenguajes de computaci´on. Un camino para generar el valor que nos devuelva “Inf” es
8 CAP´ITULO 1. ELEMENTOS B ´ASICOS
>>s=1/0
Warning: Divide by zero s =
Inf
Aunque, dependiendo de la versi´on que utilicemos de MATLAB y el entorno de trabajo, la respuesta al c´alculo anterior puede ser el s´ımbolo ∞.
En m´aquinas con cierta aritm´etica, la divisi´on por cero no provoca un error ni la final-izaci´on de la ejecuci´on. Produce un mensaje y asigna un valor especial, que podemos utilizar en calculos posteriores. Por ejemplo, la variable “NaN” es un n´umero relacionado con el infinito pero con distintas propiedades. “NaN” siginfica No es Un N´umero. C´alculos como Inf/Inf o 0/0 lo generan. Como otra variable intr´ıseca de MATLAB podemos citar la unidad imaginaria que se representa en MATLAB por i ´o j.
LA UTILIDAD HELP
La utilidad “help” proporciona informaci´on instant´anea de la mayor´ıa de los t´opicos de MATLAB. El comando “help” sin argumentos muestra, dependiendo de la versi´on de MAT-LABque estemos usando, una lista de los directorios que contienen ficheros relacionados con MATLAB.
>>help
HELP topics:
c:\\matlab - Establish \matlab session parameters.
\matlab\general - General purpose commands.
\matlab\ops - Operators and special characters.
\matlab\lang - Language constructs and debugging.
\matlab\elmat - Elementary matrices and matrix manipulation.
\matlab\specmat - Specialized matrices.
\matlab\elfun - Elementary math functions.
\matlab\specfun - Specialized math functions.
\matlab\matfun - Matrix functions - numerical linear algebra.
\matlab\datafun - Data analysis and Fourier transform functions.
\matlab\polyfun - Polynomial and interpolation functions.
\matlab\funfun - Function functions - nonlinear numerical
methods.
\matlab\sparfun - Sparse matrix functions.
\matlab\plotxy - Two dimensional graphics.
9
\matlab\graphics - General purpose graphics functions.
\matlab\color - Color control and lighting model functions.
\matlab\sounds - Sound processing functions.
\matlab\strfun - Character string functions.
\matlab\iofun - Low-level file I/O functions.
\matlab\demos - Demonstrations and samples.
For more help on directory/topic, type "help topic".
Cada linea de pantalla incluye el nombre de un directorio seguido por una descripcion del contenido de los directorios. Si ahora introducimos
>>help matfun
obtenemos la lista de las funciones sobre matrices m´as relevantes en An´alisis Num´erico Ma-tricial.
Matrix functions - numerical linear algebra. Matrix analysis.
cond - Matrix condition number.
norm - Matrix or vector norm.
rcond - LINPACK reciprocal condition estimator.
rank - Number of linearly independent rows or columns.
det - Determinant.
trace - Sum of diagonal elements.
null - Null space.
orth - Orthogonalization.
rref - Reduced row echelon form.
Linear equations.
\ and / - Linear equation solution; use "help slash".
chol - Cholesky factorization.
lu - Factors from Gaussian elimination.
inv - Matrix inverse.
qr - Orthogonal-triangular decomposition.
qrdelete - Delete a column from the QR factorization. qrinsert - Insert a column in the QR factorization.
nnls - Non-negative least-squares.
pinv - Pseudoinverse.
lscov - Least squares in the presence of known covariance. Eigenvalues and singular values.
10 CAP´ITULO 1. ELEMENTOS B ´ASICOS
eig - Eigenvalues and eigenvectors.
poly - Characteristic polynomial.
hess - Hessenberg form.
qz - Generalized eigenvalues.
rsf2csf - Real block diagonal form to complex diagonal form. cdf2rdf - Complex diagonal form to real block diagonal form.
schur - Schur decomposition.
balance - Diagonal scaling to improve eigenvalue accuracy.
svd - Singular value decomposition.
Matrix functions.
expm - Matrix exponential.
expm1 - M-file implementation of expm.
expm2 - Matrix exponential via Taylor series.
expm3 - Matrix exponential via eigenvalues and eigenvectors.
logm - Matrix logarithm.
sqrtm - Matrix square root.
funm - Evaluate general matrix function.
Si ahora tecleamos “help lu” obtenemos informaci´on de la factorizaci´on LU de una matriz. >>help lu
LU Factors from Gaussian elimination.
[L,U] = LU(X) stores a upper triangular matrix in U and a "psychologically lower triangular matrix", i.e. a product of lower triangular and permutation matrices, in L , so that X = L*U.
[L,U,P] = LU(X) returns lower triangular matrix L, upper triangular matrix U, and permutation matrix P so that P*X = L*U.
By itself, LU(X) returns the output from LINPACK’S ZGEFA routine. Si tecleamos
>>help inverse
MATLABnos contesta inverse not found
pues en MATLAB “inverse” no es el nombre de ninguna funci´on o comando, a menos que haya sido a˜nadida por alg´un usuario.
11
Una informaci´on m´as general nos la proporciona “lookfor”. Por ejemplo >>lookfor inverse
INVHILB Inverse Hilbert matrix. ACOS Inverse cosine.
ACOSH Inverse hyperbolic cosine. ACOT Inverse cotangent.
ACOTH Inverse hyperbolic cotangent. ACSC Inverse cosecant.
ACSCH Inverse hyperbolic cosecant. ASEC Inverse secant.
ASECH Inverse hyperbolic secant. ASIN Inverse sine.
ASINH Inverse hyperbolic sine. ATAN Inverse tangent.
ATAN2 Four quadrant inverse tangent. ATANH Inverse hyperbolic tangent. ERFINV Inverse of the error function. INVERF Inverse Error function.
INV Matrix inverse. PINV Pseudoinverse.
IFFT Inverse discrete Fourier transform.
IFFT2 Two-dimensional inverse discrete Fourier transform. nos da una lista de funciones relacionadas con la palabra inverse.
TERMINANDO Y GUARDANDO EL ESPACIO DE TRABAJO (WORKSPACE) Para terminar una sesi´on con MATLAB teclearemos “quit” o “exit”. Al finalizar una sesi´on MATLAB se borran todas las variables del espacio de trabajo (i.e., las vari-ables declaradas en la sesi´on actual). Antes de terminar podemos guardar el contenido del “workspace”, para una sesi´on posterior, tecleando
>>save
Este comando salva todas las variables en un fichero llamado matlab.mat. La pr´oxima vez que MATLAB sea llamado podremos ejecutar “load” para restaurar, en el workspace, el contenido de matlab.mat.
Podemos utilizar “save” y “load’ con otros nombres de fichero.mat o bien guardar s´olo aquellas variables en las que estemos interesados. El comando “save temp X” guarda en el fichero temp.mat s´olo la variable X, mientras que “save temp X Y Z” almacena en temp.mat
12 CAP´ITULO 1. ELEMENTOS B ´ASICOS
las variables X,Y y Z. “load temp” cargas todas las variables almacenadas en el fichero temp.mat
Por ´ultimo, con los comandos “load” y “save” podemos importar y exportar ficheros con datos ASCII. (Ver m´as adelante).
N ´UMEROS Y EXPRESIONES ARITM´ETICAS
MATLAButiliza la notaci´on decimal, pudiendo incluir factores con potencias de diez o unidades imaginarias. Algunos ejemplos de n´umeros legales son:
3, −99, 9.6397238, 0.00001, 1.60210E − 20, 6.02252e23, 3e5i, 2i
La aproximaci´on del n´umero es “eps”, i.e., aproximadamente 16 d´ıgitos decimales significa-tivos cuando se usa aritm´etica de punto flotante. El rango de la mantisa es [−308, 308]. Podemos combinar expresiones con los operadores aritm´eticos usuales y las reglas de prece-dencia2. Las operaciones elementales son:
• + Suma • − Resta • ∗ Multiplicaci´on • / Divisi´on derecha • \ Divisi´on izquierda • ∧ Potencia
Las operaciones con matrices hacen conveniente tener dos s´ımbolos para la divisi´on. Esto se analizar´a con m´as detalle cuando abordemos el estudio de las operaciones y funciones con matrices. Pero, adelantamos que por ejemplo, las expresiones escalares 1/4 y 4\1 tienen el mismo valor num´erico, es decir 0.25.
NUMEROS COMPLEJOS, CADENAS DE CARACTERES Y MATRICES MATLABtrabaja con n´umeros complejos y representa la unidad imaginaria por i ´o j. El n´umero z en forma bin´omica podemos escribirlo de dos formas
>>z=3+4*i z = 3.0000 + 4.0000i >>z=3+4*j z = 3.0000 + 4.0000i
13
Otra opci´on consiste en utilizar la notaci´on exponencial “W=r*exp(i*theta)”. >>w=4*exp(i*pi/2)
w =
0.0000 + 4.0000i
Dos formas para introducir matrices complejas son: >>A=[1 2; 3 4] + i*[5 6; 7 8]
A =
1.0000 + 5.0000i 2.0000 + 6.0000i 3.0000 + 7.0000i 4.0000 + 8.0000i >> A=[ 1 + 5*i 2 + 6*i; 3 + 7*i 4 + 8*i] A =
1.0000 + 5.0000i 2.0000 + 6.0000i 3.0000 + 7.0000i 4.0000 + 8.0000i
En las versiones m´as actuales de MATLAB se pueden escribir los n´umeros complejos sin necesidad de utilizar *. Pero hay que tener cuidado en no dejar espacios en blanco al escribir la parte imaginaria de un n´umero complejo. Si escribimos
>>1+ 4i se obtiene
1.0000 + 4.0000i en cambio, al introducir >>1 + 4 i
aparece el siguiente mensaje de error
??? 1+4 i
\vert
Missing operator, comma, or semi-colon.
Esto tambi´en hay que tenerlo en cuenta cuando se utiliza la notaci´on exponencial con n´umeros reales. Si introducimos
>>1.23e-4
la respuesta es 1.2300e-004 en cambio
14 CAP´ITULO 1. ELEMENTOS B ´ASICOS
>>1.23 e-4
produce el siguiente mensaje de error ??? 1.23 e
\vert
Missing operator, comma, or semi-colon.
Si hemos utilizado durante una sesi´on las letras i ´o j como nombre de variables o fun-ciones que juegan un papel distinto al de la unidad imaginaria, y necesitamos posteriormente trabajar con complejos, podemos definir la unidad imaginaria del siguiente modo:
>>ii=sqrt(-1) ii =
0 + 1.0000i
Consideremos, por ejemplo, la siguiente sesi´on >>i ans = 0 + 1.0000i >>z = 1 + i z = 1.0000 + 1.0000i >>w= 1 + j w = 1.0000 + 1.0000i >>i=7 i = 7 >>j=6 j = 6 >>z z = 1.0000 + 1.0000i >>z= 1+i z = 8 >>ii=sqrt(-1) ii = 0 + 1.0000i >>z=1+ii
15
z =
1.0000 + 1.0000i
Realmente MATLAB s´olo maneja matrices, pero los elementos de ´estas pueden ser n´umeros (reales o complejos) o cadenas de caracteres. Por ejemplo si tecleamos
>> 34 ans =
34
aparece el n´umero 34, en cambio introduciendo matrices formadas por cadenas de caracteres (incluido el espacio en blanco) podemos leer, por ejemplo, la profunda conversaci´on:
>> saludo=[’Hola,’ ’Buenos d´ıas’],respuesta=[’Buenos d´ıas’] saludo =
Hola, Buenos d´ıas respuesta =
Buenos d´ıas FUNCIONES
La potencia de MATLAB se deriva de su extenso conjunto de funciones. Algunas fun-ciones son intr´ınsecas al proceso de MATLAB en s´ı mismo. Otras funfun-ciones se pueden encontrar en una librer´ıa externa de ficheros.m distribuida con MATLAB, llamadas cajas de herramientas (MATLAB Toolboxes).
Todav´ıa se est´an a˜nadiendo funciones que han sido creadas por usuarios individuales, o grupos de usuarios, para aplicaciones m´as especializadas. Este es un hecho importante, cada usuario puede crear sus propias funciones y trabajar con ellas conjuntamente con las funciones intr´ınsecas de MATLAB. ´Este es un aspecto importante que desarrollaremos m´as adelante.
MATLAB posee una gran clase de funciones, entre las que se inlcuyen las funciones elementales que podemos encontrar en casi todas las calculadoras cient´ıficas (abs, sqrt, log, sin, . . . ). Las funciones de que disponemos en MATLAB se pueden clasificar, por grupos, del siguiente modo:
1. Funciones elementales 2. Funciones especiales
3. Funciones matriciales elementales 4. Funciones matriciales especiales 5. Descomposici´on de matrices 6. An´alisis de datos
16 CAP´ITULO 1. ELEMENTOS B ´ASICOS
8. Ecuaciones diferenciales
9. Ecuaciones no lineales y optimizaci´on 10. Integraci´on num´erica
11. Procesamiento de la se˜nal
Una breve descripci´on de casi todas las funciones de estos grupos se puede encontrar en los cuadros res´umenes del ´ultimo cap´ıtulo o, con m´as profundidad, en la gu´ıa de usuarios de MATLAB.
Destacamos que la pr´actica totalidad de las funciones elementales de MATLAB no s´olo act´ua sobre n´umeros, sino que tambi´en operan con matrices actuando directamente sobre las entradas de la matriz.
En el subapartado dedicado al orden “polyvalm” veremos algunas funciones matriciales, como la exponencial matricial, el logaritmo matricial, . . .
1.1
Formatos de salida
Antes de comenzar con el siguiente apartado (las operaciones matriciales) se˜nalamos que aunque MATLAB siempre trabaja en doble precisi´on, es posible elegir diversos “formatos de salida” para los resultados num´ericos. Por defecto, el formato usual ser´a de 5 cifras decimales.
Algunas de las posibilidades que tenemos las describimos a continuaci´on con ejemplos concretos:
>> format short e >> A=[4/3 7.908767 3] A =
1.3333e+000 7.9088e+000 3.0000e+000 >> format long >> A A = 1.33333333333333 7.90876700000000 3.00000000000000 >> format long e >> A A = 1.333333333333333e+000 7.908767000000000e+000 3.000000000000000e+000
La orden “format rat” hace que los resultados num´ericos siempre aparezcan como n´umeros racionales. Pero t´engase en cuenta que esto no significa que la matriz en cuesti´on sea tratada internamente, por MATLAB, como una matriz racional. Por consiguiente, esto resulta ´util
1.1. FORMATOS DE SALIDA 17
si tenemos la certeza de estar siempre trabajando con n´umeros racionales. Ponemos esto de manifiesto con la aproximaci´on racional de MATLAB para √2.
>>format rat >>sqrt(2) ans = 114243/80782 >>format long e >>114243/80782 ans = 1.414213562427273e+00 >>sqrt(2) ans = 1.414213562373095e+00
Obs´ervese que si utilizamos “format rat” para la representaci´on de la matriz de Hilbert de orden 5 se obtiene: >>format rat >>H=hilb(5) H = 1 1/2 1/3 1/4 1/5 1/2 1/3 1/4 1/5 1/6 1/3 1/4 1/5 1/6 1/7 1/4 1/5 1/6 1/7 1/8 1/5 1/6 1/7 1/8 1/9
El formato “format +” muestra un diagrama de la matriz en el que s´olo aparecen los elementos no nulos (positivos marcados con “+” y negativos con “−”). “format +” resulta especialmente ´util para destacar la estructura de una matriz (banda ,diagonal por bloques, ...). Por ejemplo: >> J=[-3 1 0 0;0 -3 0 0;0 0 4 1;0 0 0 4] J = -3 1 0 0 0 -3 0 0 0 0 4 1 0 0 0 4 >> format + >> J J =
18 CAP´ITULO 1. ELEMENTOS B ´ASICOS
-+
-++ +
Para volver al formato corto usual podemos teclear “format” o bien “format short”. En relaci´on con la presentaci´on por pantalla tenemos los comandos “format compact” y “format loose”. El primero de ellos nos suprime las l´ıneas en blanco que, por defecto, aparecen en una sesi´on MATLAB, mostrando de esta forma m´as informaci´on en pantalla; el segundo de los comandos anula el anterior.
1.2
Matrices por bloques
Es posible manejar bloques completos de una matriz utilizando los dos puntos (:). Por ejemplo: >> A=[4 5 3 2;3 5 7 -1;2 5 8 0] A = 4 5 3 2 3 5 7 -1 2 5 8 0 >> A(1,:)
Nos proporciona la primera fila de la matriz A. ans =
4 5 3 2
>> b=B(:,2)
Asigna a la variable “b” la segunda columna de la matriz B b =
5 6 -1
>> bloque=A(2:3,1:2)
La variable “bloque” contiene el bloque formado por la intersecci´on de las filas 2a y 3a y de las columnas 1a y 2a de la matriz A.
bloque =
3 5
1.2. MATRICES POR BLOQUES 19
En particular, es posible hacer referencia a un elemento concreto de una matriz. El elemento (2, 1) de la matriz denominada “bloque” se obtiene de forma totalmente natural: >> bloque(2,1)
ans = 2
Una instrucci´on del tipo M = [P ; B] construye, si es posible, una matriz M a˜nadiendo a P las filas de B. V´ease,
>> P=[3 5 6; -2 .5 9]; B=[4 6 2; 9 0 0;5 5 0.25]; >> P,B P = 3.0000 5.0000 6.0000 -2.0000 0.5000 9.0000 B = 4.0000 6.0000 2.0000 9.0000 0 0 5.0000 5.0000 0.2500 >> F=[P;B] F = 3.0000 5.0000 6.0000 -2.0000 0.5000 9.0000 4.0000 6.0000 2.0000 9.0000 0 0 5.0000 5.0000 0.2500
La orden M = [P B], an´aloga a la anterior, construye la matriz M a˜nadiendo a P las columnas de B. Naturalmente, esto es posible si P y B tienen el mismo n´umero de filas. >>G=[2 1;1 3],O=[1 0 -1;2 1 -3] G = 2 1 1 3 O = 1 0 -1 2 1 -3 >>M1=[G O] M1 = 2 1 1 0 -1 1 3 2 1 -3
Si se definen nuevos elementos de una matriz en una fila o columna no existente, los elementos no definidos (en la filas o columnas no existentes) se toman como nulos.
20 CAP´ITULO 1. ELEMENTOS B ´ASICOS >>P(3,2)=pi P = 3.0000 5.0000 6.0000 -2.0000 0.5000 9.0000 0 3.1416 0
Los dos puntos se pueden utilizar con otra finalidad. Podemos definir un vector cuyos elementos est´an en progresi´on artim´etica:
>> t=0:2:10 t =
0 2 4 6 8 10
Los dos puntos tambi´en se pueden utilizar para transformar una matriz en un vector columna, siguiendo el orden de las columnas.
>>A(:) ans = 4 3 2 5 5 5 3 7 8 2 -1 0
1.3
Operaciones con Matrices.
En esta secci´on mostraremos como las operaciones con matrices se realizan en MATLAB de forma bastante natural.
Dada una matriz A, A0 nos proporciona la traspuesta de A, si ´esta es real, o la adjunta en sentido herm´ıtico, si A es de n´umeros complejos.
>> T=J’ T =
-3 0 0 0
1 -3 0 0
1.3. OPERACIONES CON MATRICES. 21
0 0 1 4
>> C=[3+2*i 6-2*i;7 2*i] C = 3.0000 + 2.0000i 6.0000 - 2.0000i 7.0000 0 + 2.0000i >> T=C’ T = 3.0000 - 2.0000i 7.0000 6.0000 + 2.0000i 0 - 2.0000i
La suma de matrices (+), el producto (*) y la potencia n—´esima de una matriz (A∧n) se realizan como sigue.
>> S=T+C S = 6.0000 13.0000 - 2.0000i 13.0000 + 2.0000i 0 >> E=[6 3 2;-1 3 -1;5 3 8] E = 6 3 2 -1 3 -1 5 3 8 >> P=E*E’ P = 49 1 55 1 11 -4 55 -4 98 >>NI=[0 1 -2;0 0 15;0 0 0] NI = 0 1 -2 0 0 15 0 0 0 >>NI^3 ans = 0 0 0 0 0 0 0 0 0
Para calcular el determinante de una matriz cuadrada usaremos la funci´on “det”. Por ejemplo, para la matriz de Hilbert de orden 5 el determinante es:
>>format rat >>H=hilb(5)
22 CAP´ITULO 1. ELEMENTOS B ´ASICOS H= 1 1/2 1/3 1/4 1/5 1/2 1/3 1/4 1/5 1/6 1/3 1/4 1/5 1/6 1/7 1/4 1/5 1/6 1/7 1/8 1/5 1/6 1/7 1/8 1/9 >> det(H) ans = 1/266716800000
Para calcular la traza emplearemos “trace”, para obtener el rango “rank” y para hallar la inversa “inv”. Esto se ilustra en el siguiente ejemplo:
>>A=[1 2 3;0 1 2;0 0 1] A = 1 2 3 0 1 2 0 0 1 >>trace(A) ans = 3 >>rank(A) ans = 3 >>inv(A) ans = 1 -2 1 0 1 -2 0 0 1
1.4. OPERACIONES ELEMENTO A ELEMENTO 23
La primera componente denota el n´umero de filas y la segunda el n´umero de columnas. >>size(A)
ans =
3 3
Por ´ultimo, indicar que la orden “nnz” determina el n´umero de elementos no nulos de la matriz.
>>nnz(A) ans =
6
1.4
Operaciones elemento a elemento
Si M y N son matrices del mismo orden M. ∗ N, M.∧N y M./N realizan el producto, la potenciaci´on y la divisi´on elemento a elemento. (Naturalmente, la suma y la diferencia de matrices se realizan elemento a elemento). Por ejemplo,
>> PE=E.*E’ PE = 36 -3 10 -3 9 -3 10 -3 64 >> PO=E^2 PO = 43 33 25 -14 3 -13 67 48 71 >> PO=E.^2 PO = 36 9 4 1 9 1 25 9 64 >> M=[1 2 5];v=[1 2 3]; >> M.^v
24 CAP´ITULO 1. ELEMENTOS B ´ASICOS
ans =
1 4 125
Cuando una de las matrices sea de orden 1 por 1 (i.e., un escalar), las operaciones ante-riores tambi´en tienen sentido. V´ease
>> 3 .^v ans = 3 9 27 >>3 ./v ans = 3.0000 1.5000 1.0000
N´otese el espacio entre el n´umero 3 y el punto; ´este es necesario en las primeras versiones de MATLAB.
En relaci´on con las operaciones elemento a elemento podemos destacar la operaci´on no+matriz (o matriz+no) que, al contrario de las anteriores no necesita el punto (.), y cuyo cometido es sumar a cada elemento de la matriz el n´umero en cuesti´on.
>>8+v ans =
Cap´ıtulo 2
Tipos especiales de matrices.
Construcciones.
2.1
Matrices especiales.
Indiquemos en primer lugar como generar autom´aticamente, con ayuda de algunas funciones incorporadas en MATLAB, algunos tipos de matrices.
“zeros(m,n)” genera la matriz nula de orden m × n. An´alogamente “ones(m,n)” produce una matriz de orden m × n con todos sus elementos iguales a uno. Si tecleamos “zeros(n)” o “ones(n)” obtenemos los mismos resultados, pero en estos casos las matrices son cuadradas de orden n. >> Z=zeros(3,2) Z = 0 0 0 0 0 0
Si tecleamos “eye(n)” obtendremos la matriz identidad de orden n. En cambio “eye(m,n)” produce el siguiente efecto:
>> E=eye(2,4) E =
1 0 0 0
0 1 0 0
As´ı, las funciones anteriores pueden tener uno o dos argumentos de entrada dependiendo de la finalidad que persigamos. Esta caracter´ıstica no la poseen s´olo las funciones anteri-ores, sino que la mayor´ıa de las funciones de MATLAB gozan de la misma, como iremos descrubiendo m´as adelante.
Adem´as, la anterior caracter´ıstica est´a ´ıntimamente ligada con la funci´on (variable in-tr´ıseca) “nargin” (n´umero de argumentos de entrada) que nos proporciona, una vez que
26 CAP´ITULO 2. TIPOS ESPECIALES DE MATRICES. CONSTRUCCIONES.
llamamos a una funci´on, el n´umero de argumentos de entrada que utilizamos en dicha llama-da (es decir, el n´umero de elementos entre par´entesis y separados por comas que preceden al nombre de una funci´on). Relacionada con la funci´on “nargin” nos encontramos la funci´on “nargout” (n´umero de argumentos de salida) de la que hablaremos m´as adelante.
La orden “ones(A)” nos proporciona una matriz de unos del mismo orden que A. Efectos an´alogos tienen los comandos “eye(A)” y “zeros(A)”.
>> ones(E) ans =
1 1 1 1
1 1 1 1
Para la versi´on 4.2c de MATLAB las ´ordenes “ones(A)”,“ eye(A)” y “size(A)” han quedado obsoletas y conviene sustituirlas por “ones(size(A))”, “eye(size(A))” y “zeros(size(A))”.
Tambi´en es posible generar algunas matrices especiales como por ejemplo matrices de Hilbert. As´ı, “hilb(n)” produce la matriz de Hilbert de orden n:
>> H=hilb(5) H = 1.0000 0.5000 0.3333 0.2500 0.2000 0.5000 0.3333 0.2500 0.2000 0.1667 0.3333 0.2500 0.2000 0.1667 0.1429 0.2500 0.2000 0.1667 0.1429 0.1250 0.2000 0.1667 0.1429 0.1250 0.1111
2.2
Redefiniciones y construcciones a partir de la diagonal
Existen varias funciones MATLAB que permiten redefinir la estructura de una matriz: >>rot90(E)
Esta instrucci´on realiza un giro de 90o grados (en sentido positivo) de la matriz E. ans =
0 0
0 0
0 1
1 0
A partir de una matriz A podemos conseguir nuevas matrices con los mismos elementos, pero diferente estructura mediante instrucciones como:
• “reshape(A,m,n)”que nos proporciona, a partir de los elementos de A, una matriz de orden m × n siguiendo el orden de las columnas. Naturalmente, A debe tener m · n elementos.
2.2. REDEFINICIONES Y CONSTRUCCIONES A PARTIR DE LA DIAGONAL 27
• “fliplr(A)” que nos da la matriz A pero con las columnas en orden inverso. • “flipud(A)” que tiene el mismo efecto que “fliplr(A)”, pero para las filas de A. >> A=[3 4 6 8;1 0 7 20;-3 -2 8 0] A = 3 4 6 8 1 0 7 20 -3 -2 8 0 >> R=reshape(A,2,6) R = 3 -3 0 6 8 20 1 4 -2 7 8 0 >>fliplr(A),flipud(A) ans = 8 6 4 3 20 7 0 1 0 8 -2 -3 ans = -3 -2 8 0 1 0 7 20 3 4 6 8
Dada una matriz A existe la posibilidad de generar diversas matrices a trav´es de la(s) diagonal(es) de A.
Para obtener la diagonal de una matriz A, (que puede no ser cuadrada) basta teclear >> D=diag(A)
D = 3 0 8
Si v es un vector “diag(v)” nos da una matriz diagonal (cuadrada) cuya diagonal es v. >> diag([5 7 -3])
ans =
5 0 0
0 7 0
0 0 -3
La orden “diag(A)” posee como variante la orden “diag(A,k)” que muestra la k—´esima superdiagonal de A, si k es positivo, y la k—´esima subdiagonal, si k es negativo. (Obs´ervese de nuevo la posibilidad de dar distinto n´umero de argumentos de entrada a una funci´on MATLAB).
28 CAP´ITULO 2. TIPOS ESPECIALES DE MATRICES. CONSTRUCCIONES. >> D2=diag(A,2) D2 = 6 20 >> D_1=diag(A,-1) D_1 = 1 -2
De manera totalmente an´aloga a la orden “diag(A)” nos encontramos las ´ordenes “triu(A)” y “tril(A)” que generan matrices triangulares superiores y triangulares inferiores, respecti-vamente, con los elementos superiores e inferiores, respectivamente, a la diagonal de A y con los elementos diagonales de la misma.
>> TS=triu(A) TS =
3 4 6 8
0 0 7 20
0 0 8 0
Tambi´en disponemos de las variantes “triu(A,k)” y “tril(A,k)” que act´uan de forma an´aloga a la instrucci´on “diag(A,k)”. Por ejemplo, ’triu(A,k)’ produce el siguiente efecto: >> TS2=triu(A,2)
TS2 =
0 0 6 8
0 0 0 20
0 0 0 0
El lector puede practicar estas instrucciones descomponiendo una matriz cuadrada A como suma de una matriz triangular inferior L, una matriz diagonal D y una matriz triangular superior U . (Esta descomposici´on resulta ´util en la resoluci´on de S.E.L. mediantes m´etodos iterativos).
Cap´ıtulo 3
Sistemas de Ecuaciones Lineales y
descomposiciones
3.1
Resoluci´
on de S.E.L.
3.1.1
Sistemas cuadrados
Si se desea resolver el S.E.L. (S) : Ax = b, donde A es una matriz cuadrada (no singular); puede obtenerse la soluci´on mediante la operaci´on A\b. Esta operaci´on nos indica que estamos dividiendo, por la izquierda, el vector columna b por la matriz A, i.e., estamos haciendo la operaci´on A−1b. Como se puede imaginar esta operaci´on no se realiza calculando la inversa1 de A, se lleva a cabo de forma general mediante el m´etodo de Gauss con estrategia de pivoteo parcial. Por ejemplo, para resolver el sistema
x + 2y = 3
3x − 4y = −1 se realizan las siguientes instrucciones:
• Introducci´on de la matriz de coeficientes y el vector columna b. • Resoluci´on del sistema mediante la divisi´on izquierda A\b. >> A=[1 2;3 -4];b=[3 -1]’;
>> x=A\b x =
1.0000 1.0000
Si A es singular, a´un cuando el sistema sea compatible, MATLAB nos proporcionar´a un mensaje de error.
1Pues el c´alculo de la inversa de una matriz es demasiado costoso desde el punto de vista computacional.
30 CAP´ITULO 3. SISTEMAS DE ECUACIONES LINEALES Y DESCOMPOSICIONES
>> A=[1 2;2 4];b=[3 6]’; >> x=A\b
Warning: Matrix is singular to working precision. x =
Inf Inf
3.1.2
Sistemas superdeterminados. M´ınimos cuadrados
Si A no es cuadrada, A\b resuelve el sistema (S) en el sentido de los m´ınimos cuadrados. De esta forma, podemos resolver el sistema anterior a˜nadiendo una fila nula a la matriz ampliada [A|b].
>> A(3,:)=[0 0];b(3)=0; >> x=A\b
Warning: Rank deficient, rank = 1 tol = 2.9790e-015 x =
0 1.5000
Como podemos observar, s´olo hemos obtenido una de las soluciones del sistema. Para tener todas, solamente nos falta una base del espacio nulo (n´ucleo) de la matriz A. Veremos como obtener esto en una pr´oxima secci´on.
Se ha puesto de manifiesto en este subapartado que la resoluci´on del sistema Ax = b, llevada a cabo por MATLAB mediante la orden A\b, depende de la estructura de la matriz de coeficientes del sistema. De hecho, la divisi´on izquierda \ utiliza, a grandes rasgos, el siguiente algoritmo:
• Si la matriz A es una permutaci´on de una matriz triangular superior (resp. inferior) se utiliza el m´etodo de subida (resp. bajada).
• Si A es sim´etrica (herm´ıtica) definida positiva se calcula la descomposici´on de Cholesky de A, i.e., se determina la matriz triangular superior R con elementos diagonales es-trictamente positivos tal que A = RtR y a continuaci´on se determina x de la forma
x = R\(R0\b).
• Si la matriz de coeficientes no es una permutaci´on de una matriz triangular o no es definida positiva, la resoluci´on del sistema se lleva a cabo calculando la descomposici´on LU de A mediante el m´etodo de Gauss con estrategia de pivoteo parcial. Una vez calculadas las matrices L y U , la soluci´on del sistema es x = U \(L\b).
• Por ´ultimo, si A no es cuadrada se computa la descomposici´on QR de A mediante simetr´ıas de Householder. Es decir, se calcula Q ortogonal, R triangular superior y P matriz de permutaci´on tales que AP = QR. Una vez obtenidas P, Q y R se calcula x mediante x = P ∗ (R\(Q0∗ b)).
3.1. RESOLUCI ´ON DE S.E.L. 31
3.1.3
Tiempo de c´
alculo y n´
umero de operaciones
Como hemos visto en el cap´ıtulo 1 la instrucci´on “inv(A)” calcula la inversa de la matriz A, si ´esta es regular (en realidad, s´olo podemos fiarnos del resultado final si A no es casi singular ). La resoluci´on de un determinado S.E.L. puede realizarse con MATLAB mediante la orden “inv(A)*b”, pero como pondremos de manifiesto a continuaci´on es m´as efectivo la utilizaci´on del comando “A\b”. Esta eficacia se pone de manifiesto comparando el n´umero de operaciones de ambos m´etodos y el tiempo de c´alculo para llevar a cabo los mismos. El n´umero de operaciones que MATLAB ha efectuado en una sesi´on puede obtenerse con el comando “flops”. Ahora bien, la utilizaci´on de la versi´on “flops(0)” hace que el contandor (del n´umero de operaciones) se inicialice a cero, con lo que si seguidamente realizamos algunas operaciones con MATLAB podemos conocer el n´umero de ´estas sin m´as que teclear “flops”. Para el sistema cuadrado
x + 2y = 3
3x − 4y = −1 comparamos el n´umero de operaciones:
>>flops(0) >>x=A\b x = 1.0000 1.0000 >>flops ans = 33 >>flops(0) >>x=inv(A)*b x = 1.0000 1.0000 >>flops ans = 44
Se observa que, incluso para un sistema con dos ecuaciones y dos inc´ognitas, el n´umero de operaciones es mucho mayor si utilizamos para resolver el sistema la orden “inv(A)∗b”.
Dentro de los ejercicios que se acompa˜nan al final se propone la construcci´on de una funci´on que nos permita resolver un S.E.L. cuadrado por el m´etodo de Cramer. Ser´ıa conve-niente que el lector comparase con algunos ejemplos el n´umero de operaciones necesario para la resoluci´on del sistema utilizando el m´etodo de Cramer y el algoritmo divisi´on izquierda.
32 CAP´ITULO 3. SISTEMAS DE ECUACIONES LINEALES Y DESCOMPOSICIONES
Para la evaluaci´on de tiempos de c´alculo, tenemos varias posibilidades. Las funciones “tic” y “toc” nos proporcionan conjuntamente el tiempo de c´alculo de cualquier expresi´on MATLABsin m´as que teclear
>>tic
>>expresiones >>toc
La funci´on “cputime” nos propociona el tiempo en segundos usado por MATLAB desde el instante en que entramos en el programa. De esta forma podemos calcular el tiempo de c´alculo de cualquier expresi´on realizando las siguientes instrucciones:
>>t1=cputime >>expresiones >>t2=cputime-t1
Para comparar los tiempos de c´alculo tambi´en podemos hacer uso de los comandos “clock” y “etime”. El primero de ellos nos muestra un vector fila de seis componentes en el que se puede obeservar el a˜no, mes, d´ıa, hora, minutos y segundos que marca el reloj de nuestro orde-nador. La orden “etime(t2,t1)” nos proporciona el tiempo, en segundos, que han transcurrido entre dos vectores de tiempo “t1” y “t2”.
Creamos una matriz y un vector (de grandes dimesiones2) formados por n´umeros aleato-rios, comprendidos entre cero y uno, con ayuda de la funci´on “rand(m,n)”:
>>A=rand(30);b=rand(30,1);
y resolvemos el sistema Ax = b mediante la divisi´on izquierda \ y mediante la inversa “inv(A)”: >>t1=clock;x=A\b;etime(clock,t1) ans = 0.5167 >>t1=clock;x=inv(A)*b;etime(clock,t1) ans = 1.0333
Se comprueba que la resoluci´on del sistema mediante la orden “inv(A)∗b” necesita mayor tiempo de c´alculo que la divisi´on izquierda (de hecho, casi el doble de tiempo).
2Hacemos esto, pues la diferencia entre los tiempos de c´alculo de los dos m´etodos para S.E.L. peque˜nos es
3.2. DESCOMPOSICIONES 33
3.2
Descomposiciones
3.2.1
Factorizaci´
on LU.
Dada una matriz A “[L,U]=lu(A)” realiza la descomposici´on LU (LR) de la matriz cuadrada A. Esta descomposici´on siempre se realiza siguiendo el m´etodo de Gauss con estrategia de pivote parcial, por lo cual, aunque U es triangular superior, L en la mayor´ıa de los casos no es triangular inferior. >> A=[3 4 6 8;1 0 7 20;-3 -2 8 0] A = 3 4 6 8 1 0 7 20 -3 -2 8 0 >> A=A(1:3,1:3) A = 3 4 6 1 0 7 -3 -2 8 >> [L,U]=lu(A) L = 1.0000 0 0 0.3333 -0.6667 1.0000 -1.0000 1.0000 0 U = 3.0000 4.0000 6.0000 0 2.0000 14.0000 0 0 14.3333
Sin embargo, introduciendo la orden “[L,U,P]=lu(A)”es posible conocer los intercambios de filas, debidos al pivoteo parcial, que ha sufrido la matriz A. En este caso L s´ı es triangular inferior con unos en la diagonal y P es la matriz de permutaci´on que nos da los intercambios de filas. Es decir, P A = LU . Compru´ebese
>> [L,U,P]=lu(A) L = 1.0000 0 0 -1.0000 1.0000 0 0.3333 -0.6667 1.0000 U = 3.0000 4.0000 6.0000 0 2.0000 14.0000
34 CAP´ITULO 3. SISTEMAS DE ECUACIONES LINEALES Y DESCOMPOSICIONES 0 0 14.3333 P = 1 0 0 0 0 1 0 1 0
Vemos que la funci´on “lu” posee una caracter´ıstica particular: la funci´on puede ser llama-da con distinto n´umero de argumentos de salida seg´un nuestra finalidad. Esta carater´ıstica no es privilegio exclusivo de la funci´on “lu”, sino muchas otras funciones de MATLAB, como veremos m´as adelante, tambi´en presentan esta particularidad.
3.2.2
Descomposici´
on de Cholesky
Si A es una matriz sim´etrica (herm´ıtica) definida positiva la descomposici´on de Cholesky de A se realiza con la funci´on “chol(A)”. Se obtiene una matriz R triangular superior con elementos diagonales estrictamente positivos tal que A = RtR.
>>S=[2 -1 0;-1 2 -1;0 -1 2] S = 2 -1 0 -1 2 -1 0 -1 2 >>chol(S) ans = 1.4142 -0.7071 0 0 1.2247 -0.8165 0 0 1.1547
N´otese que se obtiene un mensaje de error si la matriz no es definida positiva: >>T=[2 -1 0;-1 2 0;-1 -1 -1] T = 2 -1 0 -1 2 0 -1 -1 -1 >>chol(T)
??? Error using ==> chol
Matrix must be positive definite.
No obstante la funci´on “chol” con dos argumentos de salida nunca nos proporciona men-saje de error. Si escribimos [R, p] =chol(A) obtemos las siguientes respuestas:
• Si A es definida positiva, entonces p = 0 y R contiene la descomposici´on de Cholesky de A.
3.2. DESCOMPOSICIONES 35
• Si A no es definida positiva, entonces p es un n´umero entero estrictamente positivo y R una matriz triangular superior con elementos diagonales estrictamente positivos de orden q = p − 1 tal que R0∗ R = A(1 : q, 1 : q). Es decir, el comando “chol” con dos argumentos de salida nos proporciona la descomposici´on de Cholesky de la mayor submatriz principal de A que es definida positiva (y, salvo una unidad, el orden de ´esta). >>[R,p]=chol(T) R= 1.4142 -0.7071 0 1.2247 p= 3
Naturalmente, si ninguna submatriz principal de A es definida positiva R tendr´a como valor la matriz vacia (matriz que no contiene elementos) y p ser´a igual a uno.
>>M=[-2 1;2 3]; >>[s,f]=chol(M) s= [ ] f= 1
3.2.3
Factorizacion
QR
La factorizaci´on QR de una matriz A, no necesariamente cuadrada, puede realizarse medi-ante la orden “[Q,R]=qr(A)”; Q ser´a entonces una matriz ortogonal (o unitaria en el caso complejo) y R una matriz triangular superior del mismo tipo que A, tales que A = QR. Tal descomposici´on se lleva a efecto mediante transformaciones de Householder y como se puede observar en el siguiente ejemplo los elementos diagonales de R no tienen porque ser positivos. (Se realiza la descomposici´on de esta forma por cuestiones de estabilidad en el m´etodo). >> M=[4 6 -2 7;2 4 10 -1;-12 4 -3 0]; >> [Q,R]=qr(M) Q = -0.3123 -0.7840 0.5365 -0.1562 -0.5147 -0.8430 0.9370 -0.3471 0.0383 R = -12.8062 1.2494 -3.7482 -2.0303 0 -8.1510 -2.5375 -4.9732 0 0 -9.6183 4.5984
36 CAP´ITULO 3. SISTEMAS DE ECUACIONES LINEALES Y DESCOMPOSICIONES >> Q’*Q ans = 1.0000 -0.0000 -0.0000 -0.0000 1.0000 -0.0000 -0.0000 -0.0000 1.0000
De la misma forma que la funci´on “lu”, la funci´on “qr” tambi´en puede ser ejecutada con tres argumentos de salida: la orden “[Q,R,P]=qr(A)” proporciona una matriz ortogonal (unitaria) Q, una matriz R triangular superior con elementos diagonales decrecientes y una matriz C de permutaci´on de columnas, tales que AC = QR.
>>[Q,R,MPC]=qr(M) Q = -0.3123 0.3187 0.8949 -0.1562 -0.9464 0.2826 0.9370 -0.0515 0.3454 R = -12.8062 -3.7482 1.2494 -2.0303 0 -9.9474 -2.0792 3.1777 0 0 7.8814 5.9817 MPC = 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1
Ponemos un ejemplo en el que se observa los elementos nulos en la diagonal de R. >>MM=[1 1 2;2 0 2;-1 3 2;1 4 5] MM = 1 1 2 2 0 2 -1 3 2 1 4 5 >>[Q,R]=qr(MM) Q = -0.3780 0.1416 0.6928 -0.5976 -0.7559 -0.1133 -0.5978 -0.2417 0.3780 0.6516 -0.3863 -0.5323 -0.3780 0.7366 0.1165 0.5487 R = -2.6458 -0.7559 -3.4017 0 5.0427 5.0427
3.2. DESCOMPOSICIONES 37
0 0 -0.0000
0 0 0
Hacemos notar que, una vez conocida R, el c´alculo del rango de A es inmediato, pues Q es no singular. Para el ejemplo anterior R tiene dos filas nulas y por consiguiente el rango de MM es dos. En efecto,
>>rank(MM) ans =
2
3.2.4
Ortonormalizaci´
on y espacio nulo
Gracias a la descomposici´on QR que se obtiene mediante MATLAB podemos calcular una base ortonormal del espacio columna y una base ortonormal del espacio nulo (n´ucleo) de una matriz A.
La funci´on que permite obtener una base ortonormal del espacio columna de A es “or-th(A)” y una base ortonormal del espacio nulo nos la proporciona la funci´on “null(A)”. >>Or=orth(M) Or = 0.3123 -0.3187 0.8949 0.1562 0.9464 0.2826 -0.9370 0.0515 0.3454 >> nulo=null(M) nulo = -0.2672 -0.5444 0.3430 0.7173
Comprobamos que son bases ortonormales calculando OrtOr y nulotnulo.
Or’*Or ans = 1.0000 -0.0000 0.0000 -0.0000 1.0000 -0.0000 0.0000 -0.0000 1.0000 nulo’*nulo ans = 1.0000
38 CAP´ITULO 3. SISTEMAS DE ECUACIONES LINEALES Y DESCOMPOSICIONES
N´otese que con ayuda de “null” y \ se pueden resolver sistemas de ecuaciones compatibles indeterminados. Por ejemplo, el sistema compatible indeterminado
x + 2y = 3 2x + 4y = 6 puede resolverse siguiendo los pasos:
1. Si es necesario, se a˜nade un fila nula a la matriz ampliada para conseguir un sistema no cuadrado.
2. Se calcula una soluci´on particular del mismo.
3. Calculamos una base del espacio nulo de la matriz de coeficientes. Estos tres pasos se realizan en MATLAB del siguiente modo: >>A=[1 2;2 4],b=[3 6]’ A = 1 2 2 4 b = 3 6 >>A(3,:)=[0 0],b(3)=0 A = 1 2 2 4 0 0 b = 3 6 0 >>x=A\b
Warning: Rank deficient, rank = 1 tol = 2.9790e-15 x = 0 1.5000 >>nulo=null(A) nulo = -0.8944 0.4472
3.3. NORMAS Y N ´UMERO DE CONDICI ´ON 39
De este forma, todas las soluciones del sistema anterior vienen dadas por
x = −0.8944α
y = 1.5 + 0.4472α con α ∈ R
3.3
Normas y n´
umero de condici´
on
3.3.1
Normas vectoriales y matriciales
Si A es una matriz cuadrada “norm(A,p)” (siendo p = 1, 2, inf) proporciona la norma p de A. >> V=[1 4;8 -1]; >> N2=norm(V,2) N2 = 8.0828 >> N1=norm(V,1) N1 = 9 >> Ninf=norm(V,inf) Ninf = 9
Puesto que en la mayor´ıa de los casos se trabaja con la norma eucl´ıdea (i.e., en norma 2), por defecto “norm(A)” nos da el mismo valor que “norm(A,2)”. (De nuevo la funci´on “norm” puede tener distinto n´umero de argumentos de entrada)
Para vectores “norm(v,p)” calcula la norma p del vector v y en este caso p puede ser cualquier real del interalo [1, +∞].
>> w=[2 -4 6]; >> norm(w,3) ans =
6.6039
3.3.2
N´
umero de condici´
on y rango
El n´umero de condici´on de una matriz nos proporciona el valor m´aximo de amplificaci´on de los errores relativos en la resoluci´on de un S.E.L. sometido a perturbaciones. Si el n´umero de condici´on es mucho mayor que uno, la matriz est´a mal condicionada y no debemos fiarnos de la soluci´on del sistema; si por el contrario es pr´oximo a uno, la matriz se dice bien condicionada y los posibles errores relativos en la soluci´on est´an acotados por los errores relativos cometidos en los datos del sistema (matriz y t´ermino independiente).
El n´umero de condici´on de una matriz A se calcula mediante MATLAB con la funci´on “cond(A)”. Para la matriz de Hilbert anterior
40 CAP´ITULO 3. SISTEMAS DE ECUACIONES LINEALES Y DESCOMPOSICIONES
>> cond(H) ans =
4.7661e+005
Parece, entonces, necesario obtener el n´umero de condici´on de la matriz de coeficientes de un sistema de ecuaciones lineales antes de resolverlo. Pero afortunadamente, MATLAB a medida que resuelve el sistema calcula, mediante el comando “rcond(A)”, una aproximaci´on del inverso del n´umero de condici´on de la matriz de coeficientes A, d´andonos un aviso para que tengamos en cuenta que si “rcond(A)” es peque˜no, hay posibilidad de un gran error en la soluci´on si hemos cometido un peque˜no error en los datos del sistema. Para la matriz “H=hilb(5)”, 1/cond(A) = 2.0982e − 006 y mediante la funci´on “rcond” se obtiene:
>> rcond(H) ans =
1.4407e-006
Ponemos de manifiesto a continuaci´on la ventaja de la informaci´on complementaria de MATLABcuando resolvemos un S.E.L. Por ejemplo, para la resoluci´on del sistema
x + 2y + 3z = 1 4x + 5y + 6z = 0 7x + 8y + 9z = 0 mediante MATLAB, se efect´uan las siguientes instrucciones: >>A=[1 2 3;4 5 6;7 8 9] A = 1 2 3 4 5 6 7 8 9 >>b=[1 0 0]’ b = 1 0 0 >>x=A\b
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 2.937385e-18 x=
1.0e+15 * 3.1522 -6.3044 3.1522
3.3. NORMAS Y N ´UMERO DE CONDICI ´ON 41
Apreciamos en la obtenci´on de la resoluci´on del sistema un mensaje de error que nos informa que la matriz de coeficientes puede ser casi singular (estar mal condicionada). De hecho la soluci´on que hemos obtenido no es soluci´on del sistema, basta observar que Ax 6= b. En efecto, >>A*x ans = 0.5000 -1.0000 -2.5000
De hecho, la matriz A no es casi singular es, sin lugar a dudas, singular : >>det(A)
ans = 0
Esto no impide que MATLAB “obtenga” la inversa de esta matriz: >>inv(A)
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 2.937385e-18 ans =
1.0e+16 *
0.3152 -0.6304 0.3152
-0.6304 1.2609 -0.6304
0.3152 -0.6304 0.3152
Como se observa MATLAB nos ha dado el mismo mensaje anterior y adem´as ha “cal-culado” la inversa de A. Evidentemente esta matriz no es la inversa de A, pues A ∗ ans no da como resultado la matriz identidad:
>>A*ans ans = 1.0e+17 * -0.0901 -0.1801 -0.2702 -0.3603 -0.7206 -1.0809 -0.6305 -1.2610 -1.8915
Adem´as, como puede comprobarse f´acilmente, nuestro sistema es INCOMPATIBLE. Advertencia: Aunque MATLAB nos da informaci´on adicional (como la mostrada en el ejemplo anterior) cuando resolvemos un S.E.L. o calculamos la inversa de una matriz, se han detectado, en algunas versiones de MATLAB (en distintos entornos de trabajo), y para el S.E.L. anterior que no aparece ning´un mensaje de precauci´on a la hora de resolver el sistema
42 CAP´ITULO 3. SISTEMAS DE ECUACIONES LINEALES Y DESCOMPOSICIONES
o calcular la inversa de la matriz de coeficientes. Parece l´ogico, entonces, calcular “cond(A)” (o “rcond(A)”) antes de resolver un sistema y tomar la decisi´on de resolverlo una vez conocido el n´umero de condici´on de la matriz de coeficientes.
El rango de una matriz se calcula mediante MATLAB con la funci´on “rank(A)”. Por ejemplo, para la matriz de coeficientes y la matriz ampliada del sistema anterior se obtiene: >>rank(A) ans = 2 >>rank([A b]) ans = 3
y por consiguiente se observa que el sistema anterior es incompatible. Para la matriz de Hilbert anterior el rango es
>> rank(H) ans =
5
En realidad, el rango de A se calcula como el n´umero de valores singulares (ver m´as adelante) casi no nulos de ´esta. Esto permite utilizar la funci´on “rank” con dos argumentos de entrada: “rank(A,tol)” que considera nulos los valores singulares menores que tol. >> rank(H,.001)
ans = 3
Si hemos introducido un s´olo argumento de entrada para “rank” el valor de tol viene dado por defecto como tol=max(size(A))∗norm(A)∗eps.
Finalizamos esta secci´on proponiendo al lector que resuelva los siguientes sistemas de ecuaciones, que se encuentran propuestos en el libro de G. Strang, Algebra Lineal Aplicada, y que compare los resultados obtenidos:
[A] ( x + y = 2 x + 1.0001y = 2 [B] ( x + y = 2 x + 1.0001y = 2.0001
Cap´ıtulo 4
Autovalores y polinomios
4.1
Autovalores y autovectores
Los autovectores y autovalores (complejos) de una matriz cuadrada pueden calcularse con-juntamente por medio de la funci´on “eig”:
>>V=[1 4;8 -1]; V = 1 4 8 -1 >>[X,D]=eig(V) X = 0.6446 -0.5101 0.7645 0.8601 D = 5.7446 0 0 -5.7446
As´ı, se obtiene una matriz diagonal D cuya diagonal contiene los autovalores de la matriz V y una matriz X que verifica la condici´on: V X = XD. Por tanto, las columnas de X son autovectores de V .
En el siguiente ejemplo comprobamos que las columnas de X no tienen por que ser linealmente independientes (t´enganse en cuenta los errores de redondeo).
>>N=[1 1;0 1]; >>[X,D]=eig(N) X = 1.0000 -1.0000 0 0.0000 D = 1 0 43
44 CAP´ITULO 4. AUTOVALORES Y POLINOMIOS
0 1
>>rank(X) ans =
1
La funci´on “eig(A)” puede utilizar uno o dos argumentos de salida. En el caso de utilizar dos argumentos se obtienen los autovectores y los autovalores como se ha descrito anterior-mente. Cuando utilizamos un ´unico argumento de salida obtenemos un vector columna que contiene los autovalores (puede que repetidos) de la matriz A.
>>aut=eig(V) aut = 5.7446 -5.7446 >>VV=[1 2;-2 1] VV = 1 2 -2 1 >>autVV=eig(VV) autVV = 1.0000 + 2.0000i 1.0000 - 2.0000i
Estrechamente relacionadas con el c´alculo de autovalores tenemos la funciones “hess(A)” y “schur(A)” que calculan la forma de Hessenberg y la forma de Schur (superior) de A, respectivamente. Para la matriz de Hilbert de orden cinco y la matriz V anterior se obtiene:
>>hess(H) ans = 0.0001 0.0002 0 0 0 0.0002 0.0079 0.0143 0 0 0 0.0143 0.2556 -0.3302 0 0 0 -0.3302 1.4126 -0.3222 0 0 0 -0.3222 0.1111 >>schur(V) ans = 5.7446 -4.0000 -0.0000 -5.7446
4.2. VALORES SINGULARES Y PSEUDOINVERSA 45
4.2
Valores singulares y pseudoinversa
La descomposici´on en valores singulares de una matriz A cualquiera se efect´ua por medio de la funci´on “svd”. De esta forma, la orden “[U,S,V]=svd(A)” proporciona una matriz diagonal S, del mismo tipo que A, y dos matrices ortogonales (unitarias) U y V tales que A = U SVt. Los elementos de la diagonal de S son por tanto los valores singulares de la matriz A, i.e., la ra´ız cuadrada1 de los autovalores de la matriz sim´etrica (herm´ıtica) semidefinida positiva AtA (A∗A). >>A=[1 2;-1 1;0 3] A = 1 2 -1 1 0 3 >>[U,S,V]=svd(A) U = 0.5531 0.6006 -0.5774 0.2436 -0.7793 -0.5774 0.7967 -0.1787 0.5774 S = 3.7527 0 0 1.3846 0 0 V = 0.0825 0.9966 0.9966 -0.0825
Podemos comprobar que la ra´ız cuadrada de los autovalores de AtA son los valores
sin-gulares de A:
>>sqrt(eig(A’*A)) ans =
1.3846 3.7527
V´ease que la funci´on “sqrt” ha actuado sobre cada uno de los elementos del vector columna formado por los autovalores de AtA.
Naturalmente la descomposici´on en valores singulares tambi´en es posible para matrices con elementos complejos:
>>C=[2+i -i;3 3+2*i]; >>[U,S,V]=svd(C)
46 CAP´ITULO 4. AUTOVALORES Y POLINOMIOS U = 0.2292 + 0.0156i -0.7696 - 0.5958i 0.9710 + 0.0660i 0.1817 + 0.1406i S = 4.7900 0 0 2.2485 V = 0.7071 -0.7071 0.6325 - 0.3162i 0.6325 - 0.3162i
La funci´on “svd” permite la posibilidad de incluir varios argumentos de salidas. En concreto, podemos utilizar uno o tres argumentos de salida. En el caso de la utilizaci´on de “svd” con tres argumentos se obtienen las tres matrices anteriores y cuando se utiliza un solo argumento de salida, se almacenan en ´el, los valores singulares formando un vector columna. >>MN=[1 2 3;4 5 6;5 7 9]’ MN = 1 4 5 2 5 7 3 6 9 >>vs=svd(MN) vs = 15.6633 0.8126 0.0000
N´otese que uno de los valores singulares de MN es nulo; esto sucede porque MN no es de rango m´aximo.
Relacionada con el algoritmo de c´alculo de los valores singulares de una matriz A se encuentra la orden “pinv(A)’ que calcula la pseudoinversa (de Moore-Penrose) de A. Recor-damos que la pseudoinversa de una matriz A de orden m × n (denotada por A+) puede ser
calculada, una vez obtenida la descomposici´on en valores singulares de A, como A+= V S+U∗ donde S+ es la matriz diagonal de orden n × m cuyos elementos diagonales no nulos son los inversos de los elementos no nulos de S. Recu´erdese adem´as, que A+A = I y que la
pseu-doinversa de A coincide con la inversa de A si ´esta es cuadrada y regular. >>ps=pinv(A) ps = 0.4444 -0.5556 -0.1111 0.1111 0.1111 0.2222 >>ps*A ans = 1.0000 -0.0000
4.3. TRATAMIENTO DE POLINOMIOS 47 0.0000 1.0000 >>AA=[1 2;5 1]; >>inv(AA) ans = -0.1111 0.2222 0.5556 -0.1111 >>pinv(AA) ans = -0.1111 0.2222 0.5556 -0.1111
4.3
Tratamiento de polinomios
El tratamiento que MATLAB realiza con los polinomios en una indeterminada es muy simple: s´olo hace falta introducir los coeficientes del polinomio (en orden decreciente de potencias) en un vector fila2. Aquellos resultados que nos muestren como salidas polinomios tambi´en ser´an recogidos de esta forma.
As´ı, el polinomio p(x) = 2x3− 3x + 7 es representado por MATLAB como
>>p=[2 0 -3 7] p =
2 0 -3 7
4.3.1
Polinomio caracter´ıstico de una matriz cuadrada
La instrucci´on “poly(A)” nos proporciona los coeficientes del polinomio carater´ıstico (pA(λ) =
det(λI − A)) de una matriz cuadrada A. >>M=[4 6 -2 ;2 4 10;-12 4 -3] M = 4 6 -2 2 4 10 -12 4 -3 >>pcM=poly(M) pcM = 1.0e+03 * 0.0010 -0.0050 -0.0840 1.0040 >>pcM=rats(poly(M)) pcM = 1 -5 -84 1004
48 CAP´ITULO 4. AUTOVALORES Y POLINOMIOS
Luego el polinomio caracter´ıstico de M es
pC(λ) = λ3− 5λ2− 84λ + 1004
y podemos observar que el determinante de M es, salvo signo, el t´ermino independiente del polinomio carater´ıstico de M y que el coeficiente de λ2, salvo signo, nos lo proporciona la
traza de M . >>det(M) ans = -1004 >>trace(M) ans = 5
4.3.2
Operaciones con polinomios
Puesto que los polinomios se recogen en vectores filas, la suma y diferencia de dos polinomios se realiza con las operaciones suma y diferencia (+ y −) de matrices. Pero, t´engase en cuenta que para sumar o restar matrices ´estas deben tener la misma dimensi´on y por consiguiente, podemos realizar suma o diferencia de polinomios, siempre y cuando, ´estos tengan el mismo grado. Por ejemplo si p(x) = 3x3+ 2x2− x + 1 y q(x) = −7x3+ 3x2+ 2x − 15 la suma y diferencia de ambos se realiza como sigue:
>>p=[3 2 -1 1],q=[-7 3 2 -15] p = 3 2 -1 1 q = -7 3 2 -15 >>s=p+q s = -4 5 1 -14 >>d=p-q d = 10 -1 -3 16
En cambio si q(x) = 3x2+ 2x − 15 la suma de ambos polinomios no puede realizarse de forma tan simple:
>>q=[3 2 -15] q =
3 2 -15
>>p+q
??? Error using ==> +
4.3. TRATAMIENTO DE POLINOMIOS 49
El lector deber´ıa pensar una estrategia que permita sumar o restar polinomios de grados diferentes. La multiplicaci´on y divisi´on de los polinomios p y q se llevan a cabo con las funciones “conv(p,q)” y “[c,r]=deconv(p,q)”. Para la funci´on “deconv” se entiende que en c se guarda el cociente de la divisi´on de p entre q y en r el resto de la misma.
>>p=[1 -2 1],q=[1 -1 1] p = 1 -2 1 q = 1 -1 1 >>conv(p,q) ans = 1 -3 4 -3 1
Por el c´alculo anterior se obtiene que
(x2− 2x + 1)(x2− x + 1) = x4− 3x3+ 4x2− 3x + 1
El cociente y el resto de la divisi´on x
5 − 2x4− x3+ 7x2− 6x + 2 x2− 2x + 1 se calculan mediante: >>p=[1 -2 -1 7 -6 2] p = 1 -2 -1 7 -6 2 >>q=[1 -2 1] q = 1 -2 1 >>[c,r]=deconv(p,q) c = 1 0 -2 3 r = 0 0 0 0 2 -1 Es decir, c(x) = x3− 2x + 3 y r(x) = 2x − 1. Compru´ebese.
Incluimos en esta secci´on una funci´on que nos parece bastante interesante. Se trata de la funci´on “residue” que nos proporciona, a grandes rasgos, la descomposici´on en fracciones simples de una funci´on racional cuyo denominador posee ra´ıces reales simples. De esta forma, la instrucci´on “[a,r,k]=residue(p,q)” obtiene la descomposici´on
P (x) Q(x) = a1 x − r1 + · · · + an x − rn + k(x)
y almacena las constantes ai en el vector a, las ra´ıces ri en el vector r y el polinomio k(x) en
el vector fila k.
50 CAP´ITULO 4. AUTOVALORES Y POLINOMIOS >>[a,r,k]=residue([1 0 0],[1 0 -1]) a = -0.5000 0.5000 r = -1 1 k = 1 Es decir, x2 x2− 1 = −0.5 x + 1+ 0.5 x − 1+ 1
La funci´on “residue” act´ua en MATLAB como su propia inversa, pues si se utiliza con tres argumentos de entrada y dos de salida, es decir, de la forma “[p,q]=residue(a,r,k)”, nos proporciona la funci´on racional que tiene como descomposici´on en fracciones simples los vectores a, r y k. >>[p,q]=residue(a,r,k) p = 1.0000 0 0 q = 1 0 -1
4.3.3
Ra´ıces de polinomios
Si el polinomio p(x) ha sido introducido en un vector p de la forma descrita anteriormente, las ra´ıces (complejas) de p(x) pueden ser calculadas con la orden “roots(p)”. Las ra´ıces de p, que pueden estar repetidas, se almacenar´an en un vector columna.
Por ejemplo, las soluciones de la ecuaci´on x2− 1 = 0 se obtiene f´acilmente:
>>p=[1 0 -1] p = 1 0 -1 >>rp=roots(p) rp = -1 1
Si el polinomio posee ra´ıces complejas MATLAB tambi´en nos las proporciona. Las ra´ıces de q(x) = x3− 2x2+ x − 2 son:
4.3. TRATAMIENTO DE POLINOMIOS 51 >>q=[1 -2 1 -2] q = 1 -2 1 -2 >>rq=roots(q) rq = 2.0000 -0.0000 + 1.0000i -0.0000 - 1.0000i
Podemos evaluar el valor de un polinomio p en un cierto punto x ∈ R con la ayuda de la funci´on “polyval(p,x)”. De esta forma, por ejemplo, podemos comprobar que p y q se anulan (salvo errores de redondeo) en las componentes de rp y rq, respectivamente:
>>polyval(p,rp(1)),polyval(p,rp(2)) ans = 0 ans = 0 >>polyval(q,rq(1)),polyval(q,rq(2)),polyval(q,rq(3)) ans = -6.6613e-15 ans = 0+ 2.2204e-16i ans = 0- 2.2204e-16i
Puede tambi´en evaluarse el valor del polinomio en una serie de puntos, sin m´as que introducir estos puntos en un vector x y teclear la orden anterior. Los valores de r(x) = x2− x + 1 para x = 1, x = sqrt(2) y x = −1/2 son >>r=[1 -1 1] r = 1 -1 1 >>x=[1 sqrt(2) -1/2] x = 1.0000 1.4142 -0.5000 >>polyval(r,x) ans = 1.0000 1.5858 1.7500
El algoritmo que MATLAB utiliza para calcular las ra´ıces de un polinomio est´a basado en la funci´on “compan(p)” que determina la matriz compa˜nera del polinomio p; esto es, la