Escolar Documentos
Profissional Documentos
Cultura Documentos
Paco Arandiga
ndice general
1. Algoritmos bsicos en MATLAB 1.1. Programacin en MATLAB . . . . . . . . . . . . . . . . . . . . . . . 1.1.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.2. Introduccin de matrices . . . . . . . . . . . . . . . . . . . . 1.1.3. Operaciones con matrices, operaciones a coordenadas . . . . 1.1.4. Declaraciones, expresiones y variables; almacenamiento de una sesin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.5. Formato de salida . . . . . . . . . . . . . . . . . . . . . . . . 1.1.6. Funciones en MATLAB . . . . . . . . . . . . . . . . . . . . 1.1.7. For, while, if y relaciones . . . . . . . . . . . . . . . . . . 1.1.8. Submatrices y notacin de dos puntos . . . . . . . . . . . . . 1.1.9. Comparacin de la eciencia de algoritmos: etime, cputime, tic, toc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.10. Cadenas de texto, mensajes de error, input . . . . . . . . . . . 1.1.11. Archivos .m . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.12. Grcos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.13. Consulta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Clculo Matricial Bsico . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1. Normas de vectores . . . . . . . . . . . . . . . . . . . . . . . 1.2.2. Tipos de matrices . . . . . . . . . . . . . . . . . . . . . . . 1.2.3. Matrices simtricas. . . . . . . . . . . . . . . . . . . . . . . 1.3. Solucin ecuaciones no lineales . . . . . . . . . . . . . . . . . . . . 1.3.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.2. Mtodos Iterativos . . . . . . . . . . . . . . . . . . . . . . . 1.3.3. Mtodo de la Biseccin . . . . . . . . . . . . . . . . . . . . . 1.3.4. Mtodo de rgula falsi . . . . . . . . . . . . . . . . . . . . . 1.3.5. Mtodo de Newton-Raphson . . . . . . . . . . . . . . . . . . 1.3.6. Mtodo de la secante . . . . . . . . . . . . . . . . . . . . . . 1.3.7. Races mltiples . . . . . . . . . . . . . . . . . . . . . . . . 1.3.8. Problemas resueltos . . . . . . . . . . . . . . . . . . . . . . 1.3.9. Problemas propuestos . . . . . . . . . . . . . . . . . . . . . 2. Latex 1 3 4 4 4 5 6 8 9 11 13 15 15 16 20 22 32 32 34 37 38 38 38 41 44 46 50 52 52 56 58
NDICE GENERAL
3. Clcul Simbolic 3.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Deniendo variables simblicas . . . . . . . . . . . . . . 3.3. Expresiones y ecuaciones simblicas . . . . . . . . . . . . 3.3.1. Substituciones . . . . . . . . . . . . . . . . . . . 3.3.2. Qu variables simblicas hay en F? . . . . . . . . 3.4. Resolucin de ecuaciones . . . . . . . . . . . . . . . . . . 3.5. La funcin inline . . . . . . . . . . . . . . . . . . . . . . 3.5.1. Operadores relacionales y lgicos . . . . . . . . . 3.5.2. La funcin inline . . . . . . . . . . . . . . . . . . 3.6. Dominios, lmites y continuidad . . . . . . . . . . . . . . 3.6.1. Clculo de lmites: Lmites laterales. . . . . . . . . 3.6.2. Continuidad de funciones . . . . . . . . . . . . . 3.7. Simplicadores . . . . . . . . . . . . . . . . . . . . . . . 3.8. Clculo de derivadas. . . . . . . . . . . . . . . . . . . . . 3.9. Aplicaciones de la derivada: Mximos-mnimos-Puntos de Optimizacin. . . . . . . . . . . . . . . . . . . . . . . . . 3.10. Clculo integral e integracin numrica . . . . . . . . . .
2 59 60 61 62 63 64 65 67 68 69 72 74 76 82 85 90 93
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inexin. . . . . . . . . . . . .
1.1.
Programacin en MATLAB
1.1.1. Introduccin
MATLAB es un sistema interactivo basado en matrices para clculos cientcos y de ingeniera. Se pueden resolver problemas numricos relativamente complejos sin escribir un programa en realidad. El nombre MATLAB es una abreviatura para MATrix LABoratory. El propsito de estas notas es ayudar en la iniciacin a MATLAB. La mejor forma de utilizarlas es poner manos a la obra. Se aconseja, en general, trabajar en el ordenador a la vez que se leen las notas, as como a experimentar libremente con ejemplos. Se puede utilizar la ayuda de la instruccin help para una informacin ms detallada. Despus de entrar en MATLAB, la instruccin help mostrar una lista de funciones para las que se puede obtener ayuda mientras se est trabajando; la instruccin help nombre_de_funcin nos dar informacin sobre una funcin especca. As, la instruccin help eig, nos dar informacin sobre la funcin eig, que calcula los autovalores de una matriz. Se pueden ver algunas de las capacidades de MATLAB usando la instruccin demo. El alcance y la potencia de MATLAB van ms all de lo que podemos ver en estas notas. En algn momento puede desear una informacin ms detallada. Es el momento de consultar algun manual ms avanzado.
3 6 9 ]
crea la matriz 33 que se espera y la asigna a una variable A. Intntelo. Los elementos en una la de una matriz pueden separarse tanto por comas como por espacios en blanco. Cuando alguno de los nmeros se escribe en forma exponencial (por ejemplo 2.34e-9), deben evitarse los espacios en blanco. La escritura de una matriz grande debe hacerse preferentemente en un archivo .m, donde es ms sencillo corregir errores (ver secciones 1.1.8 y 1.1.10)). Las funciones internas rand, magic, y hilb, por ejemplo, proporcionan una forma sencilla para crear matrices con las que experimentar. La instruccin rand(n), resp. rand(m,n), crear una matriz n n, resp. m n, con entradas aleatoriamente generadas, distribuidas uniformemente entre 0 y 1. magic(n) crear una matriz cuadrada mgica (las las y las columnas suman la misma cantidad) con entradas enteras; hilb(n) crear la matriz de Hilbert de orden n, la reina de las matrices mal condicionadas. m y n, por supuesto, denotan enteros positivos. Tambin se pueden crear matrices utilizando bucles for (ver seccin 1.1.6). Intntelo. Las entradas individuales de una matriz o de un vector se pueden obtener poniendo los ndices entre parntesis de la forma usual. Por ejemplo, A(2, 3) denota la entrada en la segunda la y tercera columna de la matriz A y x(3) denota la tercera coordenada del vector x. Intntelo. Slo se pueden usar como ndices de vectores y de matrices enteros positivos.
La divisin matricial merece un comentario especial. Si A es una matriz invertible y b es una columna, resp. la, compatible, entonces >> x=A\b es la solucin de A x = b y, resp., >> x=A/b es la solucin de x A = b. En la divisin izquierda, si A es cuadrada, se factoriza utilizando eliminacin gaussiana. Con los factores se resuelve A x = b. Si la matriz A no es cuadrada, se factoriza utilizando la ortogonalizacin de Householder con pivoteo de columnas. Con los factores se resuelve el sistema indeterminado o sobredeterminado en el sentido de los mnimos cuadrados. La divisin derecha se dene a partir de la izquierda por b/A = (A \b ) . Operaciones a coordenadas. Las operaciones de adicin y sustraccin operan intrnsecamente a coordenadas pero las otras operaciones matriciales dadas antes no: Son operaciones matriciales. Es importante observar que para estas otras operaciones, , , \, y /, puede hacerse que operen a coordenadas precediendolas de un punto. Por ejemplo, tanto >> [1,2,3,4].*[1,2,3,4] como >> [1,2,3,4].^2 darn >> [1,4,9,16] Intntelo. Esto es particularmente til cuando se utilizan los grcos de MATLAB.
muestra en pantalla, y se asigna a la variable para su posterior uso. Si se omiten la variable y el signo =, se crea una variable llamada ans (por answer) a la que se asigna el resultado de la expresin. Una instruccin termina, normalmente, con el retorno de carro (comando return). Si se desea continuar una expresin en la lnea siguiente, basta escribir tres (o ms) puntos antes del retorno de carro. Si por el contrario, deseamos escribir varias instrucciones en una misma lnea, podemos hacerlo separandolas por comas o puntos y comas. Si el ltimo carcter de una instruccin es un punto y coma el resultado no se mostrar en pantalla, aunque por supuesto se realizar la asignacin. Esto es esencial para evitar prdidas de tiempo al mostrar los resultados intermedios. MATLAB distingue las letras maysculas de las minsculas en los nombres de instrucciones, funciones y variables. As, resolvente no es lo mismo que ReSoLvEnTe. La instruccin who muestra las variables que se encuentran en el espacio de trabajo. Por ejemplo, Con who se lista las variables que tenemos. Per ejemplo, >> who Your variables are: A ans
Para ver el tamao de las variables hemos de escribir whos y aparecer: Name A ans Size 2x2 1x1 Bytes 32 8 Class double double
Cada elemento de una matriz real requiere 8 bytes de memoria. Escribiendo what aparecer M-files in the current directory /home/paco/manual/matlab obj peli plotf1 pn1 plotf2 pn2 prod1 prod2 prod3 prod4 tra trape
afun
esto es, todas *m les (que ya explicaremos ms adelante en que consisten) que tenemos en el directorio en el que estamos treballajando. Hay otros comandos que tambien se pueden ejecutar directamente desde MATLAB como cd, ls, mkdir, etc. Para eliminar una variable de la memoria se utiliza la instruccin clear nombre_variable. Si se escribe slo clear se borran todas las variables no permanentes. La variable permanente eps (psilon) da la precisin de la mquinaalrededor de 1016 en la mayora de ellas. Es til para determinar la tolerancia en procesos iterativos.
Cualquier tipo de clculo, grco, o impresin puede detenerse sin salir del programa con CTRL-C (CTRL-BREAK en PC). Almacenamiento de sesiones. Cuando salimos de MATLAB se pierden todas las variables. Para evitarlo se puede utilizar la instruccin save antes de salir. Esto hace que las variables se almacenen en el archivo de disco matlab.mat. Al acceder de nuevo a MATLAB, se pueden recuperar todas las variables con la instruccin load. Con diary se pueden salvar los datos en un chero que despues se puede editar. Habria que escribir >> diary nom >> . . . >> >>diary off y todo lo que hace entre diary nom y diary off queda arxivado en un chero ASCII llamado nom. Al terminar, se puede editar el archivo como se desee. Con save name podemos salvar datos en un chero binario llamado name.dat. Los datos almacenados aqu pueden ser recuperados con load. Si queremos salvar los datos en formato ASCII lo podemos hacer de la forma siguiente: manera: >> A=rand(4,2); >> save enter.dat A -ascii que crea un chero llamado enter.dat que contiene 3.4119357e-01 5.3407902e-01 7.2711322e-01 3.0929016e-01 8.3849604e-01 5.6807246e-01 3.7041356e-01 7.0273991e-01
Una vez que se ordena un formato, se mantiene hasta que se ordena un cambio. La orden format compact evitar la mayor parte de las lneas en blanco, con lo que se puede mostrar ms informacin en pantalla. Es independiente de las dems instrucciones de formato.
Ejercicio 1.1.1. Calcular A=rand(4,2) y ver como queda en cada uno de los formatos anteriores.
Por ejemplo, zeros(m,n) produce una matriz nula mn, y zeros(n) produce otra cuadrada de orden n; si A es una matriz, entonces zeros(A) produce una matriz de ceros del mismo orden que A. Si x es un vector, diag(x) es la matriz diagonal con x en su diagonal; si A es una matriz cuadrada, diag(A) es un vector formado por la diagonal de A. Qu ser entonces diag(diag(A))? Intntelo. Las matrices se pueden construir por bloques. Por ejemplo, si A es 3 3, entonces >> B = [A, zeros(3,2); zeros(2,3), eye(2)] dar una cierta matriz 5 5. Intntelo. Funciones escalares Algunas funciones de MATLAB operan esencialmente sobre escalares, aunque lo hacen tambin sobre matrices (elemento a elemento). Las funciones ms comunes entre estas son: sin cos tan asin acos atan exp log(natural) rem(resto) abs sqrt sign round f loor ceil
10
Otras funciones de MATLAB operan fundamentalmente sobre vectores (la o columna), aunque tambin pueden operar sobre matrices m n (m 2) haciendolo en este caso columna a columna, produciendo, por tanto, un vector la que contiene el resultado de su aplicacin a cada columna. Para conseguir que acten por las basta usar la traspuesta; por ejemplo, mean(A). Veamos algunas de estas funciones: max min sort sum prod median mean std any all
Por ejemplo, la entrada mxima de un matriz A se obtiene con max(max(A)) en vez de max(A). Intntelo. Funciones matriciales Las funciones matriciales ms tiles de MATLAB son las siguientes: size eig chol svd inv lu qr hess schur rref expm sqrtm poly det norm cond rank tamao autovalores y autovectores factorizacin de Cholesky descomposicin en valores singulares inversa factorizacin LU factorizacin QR forma de Hessenberg descomposicin de Schur forma escalonada reducida por las matriz exponencial matriz raz cuadrada polinomio caracterstico determinante norma 1, norma 2, norma de Frobenius, norma nmero de condicin en la norma 2 rango
Las funciones de MATLAB admiten argumentos de salida simples o mltiples. Por ejemplo, y = eig(A) , o simplemente eig(A) genera un vector columna conteniendo los autovalores de A mientras que [U,D] = eig(A) produce una matriz U cuyas columnas son los autovectores de A y una matriz diagonal D con los autovalores de A en su diagonal. Pruebe.
11
12
if. La forma general de un bucle if simple es if relacin instrucciones end Las instrucciones se ejecutarn slo si la relacin es cierta. Tambin son posibles las ramicaciones mltiples, como se ilustra con >> >> >> >> >> >> >> if n < 0 paridad = 0; elseif rem(n,2) == 0 paridad = 2; else paridad = 1; end
Si slo tenemos dos ramicaciones podemos omitir, desde luego, la porcin correspondiente a elseif. Relaciones. Los operadores relacionales en MATLAB son < > <= >= == = menor que mayor que menor o igual que mayor o igual que igual no igual.
Hagamos notar que se usa = en las asignaciones mientras que para las relaciones se usa ==. Las relaciones pueden conectarse o cuanticarse por los operadores lgicos & | y o no.
Cuando se aplican a escalares, una relacin es realmente el escalar 1 o 0 dependiendo de si la relacin es verdadera o falsa: Ejercicio 1.1.2. Ver los resultados obtenidos con >> 3 < 5, 3 > 5, 3 == 5, 3 == 3 Cuando se aplica a matrices del mismo orden, una relacin entre ellas da lugar a una matriz de ceros y unos, dando el valor de la relacin entre las correspondientes entradas. Ejercicio 1.1.3. Ver el resultado obtenido con >> a = rand(5), b = triu(a), a == b.
13
Cuando se utiliza una relacin entre matrices en un bucle while o if, la relacin se entiende verdadera si cada una de las entradas de la matriz de relacin es no nula. Por tanto, si se quiere ejecutar algo cuando las matrices A y B sean iguales, se puede escribir: if end pero si se desea ejecutar la misma instruccin si A y B son distintas, hay que recurrir a: if end o, ms simplemente, if end Recalcamos que la aparentemente obvia if A ~= B, algo, end A == B algo else any(any(A ~= B)) algo A == B algo
no har lo que deseamos ya que la instruccin slo se ejecutar si todas las entradas de A son distintas de las de B. Las funciones any y all pueden utilizarse de forma creativa para reducir relaciones entre matrices a relaciones entre vectores y escalares. Se requieren dos anys en el ejemplo anterior ya que any es un operador vectorial (ver seccin 1.1.6).
14
mientras que con >> 5:-1:1 se obtiene el vector >> [5 4 3 2 1] Las siguientes instrucciones, por ejemplo, generarn una tabla de senos. Pruebe. >> x = [0.0:0.1:2.0]; >> y = sin(x); >> [x y] Hagamos notar que al operar sin a coordenadas, produce un vector y a partir de x. La notacin de dos puntos permite acceder a submatrices. Por ejemplo, A(1:4,3) es el vector columna con las cuatro primeras entradas de la tercera columna de A. Dos puntos sin ms especicacin denotan una la o columna completa: A(:,3) es la tercera columna de A, y A(1:4,:) son las cuatro primeras las. Se pueden usar como ndices vectores enteros arbitrarios: A(:,[2 4]) est formada por las columnas segunda y cuarta de A. Estos ndices se pueden usar a ambos lados de una instruccin de asignacin: A(:,[2 4 5]) = B(:,1:3) reemplaza las columnas 2, 4 y 5 de A por las tres primeras de B. Se muestra y asigna la matriz A alterada completa. Pruebe. Las columnas 2 y 4 de A pueden multiplicarse por la derecha por una matriz 2 2: >> A(:,[2,4]) = A(:,[2,4])*[1 2;3 4] Ejercicio 1.1.4. Dado >> A=round(10*rand(4,5)) calcular >> >> >> >> >> >> A(1:4,3) A(:,3) A(1:4,:) A(:,[2 4]) B; A(:,[2 4 5]) = B(:,1:3)} A(:,[2,4]) = A(:,[2,4])*[1 2;3 4]
Si denotamos por x un vector con n componentes, cul es el efecto de la instruccin x = x(n:-1:1)? Haga la prueba. Para comprobar la utilidad de esta notacin, comparar estas instrucciones de MATLAB con una rutina de Pascal, FORTRAN, o C que d los mismos resultados.
15
16
1.1.11. Archivos .m
MATLAB puede ejecutar una sucesin de instrucciones almacenadas en archivos de disco. Estos archivos se denominan archivos .m", debido a que su sujo debe ser m". Gran parte del trabajo con MATLAB ser el de crear y renar archivos .m. Hay dos tipos de archivos .m: archivos de instrucciones y archivos de funciones. Archivos de instrucciones. Un archivo de instrucciones consiste en una sucesin de instrucciones normales de MATLAB. Si tuviramos un archivo denominado nombre.m, las instrucciones del archivo pueden ser ejecutadas sin ms que escribir la instruccin nombre. Las variables en un archivo de instrucciones son globales y, por tanto, cambiarn los valores del espacio de trabajo. Los archivos de instrucciones son utilizados a menudo para introducir datos en una matriz grande. En un archivo de este tipo es bastante sencillo corregir los errores sin tener que repetir todo el trabajo. Si, por ejemplo, se escribe en el archivo datos.m A = [ 1 2 3 4 5 6 7 8 ]; entonces la instruccin de MATLAB datos har que se efecte la asignacin especicada en datos.m. Un archivo .m puede hacer referencia a otros, incluyendo a l mismo. Archivos de funciones. Los archivos de funciones hacen que MATLAB tenga capacidad de crecimiento. Se pueden crear funciones especcas para un problema concreto, y, a partir de su introduccin, tendrn el mismo rango que las dems funciones del sistema. Las variables en las funciones son locales aunque se pueden declarar las variables para que sean globales. Veremos, en primer lugar, un ejemplo sencillo de archivo de funcin: function a = ental(m,n) %ENTAL Matriz entera generada aleatoriamente. % ental(m,n) produce una matriz mxn con entradas % enteras entre 0 y 9 a = floor(10*rand(m,n)); Una versin ms general de esta funcin es la siguiente: function a = ental(m,n,a,b) %ENTAL Matriz entera generada aleatoriamente. % ental(m,n) produce una matriz mxn con entradas % enteras entre 0 y 9 % ental(m,n,a,b) produce las entradas de la matriz entre a y b. if nargin < 3, a = 0; b = 9; end a = floor((b-a+1)*rand(m,n))+a;
17
Esto debe escribirse en el archivo ental.m (correspondiente al nombre de la funcin). La primera lnea declara el nombre de la funcin, argumentos de entrada, y argumentos de salida; sin esta lnea el archivo sera uno de instrucciones. La instruccin >> z = ental(4,5), por ejemplo, har que los nmeros 4 y 5 pasen a las variables m y n en el archivo de funcin y el resultado se asigna a la variable z. Como las variables en un archivo de funcin son locales, sus nombres son independientes de los que se encuentren en el espacio de trabajo. Hagamos notar que el uso de nargin (nmero de argumentos de entrada) permite asignar un valor por defecto a una variable que se omitacomo a y b en el ejemplo. Una funcin puede tener tambin argumentos de salida mltiples. Por ejemplo: function [media, desv] = estad(x) %ESTAD Media y desviacin tpica. Para un vector x, % estad(x) da la media y la desviacin tpica de x. % Para una matriz x, estad(x) da dos vectores fila conteniendo, % resp., la media y la desviacin tpica de cada columna. [m n] = size(x); if m == 1 m = n; % caso de un vector fila end media = sum(x)/m; desv = sqrt(sum(x.^2)/m - media.^2) Una vez situado en el archivo de disco estad.m, la instrucin de MATLAB >> [xm, xd] = estad(x), por ejemplo, asignar la media y la desviacin tpica de x a las variables xm y xd, respectivamente. Cuando se dispone de una funcin con argumento de salida mltiple, se pueden efectuar asignaciones simples. Por ejemplo, >> xm = estad(x) (no son necesarios los corchetes alrededor de xm) asignar la media de x a xm. El smbolo % indica que el resto de la lnea es un comentario; MATLAB ignorar el resto de la lnea. Las primeras lneas de comentario, que documentan el archivo, son accesibles con la instruccin help. As, para que se muestren en pantalla basta escribir help estad. Dicha documentacin debe incluirse siempre en un archivo de funcin. Esta funcin ilustra algunas de las formas en que MATLAB puede usarse para obtener un cdigo eciente. Hagamos notar, por ejemplo, que x.2 es la matriz de
18
los cuadrados de las entradas de x, que sum es una funcin vectorial (seccin 1.1.6), que sqrt es una funcin escalar (seccin 1.1.7), y que la divisin en sum(x)/m opera una matriz con un escalar. La siguiente funcin, que da el mximo comn divisor de dos enteros va el algoritmo de Euclides, ilustra el uso de un mensaje de error (ver seccin siguiente). function a = mcd(a,b) % MCD Mximo comn divisor % mcd(a,b) es el mximo comn divisor de a y b no nulos a la vez. a = round(abs(a)); b = round(abs(b)); if a == 0 & b == 0 error(El mcd no est definido si ambos nmeros son nulos) else while b ~= 0 r = rem(a,b); a = b; b = r; end end MATLAB esta preparado pera hacer operacions con matrices y vectores ms rpido que si las programaramos como lo hariamos si no existieran esas operaciones directas. As, es conveniente vectoritzar el algoritmeo al mximo en las M-las pera obtener algoritmos ms rpidos. Siempre que sea posible hay que convertir secuencias for y while en operaciones matriciales o vectoriales. Por ejemplo, es equivalente calcular >> 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); A pesar de que en MATLAB no es necesario predimensionar los vectores a veces puede ser conveniente hacerlo. Si no se pre-dimensionan, MATLAB redimensiona los vectores cada paso de la iteracin. Esto se elimina predimensionando y, de esta forma, lo calcula mas rpidamente. Para predimensionar (hay que saber la dimensin que tendr el vector y) hay que hacer y=zeros(1,10001). Ejercicio 1.1.5. Comparar la diferencia, en tiempo computacional, de ejecutar los dos programas anteriores para evaluar y=sin(t) sin tener los vectores predimensionados (hacer clear t y previamente) y ejecutarlos despues de haberlos predimensionado previamente (t=zeros(1,10001);y=t;.
19
En MATLAB, dados dos vectores v i u de dimensin n 1 es equivalente, calcular su producto interior escribiendo p=v*u que haciendo function c=prodi(a,b) %producto interior for i=1:n p(i)=v(i)*u(i); end Grcies a esta capacidad tenemos que si queremos multiplicar dos matricess, las siguientes funciones nos dan el mismo resultado: function C=prod1(A,B) %Producto de la matrices A y B [n,m]=size(A); [p,q]=size(B); for i=1:n for j=1:m C(i,j)=0; for k=1:q C(i,j)=C(i,j)+A(i,k)*B(k,j); end end end function C=prod2(A,B) %Producto de la matrices A y 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) %Producto de la matrices A y B [n,m]=size(A); for i=1:n C(i,:)=A(i,:)*B(:,:); end function C=prod3(A,B) %Producto de la matrices A y B C(:,:)=A(:,:)*B(:,:); %Aco es equivalent a C=A*B;
20
Si la matriz tiene una estructura especial podemos aprovecharla para hacer menos operaciones. Por ejemplo, si queremos evaluar C = A B con A= A11 0 0 A22 ; B= B11 0 0 B22 (1.1)
siendo A11, A22, B11 y B22 matrices de dimensin n n, con cualquiera de las funciones prod anteriores estaramos muchas veces multiplicando por cero y, por tant, haciendo operaciones no necesarias. Obtendriamos el mismo resuldo haciendo [n,m]=size(A11); C=[A11*B11, zeros(n);zeros(n),A22*B22]; pero con muchas menos operaciones. Ejercicio 1.1.6. Dadas las matrices >> A11=hilb(20); A22=magic(20); B11=pascal(20); B22=rand(20); (utilizar el comando help para ver que matrices hemos obtenido), queremos evaluar (1.1), hacerlo utilizando las distintas alternativas. Calcular el tiempo necesario para cada una de las alternativas (Utilizar las funciones de MATLAB ETIME, TIC, TOC, CLOCK i/o CPUTIME) y compararlos.
1.1.12. Grcos
MATLAB puede producir grcos planos y grcos de malla de supercies tridimensionales. Para ver algunas de sus posibilidades escriba plot demo. Grcos planos. La instruccin plot crea grcos en el plano XY; si x e y son vectores de la misma longitud, la orden plot(x,y) accede a la pantalla grca y realiza un grco plano de los elementos de x contra los elementos de y. Por ejemplo, podemos dibujar la grca de la funcin seno sobre el intervalo [4, 4] con las instrucciones siguientes: x = -4:.01:4; y = sin(x); plot(x,y) Intntelo. El vector x es una particin del dominio con paso 0.01 mientras que y es un vector (sin es vectorial) con los valores que toma el seno en los nodos de esta particin. Para volver a la pantalla alfanumrica desde la grca, se pulsa cualquier tecla. Por el contrario, para acceder a la pantalla grca, se usa la orden shg (show graph). Si su mquina soporta ventanas mltiples con una ventana grca aparte, puede desear mantener la ventana grca expuesta aunque a un lado y la ventana alfanumrica activa. 2 Como un segundo ejemplo, puede dibujar la grca de y = ex sobre el intervalo [1,5, 1,5] como sigue:
21
Hagamos notar que est precedido por un punto para asegurarnos que opera a coordenadas (ver seccin 1.1.2). Pueden hacerse tambin grcos de curvas denidas paramtricamente. Por ejemplo, t=0:.001:2*pi; x=cos(3*t); y=sin(2*t); plot(x,y) La instruccin grid har un cuadriculado en el grco actual. Pueden ponerse ttulos, comentarios en los ejes o en cualquier otra parte con los siguientes comandos que tienen una cadena como argumento: title ttulo del grco xlabel comentario en el eje x ylabel comentario en el eje y gtext texto posicionado interactivamente text texto posicionado mediante coordenadas Por ejemplo, la instruccin title(La funci\on m\as bella) proporciona un ttulo al grco. El comando gtext(La mancha) permite posicionar una cruz en el grco con las echas o el ratn, donde se situar el texto cuando se pulse cualquier tecla. Por defecto, los ejes se autoescalan. Para evitarlo se usa el comando axis. Si c = [xm , xmx , ym , ymx ] es un vector con 4 elementos, entonces axis(c) establece el n a n a escalado de ejes a los lmites prescritos. axis, por s mismo congela el escalado actual para grcos subsecuentes; Escribiendo axis de nuevo volvemos al autoescalado. El comando axis(square) asegura que se use la misma escala en ambos ejes. Dos formas de obtener dibujos mltiples se ilustran con >> x=0:.01:2*pi;y1=sin(x);y2=sin(2*x);y3=sin(4*x); >> plot(x,y1,x,y2,x,y3) y formando una matriz Y conteniendo los valores funcionales como columnas >> x=0:.01:2*pi; Y=[sin(x), sin(2*x), sin(4*x)]; >> plot(x,Y)} Otra forma es con hold. El comando hold congela la pantalla grca actual de forma que los grcos posteriores se sobreimponen en ella. Escribiendo hold de nuevo se libera el hold. Los comandos hold on y hold off tambin se pueden utilizar. Se pueden evitar los tipos de lnea y de punto por defecto. Por ejemplo, >> x=0:.01:2*pi; y1=sin(x); y2=sin(2*x); y3=sin(4*x); >> plot(x,y1,--,x,y2,:,x,y3,+)}
22
produce lneas a trazos y de puntos para las dos primeras, mientras que para la tercera se obtiene el smbolo + en cada nodo. Los tipos de lneas y de puntos son: Tipos de lnea: slido (-), a trazos (-). puntos (:), punto y trazo (-.) Tipos de puntos: punto (.), ms (+), estrella (*), crculo (o), equis (x) Ver help plot para los colores de las lneas y puntos. El comando subplot se usa para dividir la pantalla de forma que puedan verse hasta cuatro grcos a la vez. Ver help subplot. Grcos de malla de supercies tridimensionales. Los grcos de malla de supercies tridimensionales se hacen con la funcin mesh. La instruccin mesh(z) crea un grco tridimensional en perspectiva de la matriz z. La supercie de malla est denida por las coordenadas z de los puntos sobre un cuadriculado rectangular en el plano XY. Por ejemplo, pruebe con mesh(eye(10)). Para dibujar la grca de una funcin z = f (x, y) sobre un rectngulo, se denen en primer lugar los vectores xx e yy que dan particiones de los lados del rectngulo. Con la funcin meshdom (mesh domain) se crea una matriz x, en la que cada la es igual a xx, y de igual forma una matriz y, con todas sus columnas iguales a yy, como sigue: [x,y] = meshdom(xx,yy); Entonces se computa la matriz z, obtenida evaluando f entrada a entrada sobre las matrices x e y, para aplicarle la funcin mesh. 2 2 Se puede, por ejemplo, dibujar la grca de z = ex y sobre el cuadrado [2, 2] [2, 2] como sigue (intntelo): >> >> >> >> >> xx = -2:.1:2; yy = xx; [x,y] = meshdom(xx,yy); z = exp(-x.^2 - y.^2); mesh(z) Se podra, desde luego, cambiar las tres primeras lneas en lo anterior por >> [x,y] = meshdom(-2:.1:2, -2:.1:2); Para ms detalles sobre mesh, ver la Gua del usuario. Consulte la ayuda para plot3, mesh, y surf.
1.1.13. Consulta
Hay muchas caractersticas de MATLAB que no pueden incluirse en estas notas introductorias. Mostraremos a continuacin algunas de las funciones disponibles en MATLAB, agrupadas por reas (Fuente: MATLAB Users Guide, versin 3.5.). Use la instruccin help o consulte la Gua del usuario para una informacin ms detallada sobre las funciones. Hay muchas funciones aparte de estas. Existen, en particular, varias cajas de herramientas de funciones para reas especcas; entre ellas, las de proceso de seales, teora de control, control robusto, identicacin de sistemas, optimizacin, splines,
23
quimiometra, -anlisis y sntesis, identicacin, y redes neurales Las cajas de herramientas, que son opcionales, pueden no estar instaladas en su sistema.. Para explorar siempre se puede usar la instruccin help.
help demo who what size length clear computer C exit quit
G ENERAL ayuda demostraciones muestra variables en memoria muestra archivos .m en el disco nmero de las y columnas longitud de un vector limpia el espacio de trabajo tipo de computadora interrupcin local salida de MATLAB lo mismo que exit
O PERADORES MATRICIALES + suma resta multiplicacin / divisin derecha \ divisin izquierda potenciacin conjugada traspuesta
O PERADORES PUNTUALES + suma resta . multiplicacin ./ divisin derecha .\ divisin izquierda . potenciacin . traspuesta
O PERADORES L GICOS Y R ELACIONALES < menor que & y <= menor o igual que | o > mayor que no >= mayor o igual que == igual = no igual
24
VALORES E SPECIALES ans respuesta cuando no se asigna la expresin eps precisin pi i, j 1 inf NaN No Nmero (Not-a-Number) clock reloj de pared date fecha nargin nmero de argumentos de entrada de una funcin nargout nmero de argumentos de salida de una funcin
chdir delete diary dir load save type what fprintf pack
A RCHIVOS DE DISCO cambiar de directorio borrar archivo diario de la sesin directorio de archivos en el disco cargar variables de un archivo guardar variables en un archivo mostrar funcin o archivo mostrar archivos .m en el disco escribir en un archivo compactar memoria va save
25
M ANIPULACIN DE MATRICES rotacin invierte el orden de las columnas invierte el orden de las las diagonal parte triangular inferior parte triangular superior reordena una matriz en otra traspuesta convierte una matriz en una columna simple; A(:)
F UNCIONES L GICAS Y R ELACIONALES any condiciones lgicas all condiciones lgicas nd encuentra ndices de valores lgicos isnan detecta NaNs nite detecta innitos isempty detecta matrices vacas isstr detecta variables de cadena strcomp compara variables de cadena
26
P ROGRAMACIN Y ARCHIVOS . M input obtiene nmeros desde el teclado keyboard llamada al teclado como si fuera un archivo .m error muestra mensaje de error function dene funcin eval evala un texto en variables feval evala funcin dada por una cadena echo permite mostrar las instrucciones en pantalla exist comprueba si las variables existen casesen sensibilidad a las maysculas global dene variables globales startup archivo de inicializacin getenv accede a una variable de entorno menu genera un men etime tiempo gastado
T EXTO Y C ADENAS abs convierte cadena en valores ASCII eval evala texto como instrucciones num2str convierte nmeros en cadenas int2str convierte enteros en cadenas setstr indicador de cadenas sprintf convierte nmeros en cadenas isstr detecta variables de cadena strcomp compara variables de cadena hex2num convierte cadenas hexadecimales en nmeros
27
plot loglog semilogx semilogy polar mesh contour meshdom bar stairs errorbar
C ONTROL DE LA V ENTANA G RFICA axis escalado manual de ejes hold mantiene grco en pantalla shg muestra la pantalla grca clg limpia la pantalla grca subplot divide la pantalla grca I MPRESIN DE GRFICOS print enva grco a impresora prtsc volcado de pantalla meta archivo de grcos
28
F UNCIONES T RIGONOMTRICAS sin seno cos coseno tan tangente asin arcoseno acos arcocoseno atan arcotangente atan2 arcotangente de x/y sinh seno hiperblico cosh coseno hiperblico tanh tangente hiperblica asinh arcoseno hiperblico acosh arcocoseno hiperblico atanh arcotangente hiperblica
F UNCIONES E SPECIALES funcin de Bessel funcin Gamma aproximacin racional funcin de error inversa de la funcin de error integral completa elptica de primera especie integral elptica de Jacobi
29
C ONDICIONAMIENTO DE MATRICES nmero de condicin en la norma 2 norma 1, norma 2, norma de Frobenius, norma rango estimacin de la condicin (inverso)
F UNCIONES MATRICIALES ELEMENTALES expm matriz exponencial logm matriz logaritmo sqrtm matriz raz cuadrada funm funcin arbitraria de matriz poly polinomio caracterstico det determinante trace traza kron producto tensorial de Kronecker
30
A NLISIS DE DATOS POR COLUMNAS max valor mximo min valor mnimo mean valor medio median mediana std desviacin tpica sort ordenacin sum suma de elementos prod producto de elementos cumsum suma acumulativa de elementos cumprod producto acumulativo de elementos diff derivadas aproximadas hist histogramas corrcoef coecientes de correlacin cov matriz de covarianza cplxpair reordena en pares complejos abs angle conv corrcoef cov deconv fft fft2 ifft ifft2 fftshift P ROCESO DE S EALES mdulo complejo argumento complejo convolucin coecientes de correlacin covarianza deconvolucin transformada rpida de Fourier FFT 2-dimensional FFT inversa FFT inversa 2-dimensinal cambia las dos mitades de un vector
I NTEGRACIN N UMRICA quad funcin de integracin numrica quad8 funcin de integracin numrica
31
32
1.2.
Los escalares se representarn habitualmente por letras griegas minsculas: , , , . . .. Interpretaremos los vectores como vectores columna cuando no se especica el contrario y los representaremos habitualmente por letras romanas minsculas: x, y, a, b, . . .. Las matrices las representaremos por letras romanas maysculas: A, B, X, . . .. Los vectores de la base cannica de Rn los representaremos por ei , donde ei ser el vector que tiene un 1 en la componente i-sima y ceros en el resto. El conjunto de las matrices m n lo representamos por Rmn , es decir, implcitamente identicamos una matriz con el vector formado por sus elementos, en algn orden (por las o por columnas). El elemento (i, j) de una matriz A se representa por Aij o A(i, j) o aij , si hemos especicado previamente que A = (aij ). La notacin que utilizaremos para referirnos a las las, las columnas y las submatrices de una matriz es de tipo matlab, por ejemplo A(i, :) la i-sima de A. A(:, i) columna i-sima de A. As mismo, si v1 , . . . , vn Rm , entonces representaremos la matriz, las columnas de la cual son v1 , . . . , vn , por [v1 . . . vn ]. De la misma forma, si u1 , . . . , um Rn son vectores la, entonces representaremos la matriz, las las de la cual son u1 , . . . , um , por u1 . . . . um Mirad la seccin 1.1.8 para ms detalles.
= mx1in |xi |. a
n i=1
|xi |.
33
=( =(
n i=1
p,w
n i=1
=(
n i=1
p,
Ejercicio 1.2.3. Hacer cuatro programs de matlab, que utilicen for y que se llamen nori.m, nor1.m,norp.m y norw.m que calculen las normas 1-4 del ejemplo anterior. Hacer-lo de forma que las funciones sean llamadas de la siguiente forma: >> >> >> >> sol=nori(x); sol=nor1(x); sol=norp(x,p); sol=norw(x,p,w);
Comprobar numricamente que x, norp(x,1)-nor1(x)=0. Comprobar numricament que si w=x*01+, entonces x, norw(x,p,w)-norp(x,p)=0. Hacer un nico programa, llamado, nor.m, que calcule lo mismo que calculan las cuatro funciones anteriores. El programa nuevo, para obtener los mismos resultados que antes, deberia de utilizarse de la forma siguente: >> >> >> >> sol=nor(x,0); sol=nor(x,1); sol=nor(x,p); sol=nor(x,p,w);
Si haceis >> help norm vereis: NORM vector norm. NORM(V,P) = sum(abs(V).^P)^(1/P). NORM(V) = norm(V,2). NORM(V,inf) = max(abs(V)). NORM(V,-inf) = min(abs(V)). Intentar reproduir, utilizando la funcin norm.m, los resultados obtenidos con les funcions nori.m, nor1.m,norp.m i norw.m.
34
n x
Esto prueba que las normas 1, 2, son equivalentes en Rn . De hecho, se puede probar tambin que en Rn todas las normas son equivalentes. Toda norma en Rn es una funcin continua. Desigualdad de Hlder: |xT y| x
p
y q,
x, y Rn ,
p, q,
1 1 + = 1. p q
(1.2)
y 2,
x, y Rn .
(1.3)
Ejercicio 1.2.5. Hacer un programa tal que dados p, q = 0, 1, 2, p = q, Calcule C > 0 tal que nor(x, p) C( nor(x, p) Cnor(x, q)) nor(x, q) x Rn .
1
(1.4) i x
Utilizar este programa para deducir, que no probar, que las normas x 2 , x son equivalentes. Deducir les constantes m y M en cada caso.
35
diagonals negatives
Figura 1.1: Diagonales de una matriz Denici 1.2.7. La matriz A Rnn se llama triangular superior si aij = 0 para i > j a11 a12 . . . a1n 0 a22 . . . a2n A= (1.5) . . . . . . . . . . . . . . . . . . . 0 0 . . . ann Con el comando triu podemos calcular la parte triangular superior de una matriz. Por ejemplo >> A=rand(4); B=triu(A), Notemos que son equivalentes: >> triu(A), >> triu(A,0), Denici 1.2.8. La matriz A Rnn se llama triangular inferior si aij = 0 para i < j a11 0 . . . 0 a a ... 0 A = 21 22 (1.6) . . . . . . . . . . . . . . . . . . . an1 an2 . . . ann Con el comando tril podemos calcular la parte triangular inferior de una matriz. Por ejemplo >> A=rand(4); B=tril(A), Notad que son equivalentes: >> tril(A), >> tril(A,0),
36
Denici 1.2.9. Diremos que una matriz A = (aij ) m n tiene un ancho de banda inferior l m cuando aij = 0, si i > j + l, es decir, cuando las diagonales m + 1, . . . , l 1 son nulas (notad que la diagonal m no existe). Diremos que una matriz A m n tiene un ancho de banda superior u n cuando aij = 0, si j > i + u, es decir, cuando las diagonales u + 1, . . . , n 1 son nulas (notad tambin que la diagonal n tampoco existe). Diremos que una matriz A mn tiene un ancho de banda b (b m, n) cuando aij = 0, si |i j| > b, es decir, cuando las diagonales m + 1, . . . , b 1, b + 1, . . . , n 1 son nulas. Mirad el resultado que obtenemos evaluando: >> A=rand(4); B=tril(triu(A,-1),2) Ejercicio 1.2.10. Realizad un programa el cual, dada la matriz A y los enteros l y u, devuelva una matriz que tenga un ancho de banda inferior l y un ancho de banda superior u y que los valores diferentes de cero de esta matriz coincidan con los de A. En el caso en que solo le introducimos un matriz A y un escalar b, el programa debe devolver una matriz con un ancho de banda b. Denici 1.2.11. Una matriz A se llama estrictamente diagonalmente dominante por las cuando i=j |aij | < |aii |. Anlogamente denimos la dominancia diagonal por columnas. Ejercicio 1.2.12. Haced un programa que dada una matriz A compruebe si la matriz es diagonalmente dominante por las. Denici 1.2.13. La transposicin de una matriz m n A es una matriz n m AT que satisface (AT )(i, j) = A(j, i) 1 i n, 1 j m. (1.7) Esta operacin corresponde a la expresin coloquial de cambiar las por columnas. Resumimos seguidamente las propiedades fundamentales del operador transposicin: (AT )T = A. (A + B)T = AT + B T . (A)T = AT . (AB)T = B T AT . Ejercicio 1.2.14. En matlab, para calcular la transpuesta de una matriz haremos A. Comprueba con dos matrices, que las propiedades anteriores son ciertas. Denici 1.2.15. Una matriz A Rnn es invertible si existe una matriz B Rnn tal que AB = BA = I; en este caso, la matriu que satisface esta condicin es nica, se llama la inversa de A y se representa habitualmente por A1 .
37
38
1.3.
1.3.1. Introduccin
Dada una funcin real de una variable f (x), tratamos de hallar los valores de x en los que la funcin se anula, es decir, las soluciones o races de la ecuacin f (x) = 0. Si tenemos un polinomio de grado 2 (o uno), existe una formula para calcular la solucin. Si el polinomio es de grado 3 o 4 tambin se puede resolver. No existen formulas generales para obtener la solucin de polinomios de grado 5. Si no es posible resolver analticamente la ecuacin f (x) = 0 despejando x, nos vemos abocados a utilizar mtodos iterativos, consistentes en obtener una sucesin de valores x1 , x2 , . . . , xn , . . . cada vez ms prximos a la raz buscada. En teora, nos planteamos si tal raz existe y si es o no nica. En la prctica, lo ms importante es determinarla con la precisin necesaria, con el menor nmero posible de operaciones. La respuesta a la cuestin de la existencia la proporciona el Teorema 1.3.1. (Teorema de Bolzano) Si f : [a, b] R es continua y f (a) y f (b) tienen signos diferentes (f (a) f (b) < 0), entonces f se anula en algn punto entre a y b. En este caso, la unicidad de la solucin puede garantizarse si la funcin es estrictamente creciente o estrictamente decreciente. Ambos resultados proporcionan condiciones sucientes, pero no necesarias. Por ejemplo, |x| tiene una nica raz en [1, 1] y, sin embargo, ni cambia el signo ni es montona en dicho intervalo. Veamos ahora cmo analizar la convergencia de los mtodos iterativos y cmo estimar la precisin del resultado.
39
Los mtodos iterativos tambin pueden consistir en dado un intervalo. [a0 , b0 ], que contenga a la solucin, vamos calculando una sucesin de intervalos, [ak , bk ] cada vez ms pequeos y que tambin contengan a la solucin. A xk lo llamamos iterado k-simo (xk seria (ak + bk )/2 en el caso de intervalos) y el error de esta aproximacin viene determinado por k = |xk x |. Que la sucesin de iterados xk converja a x es equivalente a que k tienda a cero cuando k tiende a innito. En la prctica, k no es calculable, ya que no conocemos x . En cambio, obtenidos los iterados x1 , x2 , x3 , . . . , xk , xk+1 , . . . , podemos calcular ek = |xk+1 xk |, k = 1, 2, . . . . Observemos que ek aproxima k siempre que k+1 k . Por ello, podemos utilizar en nuestros algoritmos como criterio de parada que la cantidad ek sea sucientemente pequea, |xk+1 xk | < tol o 0,5 |xk+1 xk | < tol. Debemos detener en cuenta que si el mtodo convergente lentamente, estamos subestimando el error, al contrario, si converge rpidamente, el error ser seguramente inferior a tol. Otro posible criterio es la satisfaccin aproximada de la ecuacin, es decir, que |f (xk )| < tol. Conviene tambin limitar el nmero mximo de iteraciones, en previsin de que el algoritmo diverja, oscile indenidamente o converja muy lentamente. Tipos de convergencia Para comparar la eciencia de los distintos mtodos iterativos, vamos a medir la rapidez con la que los iterados x1 , x2 , . . . , xk , . . ., convergen o no a la solucin. Al desconocer la solucin, medimos la velocidad de convergencia de la sucesin de incrementos ek , k = 1, 2, 3, . . . Si los cocientes ek+1 /ek tienden a K, 0 < K < 1, diremos que el mtodo converge linealmente. Si los cocientes ek+1 /ek tienden a cero y los ek+1 /e2 tienden a estabilizarse, k diremos que el mtodo converge cuadrticamente. Si los cocientes ek+1 /ek tienden a cero y los ek+1 /ep , para cierto 1 << p < 2, k tienden a estabilizarse, se dice que el mtodo tiene convergencia superlineal.
40
En la prctica, el tipo de convergencia nos indica el trabajo necesario para alcanzar determinada precisin. Con un mtodo que converge linealmente, cada tantas iteraciones, por ejemplo cada 3, se obtiene un dgito adicional exacto en la solucin. En cambio, si hay convergencia cuadrtica, cada tantas iteraciones se duplica el nmero de decimales exactos. Los mtodos de biseccin y regula falsi convergen linealmente. El mtodo de Newton converge cuadrticamente, si se dan las condiciones adecuadas. El mtodo de la secante tiene generalmente convergencia superlineal. Ejemplo de convergencia lineal La sucesin (xn ) presenta convergencia lineal con ratio de convergencia R, 0 < R < 1, cuando l m
n
|xn+1 x | =R |xn x |
|xn+1 x | |xn x |
Ejemplo xn = 1 + 0,2n + (n + 1)n converge a x = 1. x n x 2,000000e 00 7,000000e 01 1,511111e 01 2,362500e 02 3,200000e 03 4,486008e 04 7,249986e 05 1,327684e 05 2,583231e 06 5,130000e 07 1,024386e 07 2,048135e 08 4,096043e 09 8,192013e 10 1,638400e 10 3,276800e 11
3,500000e 01 2,158730e 01 1,563419e 01 1,354497e 01 1,401878e 01 1,616133e 01 1,831291e 01 1,945667e 01 1,985885e 01 1,996853e 01 1,999379e 01 1,999890e 01 1,999982e 01 1,999997e 01 2,000000e 01
En la tabla anterior vemos que la segunda columna, la que corresponde a los cocientes |xn+1 x| | se estabiliza en 0,2, lo que quiere decir que esta |xn x sucesin converge a cero linealmente con radio de convergencia 0.2. Observemos que se gana una cifra decimal en cada cierto numero de iteraciones. Ejemplo convergencia cuadrtica
41
|xn+1 x | = 0, . (xn x )2
n
Ejemplo: xn = 1 + 0,22 + (n + 1)2 converge a x = 1. x n x 1,2000e + 00 2,900000e 01 1,394568e 02 1,781879e 05 1,310720e 11 4,307532e 23 1,844674e 45 3,402824e 90 1,157921e 179
|xn+1 x | |xn x | |xn+1 x | (xn x )2
En la tabla anterior vemos que la columna segunda, la cual corresponde a los cocientes |xn+1 x| | no se estabiliza. En cambio, la tercera columna, la |xn x cual corresponde a |xn+1 x)2| si que se estabiliza, a 1 concretamente, lo que (xn x quiere decir que esta sucesin converge a cero cuadrticamente. Observemos que en cada paso se obtiene el doble de cifras decimales exactas que en el anterior.
Algoritme bisecci
42
a0 a1 m2
m1 b1
b0
Figura 1.2: Mtodo de la biseccin Input: a, b, f , max_its, tol Output: m if ( signe(f (a)) = signe(f (b)) ) stop end for i = 1, . . . , max_its m = 0,5 (a + b) %punt mig [a, b] if ( 0,5 |a b| < tol ) break end if ( signe(f (a)) = signe(f (m)) ) b=m else a=m end end Observemos que el intervalo [a, b] contiene la raz. La cota del error esta dividida por 2 a cada iteracin Funcin biseccin.m function [m i]=biseccio( a, b, def_func, max_its, tol) % [m i]=biseccio( a, b, max_its, tol) % Biseccio per a trobar solucio de f(x)=0 % La funci seria def_func % % INPUT: % a: a_0 % b: b_0
43
solucio
LOCALS a: a_i % fa: f(a_i) b: b_{i} % fb: f(b_i) m: m_i % fm: f(m_i) i: index iteracions EXEMPLES: [m,i]=biseccio(1,2,x^3-3*x+1,100000,.0001) [m,i]=biseccio(0,1,x^3-3*x+1,100000,.0001)
func=inline(def_func, x); fa=func(a); fb=func(b); if ( fa*fb > 0 ) fprintf(No nhi ha canvi de signe en [%e, %e]\n, a, b); return; end i=0; while ( 0.5*abs(b-a) > tol & i < max_its ) m=0.5*(a+b); fm=func(m); fprintf(%d\t% .16e\t% .16e\n, i,m, fm); if ( fm*fa < 0 ) b=m; fb=fm; else a=m; fa=fm; end i=i+1; end if ( i < max_its & 0.5*abs(b-a) < tol ) fprintf(Convergit en %d iteracions,\nsolucio en interval...
44 i, a, b);
a0
m1 a1 m2
b0 b1
Figura 1.3: Mtodo de regula falsi amplitud del intervalo de bsqueda, b a, no tiende a 0. Por ello, hay que modicar el criterio de convergencia, terminando cuando dos iteraciones sucesivas dieran poco. Algoritme regulafalsi
Rgula falsi
45
function [m i]=regulafalsi( a, b, def_func, max_its, tol) % [m i]=regulafalsi( a, b, max_its, tol) % Biseccio per a trobar solucio de f(x)=0 % La funci seria def_func % % INPUT: % a: a_0 % b: b_0 % max_its: maxim nmero diteracions % % tol: tolerancia per a error relatiu iteracio % % OUTPUT: % m: solucio % % LOCALS % a: a_i % fa: f(a_i) % b: b_{i} % fb: f(b_i) % m: m_i % fm: f(m_i) % i: index iteracions % EXEMPLES: % [m,i]=regulafalsi(1,2,x^3-3*x+1,100000,.0001)
46
fa=func(a); fb=func(b); mo=b; if ( fa*fb > 0 ) fprintf(No nhi ha canvi de signe en [%e, %e]\n, a, b); return; end i=0; while ( 0.5*abs(b-a) > tol& 0.5*abs(m-mo) > tol & i < max_its ) m=(fb*a-fa*b)/(fb-fa); fm=func(m); fprintf(%d\t% .16e\t% .16e\n, i,m, fm); if ( fm*fa < 0 ) b=m; fb=fm; else a=m; fa=fm; end i=i+1; mo=m; end if ( i < max_its & 0.5*abs(b-a) < tol ) fprintf(Convergit en %d iteracions,\nsolucio en interval... determinat per: [% .16e, % .16e]\n, i, a, b); end
47
x0
x2
x1
Figura 1.4: Mtodo de Newton La ecuacin de la recta tangente es y = f (x1 ) + f (x1 )(x x1 ) y la interseccin con el eje OX se obtiene haciendo y = 0: x 2 x = x1 f (x1 ) f (x1 )
siempre que la derivada f no se anule en x1 . Procediendo de forma iterativa, en el paso k determinamos xk+1 = xk f (xk ) , k = 1, 2, . . . f (xk ) (1.8)
Algoritme de Newton-Raphson Newton-Raphson Input: x0 , f , f , max_its, tol Output: x1 for i = 1, . . . , max_its x1 = x0 f (x0 )/f (x0 ) if ( |x1 x0 | < tol ) break end x0 = x1 end Funcin newton.m
48
function [x1 i]=newton( x0, def_func, def_derfunc, max_its, tol) % [x1 i]=newton( x0, max_its, tol) % Newton per a trobar solucio de f(x)=0 % la funcio deu de estar definida en def_func, % la derivada en def_derfunc % % % % % % % % % % % % % % % % INPUT: x0: max_its: tol: OUTPUT: x2:
solucio
LOCALS xin: x_0 x0: x_n % x1: x_{n+1} fx0: f(x0) % fpx0: f(x0) i: index iteracions EXEMPLES: [m,i]=newton(2,x^3-3*x+1,3*x^2-3,100000,.0001) [m,i]=newton(1,x^3-3*x+1,3*x^2-3,100000,.0001)
i=1; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % bucle, % condicio dentrada: # iteracions < maxim # iteracions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% while ( i < max_its ) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % calcular fx0 i fpx0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fx0= func(x0); fpx0= derfunc(x0); if ( fpx0 ~= 0 )
49
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Si fpx0 != 0 calcular x1, si no eixir %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% x1=x0-fx0/fpx0 ; else error(tangent horizontal\n); end
fprintf(%d\t% .16e\t% .16e\n, i,x0, fx0); if ( abs ( x1-x0 ) < tol ) fprintf(Aproximacio solucio: %.15e\n valor funcio:... %e, #its: %d\n,x1, func(x1), i); return; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % renovar i, x0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% x0= x1 ; i=i+1; end fprintf(Aproximacio solucio: %.15e\nfuncio: %e, #its: %d\n, ... x1, func(x1), i); El error cometido en la iteracin k es proporcional al cuadrado del error cometido en la iteracin anterior. En la prctica, esto supone que el nmero de cifras decimales exactas se duplica cada cierto nmero de iteraciones. Las condiciones que garantizan la convergencia cuadrtica del mtodo de Newton son las siguientes: Teorema 1.3.2. Sea f C 2 ([a, b]). Si x [a, b] es una raz de la ecuacin f (x) = 0 tal que f (x ) = 0 (es decir, es una raz simple), entonces la sucesin de iterados xk obtenida por el mtodo de Newton converge a x , para cualquier aproximacin inicial x1 elegida sucientemente prxima a la raz. Adems, la citada convergencia es cuadrtica. Notemos que si la derivada de la funcin f se anula en un iterado, el siguiente paso de Newton no est denido. En este caso, puede hacerse inestable, aunque haya una raz prxima. Sin embargo, si la derivada se anula en la raz, el mtodo de Newton converge linealmente, en lugar de cuadrticamente.
50
k = 1, 2, . . . .
(1.9)
El mtodo de la secante tambien puede ser decucido del de Newton si se substituye k )f (xk1 f (xk ) en (1.8) por f (xxk xk1 ) .
x0
x2
x3
x4
x1
Figura 1.5: Mtodo de la Secante Algoritme de la secant Secant Input: x0 , x1 , f , max_its, tol Output: x2 for i = 1, . . . , max_its x2 = (f (x1 )x0 f (x0 )x1 )/(f (x1 ) f (x0 )) if ( |x2 x1 | < tol ) break end x0 = x1 x1 = x2 end
51
Funcin secante.m function [m i]=secant( x0, x1, def_func, max_its, tol) % [m i]=secant( x0,x1, max_its, tol) % Biseccio per a trobar solucio de f(x)=0 % La funci seria def_func % % INPUT: % x0: x0_0 % x1: x1_0 % max_its: maxim nmero diteracions % % tol: tolerancia per a error relatiu iteracio % % OUTPUT: % m: solucio % % LOCALS % x0: x0_i % fx0: f(x0_i) % x1: x1_{i} % fx1: f(x1_i) % m: m_i; % fm: f(m_i) % i: index iteracions % EXEMPLES: % [m,i]=secant(1,2,x^3-3*x+1,100000,.0001) % [m,i]=secant(0,1,x^3-3*x+1,100000,.0001)
func=inline(def_func, x); t=linspace(x0,x1,100);hold off;plot(t,func(t));grid;hold on i=0; while ( 0.5*abs(x1-x0) > tol & i < max_its ) fx0=func(x0); fx1=func(x1); m=(fx1*x0-fx0*x1)/(fx1-fx0); fm=func(m); plot(x0,fx0,*,x1,fx1,*,m,fm,o);pause(1) fprintf(%d\t% .16e\t% .16e\n, i,m, fm); x0=x1; x1=m;
52
if ( i < max_its & 0.5*abs(x1-x0) < tol ) fprintf(Convergit en %d iteracions,\nsolucio en interval... determinat per: [% .16e, % .16e]\n, i, x0, x1); end El mtodo de la secante tiene convergencia supralineal con p = (1 + 2)/2.
entonces
53
10
15 2
1.5
0.5
0.5
1.5
Figura 1.6: p(x) = 2x2 3x 1 Grcamente parece que x = 1 es una raz del polinomio p(x), en efecto p(1) = 0. Observando la Figura 1.6 partiremos del intervalo [a1 , b1 ] = [0, 2] para hallar la raz positiva. Procediendo de forma anloga, se obtendra la otra raz negativa. Vericamos que el polinomio tiene distinto signo en los extremos del intervalo p(0) = 1 < 0 y p(2) = 9 > 0. Calculamos el punto medio del intervalo y evaluamos en ste el polinomio c1 = (a1 + b1 )/2 = 1 y p(1) = 2 < 0. A continuacin, comprobamos que p(b1 ) (c1 ) < 0 por lo que el intervalo [c1 , b1 ] = [1, 2] contiene a la raz, nos centramos en l haciendo a2 = c1 y b2 = b1 , realizamos una nueva iteracin en [a2 , b2 ] = [1, 2]: c2 = (a2 + b2 )/2 = 1,5, p(c2 ) = 1,25. Ahora p(a2 ) p(c2 ) < 0 entonces b3 = c2 y a3 = a2 nos quedamos con el subintervalo izquierdo ya que la raz est en [a3 , b3 ] = [1, 1,5] cuyo punto medio c3 = (a3 + b3 )/2 = 1,25, p(1,25) = 0,843750. por lo que haremos a4 = c3 y b4 = b3 , nos centraremos en [a4 , b4 ] = [1,25, 1,5] y continuaremos el proceso hasta que la longitud del intervalo [ak , bk ] sea tan pequea como queramos, en este caso tras 25 iteraciones se alcanza la solucin 1.366025, para tolerancia de 107 . En la gura 1.7 mostramos los primeros iterados. La ventaja del algoritmo de biseccin de biseccin es que siempre converge, si partimos de un intervalo que contiene a la raz. sin embargo, la convergencia es lenta y puede darse el caso de que el punto medio calculado en un paso est ms alejado de la raz que el iterado del paso anterior.
54
2 a a a a 0 b b b b 2
0.2
0.4
0.6
0.8
1.2
1.4
1.6
1.8
Figura 1.7: Mtodo de la biseccin Ejercicio 1.3.4. Halla la menor raz positiva de la ecuacin ex cos x = 0 con una tolerancia de 105 , utilizando el mtodo de regula falsi y mostrando los pasos en las primeras iteraciones. Solucin. En primer lugar, representamos grcamente la funcin para elegir el intervalo de partida. x = -3:0.1:3; y = exp(-x.^2)-cos(x); plot(x,y) grid on Observando la grca de la funcin (Figura 1.8) partimos del intervalo [a1 , b1 ] = [1, 2] para hallar la raz. Evaluamos la funcin en los extremos: f (a1 ) = ea1 cos(a1 ) = 0,172423 f (b1 ) = eb1 cos(b1 ) = 0,434462 Calculamos el punto c1 donde la recta que une los puntos (a1 , f (a1 )) y (b1 , f (b1 )) corta al eje x: c1 = (a1 f (b1 ) b1 f (a1 ))/(f (b1 ) f (a1 )) = 1,284111 f (c1 ) = 0,090521 A continuacin, comprobamos en cul de los subintervalos [a1 , c1 ] y [c1 , b1 ] se encuentra la raz y nos centramos en l. Como f (b1 ) f (c1 ) < 0 entonces a2 = c1 y b2 = b1 , es decir, la raz se encuentra en [a2 , b2 ] = [1,284111, 2], realizamos una nueva iteracin:
2 2 2
55
0.8
0.6
0.4
0.2
0.2 3
Figura 1.8: f (x) = exp(x2 ) cos(x) c2 = (a2 f (b2 ) b2 f (a2 ))/(f (b2 ) f (a2 )) = 1,407549 f (c2 ) = 0,024619 De nuevo f (b2 ) f (c2 ) < 0 y por tanto, hacemos a3 = c2 y b3 = b2 , nos quedamos con el subintervalo derecho [a3 , b3 ] = [1,407549, 4] y la siguiente iteracin ser: c3 = (a3 f (b3 ) b3 f (a3 ))/(f (b3 ) f (a3 )) = 1,439320 f (c3 ) = 0,005119
0.5
0.4
0.3
0.2
0.1
0.1
0.2
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
Figura 1.9: Mtodo regula falsi Por lo que haremos a4 = c3 y b4 = b3 , nos centraremos en [a4 , b4 ] = [1,439320, 2]. En este caso vemos que el intervalo no se hace pequeo. Hemos de parar cuando abs(ck ck1 ) es pequeo. Ejercicio 1.3.5. Utiliza el mtodo de Newton para aproximar la raz quinta de 2 con tres cifras decimales exactas, ilustrando el mtodo paso a paso. Comprueba la convergencia del mtodo de Newton.
56
Solucin. Notemos que 5 2 es la solucin de la ecuacin f (x) = x5 2 = 0, cuya derivada f (x) = 5x4 utilizamos en el mtodo de Newton. Tomando una estimacin inicial x1 = 1 y aplicando el mtodo de Newton calculamos las siguientes iteraciones con x2 = x1 x3 x5 2 6 1 1 = = 1,2 =1 4 5x1 5 5 5 5 x 2 1,2 2 = x2 2 4 = 1,2 = 1,152901 5x2 5 1,24
siguiendo este proceso con dos iteraciones ms tenemos x5 = 1,148698, valor que 1 podemos comparar con el obtenido directamente al hacer 2 5 y observar que se tienen ms de tres cifras exactas. Utilizamos el chero newton.m para realizar los clculos. Haciendo >> [sol, x]=newton( 1,x.^5-2, 5*x.^4, 30, 1e-4) obtenemos la solucin sol = 1,148698, el vector de iterados x, el error 3,052991105 y el nmero de iteraciones k = 5. Obsrvese que con una iteracin ms se obtiene la solucin con un error menor que 108 , lo cual, en este caso, nos asegura que tenemos al menos 7 decimales exactos. Para estudiar la velocidad de convergencia, calculamos las tasas de convergencia a partir del vector de iterados x: >> >> >> >> n=max(size(x)); %Tambien podemos hacer n=length(x); er=abs(x-sol); tcl = er(2:n)./er(1:n-1); % Tasa de convergencia lineal. tcl = er(2:n)./er(1:n-1).^2;%Tasa de convergencia cuadrtica.
Observamos que las componentes del vector tcl tienden a cero y las tcc se estabilizan por lo que la convergencia es cuadrtica. Conclusin que tambin puede obtenerse a partir de las grcas de estos vectores. Un planteamiento ms general consistira en obtener una aproximacin de n a con a > 0, resolviendo la ecuacin f (x) = xn a = 0.
57
Haz una representacin grca para averiguar el nmero de soluciones y obtener una estimacin inicial de las mismas. Resulvela aplicando los distintos mtodos expuestos: biseccin, regula falsi, secante y Newton con tolerancia 105 . Estudiar numricamente la velocidad de convergencia de cada mtodo. Confeccionar una tabla indicando para cada mtodo cuntas iteraciones son necesarias para alcanzar la solucin con la precisin requerida.
Captulo 2 Latex
Aqu estara el documento titulado Redaccin de documentos cientcos usando Latex en ambiente Windows de Alfonso Zoraya. Da una idea de todo lo que se puede hacer con Latex. Este documento se encuentra en el aula virtual (SeminarioF.pdf). Lo que est mas ojo del documento es como poner acentos y como incluir dibujos. Mirar lo explicado en clase y en las prcticas. Los otros documentos que estn el el aula virtual son ms completos y os servirn de referencia ms adelante para consultar como hacer cosas ms complejas con LATEX.
58
59
3.1. INTRODUCCIN
60
3.1.
Introduccin
Como su propio nombre indica, el clculo simblico consiste en manipular expresiones matemticas haciendo abstraccin de los valores numricos concretos de las variables involucradas, es decir tratndolas como smbolos. Segn la escuela favorita del autor de un artculo, este tipo de clculo puede recibir tambin los nombres de clculo formal, clculo algebraico, lgebra computacional, etc. En un principio, las computadoras fueron diseadas para realizar clculos numricos (slo con nmeros) como las calculadoras de mano o el famoso baco. La razn era muy simple; resultaba relativamente fcil reducir operaciones complejas a sucesiones de sumas y restas o aproximar funciones complicadas por un polinomio determinado (interpolacin) o una funcin racional de polinomios (aproximantes de Pad). Toda la teora matemtica de sucesiones y series permiti mas tarde elaborar algoritmos complejos para obtener resultados aproximados de casi cualquier funcin y la rapidez de los clculos hizo el resto. Pero de la misma forma que se puede reducir un producto de dos nmeros a un conjunto repetitivo (un algoritmo) de sumas ordenadas mediante una tabla de multiplicar de acceso rpido (y la divisin mediante otro algoritmo que use una tabla de dividir), hay un conjunto nito de derivadas elementales que se pueden considerar Reglas de Derivacin como la derivada de un producto, la de un cociente, la de una funcin de funcin, etc.. Tambin es nito el nmero de funciones elementales que sabemos derivar directamente, es decir, la Tabla de Derivar No se podrn construir algoritmos formales que usen esta Tabla de Derivar y apliquen repetitivamente las Reglas de Derivacin para automatizar estos clculos tediosos y permitir que las mentes matemticas dediquen mas tiempo a los problemas no resueltos an? En julio de 1836, Charles Babbage escribe en su libro de notas: Hoy tuve por primera vez una concepcin general, pero muy confusa, sobre la posibilidad de hacer una mquina que realice desarrollos algebraicos; es decir, sin ninguna referencia a los valores de las letras.... Tambin Leibniz soaba con construir un lenguaje formalizado con el que una mquina de clculo pudiera deducir todos los teoremas y resultados apetecidos. Son estas intuiciones y sueos las que motivaron a tantos y tantos seres humanos en la ardua tarea de construir mquinas con memoria suciente para albergar largas extensiones de desarrollos algebraicos y lo bastante rpidas para que el tiempo necesario para realizarlos estuviera a escala humana. Con cierto retraso, se pusieron a la tarea los creadores de software para generar aplicaciones propietarias (de pago) o de libre uso (gratuitas) que poco a poco fueron dando lugar a los actuales sistemas simblicos. Entre ellos destacan el legendario Macsyma y el no menos potente Maple. Una rpida visin de la actual disponibilidad de herramientas simblicas la podis ver en: http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems Donde Matlab aparece como Symbolic Math Toolbox o con las caractersticas de Maple que es el motor simblico que usa. A su vez, Maxima, es un derivado gratuito del Macsyma del MIT (Instituto Tecnolgico de Massachusetts) y Scilab es lo mas
61
parecido a la versin libre de Matlab en este campo. En lo que respecta al clculo simblico, cada alumno puede optar por el sistema en que se sienta mas cmodo ya que unos se basan en Algol, otros en Lisp, etc. Unos son fciles de obtener y otros cuestan caros. Nosotros vamos a hablar de las capacidades simblicas de Matlab por las razones siguientes: 1. Para no aadir el aprendizaje de una nueva aplicacin restando tiempo a la posibilidad de disfrutar de ella. 2. Porque muchas funciones simblicas tienen el mismo nombre que la funcin numrica similar, lo que ayuda a identicarla. 3. Porque ya conocemos una forma de interrelacionar Matlab y Latex. Aprender una interrelacin distinta con otra aplicacin sera confuso como poco.
3.2.
En la ventana Workspace de Matlab van apareciendo los nombres de todas las variables denidas junto con sus dimensiones (recordad que para Matlab toda variable es una matriz) y el tipo de variable (en principio ser double que es la precisin numrica por defecto). Al denir una variable simblica el tipo cambia automticamente a sym object fcilmente convertible en una serie de caracteres si es una nica expresin o un vector columna de series de caracteres donde cada la puede tener longitudes distintas. Tal conversin es la que realiza el comando latex(VarSym) o el propio Matlab cuando nos presenta en pantalla el resultado. Pero atencin; una variable simblica no es una serie de caracteres. En determinados casos necesitaremos convertirla en una serie de caracteres para aprovechar todas las capacidades de Matlab. funcin syms sym double Salida Crea variables simblicas Convierte a variable simblica Convierte a variable numrica
Ejemplos: >syms x y b t; % Crea 4 variablas simblicas x, y, b, t >a=sym(pi) % Guarda en a la constante pi dato simblico a = pi >n=double(a) % Guarda en n el valor numrico de a n = 3.1416
62
Para obtener este resultado de B, Matlab busca expresiones racionales de grandes enteros (o irracionales si no encuentra lo anterior) que queden en el rango [num , num + ] donde num es el dato que va a convertir y = num eps siendo eps la precisin del dato. Si encuentra mas de una expresin simblica elige la mas prxima a num. Como se supone que num es un resultado numrico obtenido por clculos anteriores, no siempre se gana precisin pasando de numrico a simblico. Otra cosa es que se obtenga el valor de num desde un proceso enteramente simblico. Mas adelante veremos ejemplos de este hecho al estudiar la funcin vpa. La funcin sym tambin admite la forma S=sym(A,flag) que permite controlar el tipo de representacin simblica que asignar a S. Para ms detalles hacer >help sym
3.3.
Una vez denida una variable simblica, cualquier expresin vlida en Matlab que incluya dicha variable simblica y sea del tipo f=expresion hace que la variable f sea tambin una variable simblica. Si la expresin no se asigna a ninguna variable, entonces la variable por defecto ans se convierte en simblica por el momento. Tambin se puede denir una expresin simblica sin haber declarado previamente como simblicas las variables que contiene, por ejemplo: >clear, syms x, f=x^2+2*x+1 f = x^2+2*x+1 >g=z^2+1 g = z^2+1 % Crea expresin simblica f
Pese a que z no ha sido declarada explcitamente como variable simblica, se observa en el Workspace que g s tiene el tipo sym object. La forma de declarar g consiste en encerrar entre comillas simples la expresin, pero como ahora z no es sym object, cualquier referencia a esta variable deber hacerse tambin entre comillas simples (como si fuera una subexpresin simblica)
63
En el ejemplo anterior hemos encadenado en la misma lnea 3 comandos Matlab separados por una , (en vez de ;) porque nos interesa ver los resultados parciales y para ahorrar espacio en estos apuntes. Observad que la orden syms x no genera ninguna salida porque slo es una declaracin de variable simblica, no una asignacin a otra variable. Si ponemos >x=sym(x) s se produce una respuesta al asignar el carcter x a la variable simblica del mismo nombre. Este hecho es totalmente coherente con la declaracin de g. Nota: Si el carcter = aparece en una expresin simblica, dejamos de hablar de expresin para hablar de ecuacin simblica. En este caso el signo = no se considera una asignacin de valor a la variable de su izquierda, sino otro carcter de la expresin simblica.
3.3.1. Substituciones
Si en una expresin simblica queremos sustituir una variable por otra o por una constante para obtener su valor en un punto utilizamos la orden subs(f,antiguas,nuevas) Si hay que sustituir ms de una variable se ponen entre llaves separadas por comas. Por ejemplo, si queremos calcular f(3) y g(1) haramos: >subs(f,x,3), subs(g,z,1) ans = 15 ans = 2 Ntese la referencia a la variable z no declarada como sym. Si no ponemos las comillas simples el Matlab nos dir que la variable z no est denida ya que no ha recibido ningn valor ni est declarada como simblica.. Exemple 3.3.1. Construir f = ax2 + bx + c. Sustituir la variable x por t. Para a=2, b=1, c=0, obtener el valor de f cuando t=2. Para los mismos valores anteriores, obtener el valor de f para t=[1:4]. Solucin >syms x a b c t >f=a*x^2+b*x+c; >g=subs1(f,x,t) g = a*t^2+b*t+c >h=subs(g,{a,b,c},{2,1,0}) % 3 variables y 3 valores ==> llaves h = 2*t^2+t
64
Exemple 3.3.2. Realizar los cambios que se indican en las siguientes frmulas: a) En x3 + 2x + 5 ln(x) + 1 sustituir x por e. b) En x + cosx realizar el cambio de variable x = y 2 + 1 a) >> syms x >> subs(x^3+2*x+5*log(x)+1,exp(1)) >> ans = 31.5221 b) >> syms y >> subs(x+cos(x),y^2+1) >> ans = y^2+1+cos(y^2+1) Notad que la substitucin para obtener v no precisa llaves { y } pues los 4 valores reemplazan a la misma variable t y dan 4 respuestas. Por lo tanto se puede sustituir una variable por todo un vector o matriz de constantes denido previamente.
3.3.2.
Una expresin simblica puede contener varias variables simblicas y parmetros (sean o no simblicos). Por ejemplo F=a*t^2+b*t+c es la forma estndar de denir un polinomio de grado 2 en la variable t, siendo a, b y c 3 parmetros. Si queremos encontrar la forma simblica de las races de F=0 vamos a tener que denir como sym tanto t como a, b y c. Para saber qu variables simblicas hay denidas en una expresin, se usa la funcin findsym, que busca todas las variables sym de una expresin (o todas las denidas si no le damos ninguna expresin simblica y la versin de Matlab lo permite), exceptuando la constante pi y las variables i, j que Matlab usa para representar la parte imaginaria de un complejo. La salida de esta funcin es una lista de variables sym separadas por comas y ordenadas alfabticamente. A la que est ms cerca de la variable por defecto que es x, la llamamos en adelante nd1.Si hay dos a igual distancia de x se toma la primera posterior a x. La lista no es cclica, por lo que a es siempre la ms lejana a x. Es importante destacar que el propio Matlab llama a esta funcin cada vez que vamos a trabajar con una expresin simblica y no le indicamos explcitamente qu variable debe considerar como variable principal. En tal caso, Matlab considera como
65
variable principal nd1. Si queremos saber cual de todas las variables simblicas es nd1 en la expresin A, basta hacer findsym(A,1) Ejemplos: funcin ndsym(alpha+a+b) ndsym(cos(alpha)*b*x1 + 14*y,2) ndsym(y*(4+3*i) + 6*j) Salida a, alpha, b x1,y y nd1 b x1 y
3.4.
Resolucin de ecuaciones
Para resolver ecuaciones Matlab utiliza el comando solve con alguna de las siguientes sintaxis: solve(ecuacin, variable) Variable es el nombre de la incgnita que se quiere averiguar. Si la ecuacin tiene una nica variable, no es necesario escribirla. Si la ecuacin tiene la estructura f(x)=0 y la variable x est denida como simblica, el comando admite la siguiente estructura: solve(f(x),x) Exemple 3.4.1. Resolver las ecuaciones: 1. x2 + 2x + 1 = 0 2. x3 + 8 = 0 Solucin: si no lo habas hecho ya en otro ejercicio, debers denir la variable x como simblica. En caso contrario bastar con que escribas la ecuacin entre comillas simples. 1. >> solve(x^2+2*x+1) ans = -1 -1 >> solve(x^3+8) ans = -2 1+i*3^(1/2) 1-i*3^(1/2)
2.
66
>> [x,y] = solve(x^2 + x*y + y = 3,x^2 - 4*x + 3 = 0) x = 1 3 y = 1 -3/2 Las soluciones serian (1, 1) y (3, 3/2). Si la ecuacin que vamos a resolver esta igualada a 0 (= 0) estos se puede omitir. Obtendramos las mismas soluciones haciendo: >> [x,y] = solve(x^2 + x*y + y - 3,x^2 - 4*x + 3 ) x = 1 3 y = 1 -3/2 Si hacemos solve(p*x = r) decide que la incgnita es x y devuelve ans = r/p Si ahora hacemos >> S = solve(x^2+y^2 - 2*x - 1 = 0,x^2 - y^2 - 1 = 0) S = x: [4x1 sym] y: [4x1 sym] que serian
67
Si tenemos dos ecuaciones con tres incgnitas podemos calcular las soluciones de dos en funcin de la tercera. Esto es: >> [u,v] = solve(a*u^2 + v^2 = 0,u - v = 1) u = 1 - (a + (-a)^(1/2))/(a + 1) 1 - (a - (-a)^(1/2))/(a + 1) v = -(a + (-a)^(1/2))/(a + 1) -(a - (-a)^(1/2))/(a + 1)
3.5.
La funcin inline
Esta sirve para denir funciones denidas a trozos. En primer lugar veamos
68
69
70
Hay dos nociones distintas aunque relacionadas que son importantes para el Clculo: Una son las expresiones simblicas como sen x o x2. La otra son las reglas o algoritmos que permiten obtener una salida numrica a partir de unas entradas tambin numricas. La segunda denicin es ms general; sirve, por ejemplo, para denir una funcin f(x) como x2 si x es negativa o 0 y sen x si x es positiva. Por otro lado, cualquier expresin simblica implica una regla de evaluacin. Es decir, si sabemos que f (x) = x2 entonces sabemos que f (4) = 42 = 16. En MATLAB, la diferencia fundamental entre una funcin y una expresin simblica radica en que una funcin puede ser invocada con argumentos y una expresin simblica no. Por otra parte, una expresin simblica puede ser derivada mientras que una funcin no puede. En MATLAB las funciones son creadas de dos formas: como cheros .m y como funciones inline. La forma tpica de denir una expresin simblica es la siguiente: syms x f=x^2-sin(x) f = x^2-sin(x) Las dos lneas siguientes muestra que podemos derivar f, pero que no podemos evaluarla, al menos de una forma obvia. Ntese que MATLAB reconoce la variable. En caso de que haya varias variables simblicas, podemos especicar aquella respecto a la cual queremos derivar diff(f) ans = 2*x-cos(x) f(4) ??? Index exceeds matrix dimensions. Podemos evaluar f(4) sustituyendo x por 4 de la siguiente forma: subs(f,x,4) ans = 16.7568 Podemos tambin convertir f en una funcin inline con el comando: fin=inline(char(f)) fin = Inline function: fin(x) = x^2-sin(x)
71
Lo que est sucediendo aqu es que el comando inline requiere una cadena como entrada y char convierte f, expresin simblica, en la cadena x^2-sin(x). (Si simplemente hubiramos escrito fin=inline(f) obtendramos un mensaje de error puesto que f no es una cadena). La funcin inline n acepta ahora argumentos: fin(4) ans = 16.7568 De forma similar podemos construir una funcin a partir de la derivada de f: fxin=inline(char(diff(f))) fxin = Inline function: fxin(x) = 2*x-cos(x) La funcin MATLAB char reemplaza el argumento que recibe por la cadena que lo representa, hacindolo as accesible a funciones que requieren cadenas como argumento, como por ejemplo inline. Sin embargo, cuando char es aplicado a una expresin simblica, el resultado an es una expresin simblica y puede ser derivada: diff(char(f)) ans = 2*x-cos(x) La otra forma de crear una funcin evaluable es escribiendo una funcin en chero .m Esta es la forma principal de denir funciones en la mayor parte de aplicaciones de MATLAB. Recordemos que un chero .m se crea de forma separada. Supongamos que hemos escrito el chero .m fun1.m que contiene lo siguiente: function out=fun1(x) out=x^2-sin(x); Ahora la funcin fun1 puede ser invocada con un argumento: fun1(4) ans = 16.7568 Una de las cosas que podemos querer hacer con una funcin es representar su grca. La operacin ms elemental en MATLAB es dibujar un punto con unas coordenadas especcas: plot(4,4) La salida de este comando es el punto azul centrado en la gura. Para dibujar una curva MATLAB dibuja una secuencia de puntos conectados mediante segmentos de recta.
72
La entrada para tales dibujos consiste en dos vectores (listas de nmeros). El primer argumento es el vector de coordenadas x y el segundo el vector de coordenadas y. MATLAB conecta los puntos cuyas coordenadas aparecen en posiciones consecutivas de los vectores de entrada. Dibujemos la funcin que denimos en la transparencia anterior. En primer lugar se necesita un vector de coordenadas x: X1=-2:.5:2 X1 = Columns 1 through 7 -2.0000 -1.5000 -1.0000 -0.5000 0 0.5000 1.0000 Columns 8 through 9 1.5000 2.0000 X1 es un vector de nueve componentes, comenzando en -2 y avanzando hasta 2 con incrementos de 0,5. Ahora se debe preparar un vector de coordenadas y aplicando nuestra funcin sobre las coordenadas x. Para ello debemos modicar nuestra funcin de tal forma que pueda operar sobre las componentes individuales de un vector. La funcin MATLAB vectorize reemplaza los operadores *, ^ y / por .*, .^ y ./ respectivamente. Recordemos que MATLAB trabaja fundamentalmente sobre vectores y matrices, y su interpretacin por defecto de la multiplicacin, divisin y exponenciazin es que son operaciones sobre matrices. El punto antes del operador indica que se debe aplicar componente a componente. fin=inline(vectorize(f)) fin = Inline function: fin(x) = x.^2-sin(x) Y1=fin(X1) Y1 = Columns 1 through 7 4.9093 3.2475 1.8415 0.7294 0 -0.2294 0.1585 Columns 8 through 9 1.2525 3.0907 plot(X1,Y1)
3.6.
Tras conocer como representar funciones y algunos aspectos de clculo simblico en matlab, vamos a utilizarlos para trabajar en conceptos como clculo de dominios, lmites y continuidad de funciones.
73
8 4
x2 x 6 x2 x 6.
Exemple 3.6.1. Determinar el dominio de la funcin f (x) = >> sym x >> solve(x^2-x-6) >> ans = 3 -2
Los dos valores que anulan son x = 3 y x = 2. Dibujando el polinomio (Figura 3.1), detectamos cuando es positivo y cuando negativo. >> fplot(x^2-x-6,[-4 4 -8 5]); >> hold on; fplot(x*0,[-4 4 -8 5]) % Dibujo el eje x para % situar los cambios de % signo del polinomio. Esto es suciente para darse cuenta que ] , 2[ es positiva, ] 2, 3[ es negativa y ]3, +[ es positiva. Luego el dominio de f (x) es ] , 2[]3, + nf]. Si intentamos dibujar la grca de la funcin inicial (Figure 3.2), sin pensar en el dominio de la funcin, >> fplot(sqrt(x^2-x-6),[-4 4 -1 5]) Warning: Imaginary parts of complex X and/or Y arguments ignored. > In fplot at 158 Nos avisa de que estamos tomando valores de x que producen races de nmeros negativos, es decir, complejos, an as dibuja la grca, aunque podramos pensar que entre [2, 3] la funcin vale cero y eso no es cierto, pues en ese intervalo la funcin no existe.
74
1 4
x2 x 6
sto nos permite darnos cuenta que hay imagen para los x que caen dentro de ] , 2[]3, +], pero cuidado cmo ya he dicho antes, podramos pensar que entre [2, 3] la funcin vale cero y eso no es cierto, pues en ese intervalo la funcin no existe.
75
Como se observa en el cuadro anterior disponemos de todas las opciones. Veamos algunos ejemplos tras denir >clear, syms x a t h; funcin limit(sin(x)/x) limit((x-2)/(x^2-4),2) limit((1+2*t/x)^(3*x),x,inf) limit(1/x,x,0,right) limit(1/x,x,0,left) limit((sin(x+h)-sin(x))/h,h,0) Salida 1 1/4 exp(6*t) inf -inf cos(x)
Otro ejemplo. Si hemos hecho v = [(1 + a/x)^x, exp(-x)]; entonces: limit(v,x,inf,left) % debe dar [exp(a), 0]
con lo que hemos obtenido dos lmites simultneos ya que v tiene 2 expresiones simblicas (vector la de expresiones). Exemple 3.6.2. Para calcular l ( m >> >> >> >> 2 x + 3 (x+1) ) hemos de hacer x 2 x + 5 limit(((2*x+3)/(2*x+5))^(x+1)) ans = 3/5 limit(((2*x+3)/(2*x+5))^(x+1),x,inf) ans = exp(-1)
y resuelve la indeterminacin 1 . 1 Exemple 3.6.3. Calcular l m . x0 x Tal y como sabemos por teora, hay una divisin por cero y por tanto hay que estudiar lateralidad. Si calculamos con matlab el lmite total, se obtiene >> limit(1/x) >> ans = NaN lo que nos obliga a estudiar lateralidad para poder concluir.
76
Concluyendo como ya debemos saber que el lmite no existe, pues los laterales existen pero son distintos. 0 Veamos que Matlab resuelve perfectamente las indeterminaciones . 0 Exemple 3.6.4. Calcular l m x2 4 . x2 x 2
77
6 6
x2 + 3 1 x2 1
f(x) = (sqrt(x^2+3)-1)/(x^2-1) >> f(1) Warning: Divide by zero. > In inlineeval at 13 In inline.subsref at 25 >> ans = Inf >> f(-1) Warning: Divide by zero. > In inlineeval at 13 In inline.subsref at 25 >> ans = Inf Notemos que la funcin no est denida en x = 1 y tampoco en x = 1. >> syms x % Necesario para utilizar limit. >> limit((sqrt(x^2+3)-1)/(x^2-1),x,1) >> ans = NaN Estudio lateralidad, >> limit((sqrt(x^2+3)-1)/(x^2-1),x,1,right) >> ans = Inf >> limit((sqrt(x^2+3)-1)/(x^2-1),x,1,left) >> ans = -Inf
78
Este estudio me permite concluir que en x = 1 hay una discontinuidad asinttica. Hacemos lo mismo en el punto x = 1. >>limit((sqrt(x^2+3)-1)/(x^2-1),x,-1) >> ans = NaN Estudio lateralidad, >> limit((sqrt(x^2+3)-1)/(x^2-1),x,-1,right) >> ans = -Inf >> limit((sqrt(x^2+3)-1)/(x^2-1),x,-1,left) >> ans = Inf ca. Este estudio me permite concluir que en x = 1 hay una discontinuidad asintti-
(3.1)
Estudiamos el dominio de la funcin: >>f=inline(1./(x+1).*(x<2)+(2*x+2).*(x>=2)) f = Inline function: f(x) = 1./(x+1).*(x<2)+(2*x+2).*(x>=2) >> f(-1) Warning: Divide by zero. > In inlineeval at 13 In inline.subsref at 25 >> ans = Inf >> f(2) >> ans = 6 Si x = 1, la funcin no est denida, >> x=-3:0.01:3; >> y=1./(x+1).*(x<2)+(2*x+2).*(x>=2); Warning: Divide by zero. >> plot(x,y,*);grid on
79
80
60
40
20
20
40
60
80
100 3
Figura 3.4: funcin 3.1 Aparentemente se ve una discontinuidad (Figure 3.4) asinttica y otra de salto nito. Estudio analtico: Lo primero es denir la variable independiente x como simblica para que el comando limit funcione adecuadamente. >> syms x Como no disponemos de una funcin simblica que almacene la funcin a trozos f (x), para calcular los lmites laterales, debemos de elegir manualmente la expresin analtica (rama) que le corresponde a la funcin segn nos acercamos a 2 por la derecha o por la izquierda, y lo mismo con el 1. >> limit(1/(x+1),x,2,left) >> ans = 1/3 >> limit(2*x+2,x,2,right) >> ans = 6 Discontinuidad de salto nito en x = 2. >> limit(1/(x+1),x,-1,left) >> ans = -Inf >> limit(1/(x+1),x,-1,right) >> ans = Inf Discontinuidad asinttica en x = 1.
80
0.8
0.6
0.4
0.2
0.2
0.4
0.6
0.8
1 6
Figura 3.5: funcin (3.2) Exemple 3.6.7. Estudiar la continuidad de la funcin f (x) = sin(x) si x < cos(x) si x > (3.2)
Si la funcin presenta alguna discontinuidad sta ocurrir en l punto de ruptura x = . Represento la funcin en [6, 6], denindola como funcin a trozos, >> x=-6:0.01:6; >> y=sin(x).*(x<pi)+cos(x).*(x>=pi); >> plot(x,y,*) Muestra claramente (Figura 3.5) la discontinuidad de salto nito en x = . Para estudiar la discontinuidad analticamente, necesitamos estudiar el valor de la funcin en el punto y los lmites laterales. >> f=inline(sin(x).*(x<pi)+cos(x).*(x>=pi)) f = Inline function: f(x) = sin(x).*(x<pi)+cos(x).*(x>=pi) >> f(pi) >> ans = -1 Lo primero es denir la variable independiente x como simblica para que el comando limit funcione adecuadamente. >> syms x Ahora no disponemos de una funcin simblica que almacene la funcin a trozos f (x). Para calcular los lmites laterales, del mismo modo, debes de elegir t la expresin analtica (rama) que le corresponde a la funcin segn te acerques a por la derecha o por la izquierda,
81
30
20
10
10
20
30 6
Figura 3.6: funcin (3.3) >> limit(cos(x),x,pi,right) >> ans = -1 Si vamos por la derecha de , la funcin que debo coger es cos(x). >> limit(sin(x),x,pi,left) >> ans = 0 Si vamos por la izquierda de , la funcin que debo coger es sin(x). Por tanto, se concluye que la funcin es continua slo a la izquierda de , presentando en x = una discontinuidad de salto nito. Exemple 3.6.8. Estudiar la continuidad de la funcin si x < 1 2x 8x + 7 si x 1 Representamos la funcin a trozos, >> x=-6:0.01:6; >> y=(-3.*(x+1)./(2*x.^2-x-6)).*(x<1)+(2*x.^2-8*x+7).*(x>=1); Warning: Divide by zero. >> plot(x,y,*);grid on Observamos (Figura 3.6) un punto de discontinuidad asinttica, que estar en un valor que anula un denominador, y luego habr que llevar cuidado tambin con el punto de ruptura x = 1. Estudiamos si dentro del conjunto x < 1 hay algn valor que anule el denominador 2 x2 x 6.
3(x+1) 2x2 x6 2
(3.3)
3.7. SIMPLIFICADORES
>> solve(2*x^2-x-6) >> ans = 2 -3/2
82
Efectivamente el punto x = 3/2 cae dentro de los menores que 1 y de x = 2 me olvido. Estudio analtico entorno al punto x = 3/2: >> syms x >> limit((-3*(x+1)/(2*x^2-x-6)),x,-3/2,left) >> ans = Inf >> limit((-3*(x+1)/(2*x^2-x-6)),x,-3/2,right) >> ans = -Inf Discontinuidad asinttica en x = 3/2. Estudio del punto de ruptura, x = 1: >> limit((-3*(x+1)/(2*x^2-x-6)),x,1,left)>> ans = 6/5 >> limit(2*x^2-8*x+7,x,1,right) >> ans = 1 Discontinuidad de salto nito en x = 1.
3.7.
Simplicadores
Supongamos que F es una expresin simblica con la forma F=P*exp(sqrt(3*x^2/a^4)), donde P representa un polinomio en la variables x que puede tener grado elevado. Si estamos buscando extremales (mximos y mnimos relativos) de F debemos anular su derivada. Pero en ella va a aparecer la exponencial multiplicando a cada trmino del polinomio resultante y sabemos que esta exponencial nunca podr anularse en el rango de los reales. Resulta pues intil derivar F y endosarle todo el mogolln que salga a cualquier resolvedor simblico de ecuaciones, bajo la excusa de que si lo puede hacer l, para qu tengo que hacer yo el trabajo?. Nos podemos encontrar sorpresas inesperadas y no sern aceptables quejas del tipo aes que a m se me ha colgado! o esta otra aes que mi ordenador va muy lento!. Hay que buscar una forma de denir esa exponencial como una subexpresin simblica, luego pedir que simplique o factorize con esa subexpresin y, nalmente, buscar los ceros del otro factor. El Matlab dispone de varias funciones simplicadoras que deben aplicarse en los procesos de derivacin e integracin (sobretodo en el primero). Estas son:
3.7. SIMPLIFICADORES
Uso del comando simplify.
83
Matlab permite hacer clculos algebraicos como simplicar, factorizar o expandir. Algunas simplicaciones sencillas las efecta directamente el programa. El comando que permite simplicar una expresin es simplif y, su sintaxis es: simplif y(expresion) donde las variables debern denirse previamente como simblicas. Exemple 3.7.1. Simplicar las siguientes expresiones: a) x3 + 5xy 5x3 11xy y 3 b) c) (x2 4)(x + 5) x+2 x2 x+4 + 7x + 12
d) sin2 x + cos2 x En el primer apartado bastar con escribir la frmula, tras denir las dos variables x e y como simblicas >> syms x y >> x^3+5*x*y-5*x^3-11*x*y-y^3 >> ans = -4*x^3-6*x*y-y^3 En el apartado b) necesito que recurra a una identidad notable, la suma por diferencia, diferencia de cuadrados, luego requiere del comando simplif y, >> simplify((x^2-4)*(x+5)/(x+2)) % prueba sin usar simplify y vers % cmo no realiza el clculo. >> ans = (x+5)*(x-2) En el c) se requiere el comando simplif y, porque el polinomio del denominador no est factorizado. >> simplify((x+4)/(x^2+7*x+12)) >> ans = 1/(x+3) En el d) tambin, porque la frmula contiene funciones trigonomtricas: >> simplify(sin(x)^2+cos(x)^2)>> ans = 1 Prueba sin usar simplify y vers cmo no efecta el clculo.
3.7. SIMPLIFICADORES
Uso del comando pretty.
84
Si se quiere que la frmula simplicada aparezca de una forma similar a como se escribe con el lenguaje matemtico ordinario se utiliza el comando pretty, de sintaxis: pretty(expresion) Exemple 3.7.2. Simplicar la expresin (x + 3)(x + 5) + 1 + 3 expresando el x+2 resultado como una funcin racional (cociente de dos polinomios). >> pretty((x+3)*(x+5)+1+3/(x+2)) 3 (x + 3) (x + 5) + ----- + 1 x + 2 Uso del comando factor El comando factor permite expresar un polinomio con coecientes racionales como producto de polinomios de menor grado con coecientes racionales. Su sintaxis es f actor(expresion) En el caso de que el polinomio tenga races complejas, aparecer como factor el producto de cada raz por su conjugada (es decir, el polinomio con coecientes reales). Exemple 3.7.3. Factorizar x6 + 1 y ((x + 3)(x + 4) (x + 2)2 )2 >> factor(x^6+1) >> ans = (x^2+1)*(x^4-x^2+1) >> factor(((x+3)*(x+4)-(x+2)^2)^2) >> ans = (3*x+8)^2 Uso del comando expand. expand(S) escribe cada elemento de una expresin simblica S como una producto de sus factores. se suele utilizar en los polinomios, aunque tambim espande las funciones trigonomtricas, exponenciales y logartmicas. El comando que realiza una serie de operaciones cuando su ejecucin no se corresponde necesariamente con una simplicacin de la frmula o cuando hay otra frmula que permite escribir la expresin de otro modo es expand. Su sintaxis es expand(expresion)
85
El comando simple sirve para que el sistema combine frmulas matemticas y exprese el resultado de la forma ms simple. Sintaxis simple(expresion) >> syms x >> p=simple(sin(x)^2+cos(x)^2); >> p p = 1 Tal y como hemos visto con el paquete simblico podemos calcular lmites, ahora vamos a utilizarlo para derivar.
3.8.
Clculo de derivadas.
Para calcular la derivada de orden n de una funcin de una variable se utiliza el comando diff cuya sintaxis es, diff(f,variable,n) que calcula la derivada de orden n de la funcin (expresin simblica) f , respecto de la variable escogida. Si no se especica el orden de la derivada, calcula la derivada primera. Si no se especica la variable y en la frmula de la funcin aparece la x, derivar respecto de esa variable. Si la funcin depende de una nica variable, no es necesario especicar sta para calcular la derivada. Exemple 3.8.1. Calcular d 2 d2 (x + cos(x + 1) sin(x2 )) y 2 (x ln(x)) dx dx
86
Para que salga en formato matemtico basta con enlazar con el comando pretty >> pretty(diff(x^2+cos(x+1)*sin(x^2),x)) 2 2 2 x - sin(x + 1) sin(x ) + 2 cos(x + 1) cos(x ) x Para la segunda derivada >> pretty(diff(x*log(x),x,2)) 1/x Estudio de la derivabilidad de una funcin. Recordemos que si f (x) es una funcin denida en un intervalo [a, b[, si existe el f (x0 + h) f (x0 ) y es nito para todo x0 [a, b[, a dicho lmite se le llama l + m h0 h derivada por la derecha en el punto x0 , y se representa por:
f+ (x0 ) = l + m h0
Anlogamente si f (x) est denida en el intervalo ]a, b], se dene la derivada por la izquierda en el punto x0 , ]a, b] cmo:
f (x0 ) = l m h0
Teniendo denidas la derivada por la derecha y por la izquierda, concluimos que, f (x) es derivable en un punto x0 si su derivada por la derecha y por la izquierda existen y coinciden, es decir cuando existe el lmite total, y entonces la derivada de f (x) en el punto x0 es: f (x0 + h) f (x0 ) , f (x0 ) = f+ (x0 ) = f (x0 ) h Vamos a utilizar lo que sabemos de Matlab para estudiar si una funcin es derivable en un punto. f (x0 ) = l m
h0
Exemple 3.8.2. Calcula la derivada de la funcin f (x) = 4x2 5x + 7 haciendo uso de la denicin y del comando diff. >> syms x h >> f=4*x^2-5*x+7 % Guardamos en f la funcin. f = 4*x^2-5*x+7 >> g=(subs(f,x+h)-f)/h % Guardamos en g el cociente incremental % que hay que calcular en la definicin % de derivada en un punto.
87
>>
>>
>> >>
g = (4*(x+h)^2-5*h-4*x^2)/h g=expand(g) % Desarrollamos con el comando expand. g = 8*x+4*h-5 der_f=limit(g,h,0) % Calculo el lmite de g cuando h % tiende a cero, es decir, la % derivada, la guardo en der_f. der_f = 8*x-5 diff(f) % Ahora hago uso del comando diff, el resultado % debe ser el mismo. ans = 8*x-5
Exemple 3.8.3. Estudiemos la derivabilidad de la funcin valor absoluto f (x) = |x| en el punto x = 0. >> syms x h % Necesitamos dos variables simblicas, x y h. >> f=abs(x) % Guardamos en f la funcin valor absoluto de x. f =abs(x) >> g=(subs(f,0+h)-subs(f,0))/h % Guardamos en g el cociente % incremental que hay que % calcular en la definicin % de derivada en un punto. g =abs(h)/h >> limit(g,h,0,right) % Derivada por la derecha. >> ans = 1 >> limit(g,h,0,left) % Derivada por la izquierda. >> ans = -1 Al ser distintas la funcin no es derivable en 0. Si directamente realizamos el clculo de la derivada del valor absoluto con diff >> diff(abs(x)) >> ans = sign(x) Si sustituyo la derivada en x = 0 >> subs( diff(abs(x)),0) >> ans =0
88
7000
6000
5000
4000
3000
2000
1000
1000
2000 5
Figura 3.7: funcin 3.4 nos dice que no es derivable pero no aporta informacin de las derivadas a la derecha y a la izquierda. Exemple 3.8.4. Estudiar la derivada de la funcin f (x) =
x3 , x2 2 2x6 , x2
x2 x>2
(3.4)
en x = 2. Empiezo dibujando la funcin a ver la informacin que obtengo, >> x=-5:0.001:5; >> y=(x-3)./(x.^2-2).*(x<=2)+(2*x-6)./x.^2.*(x>2); Warning: Divide by zero. >> plot(x,y,.) Observamos en la Figura 3.7 dos discontinuidades asintticas. En el punto x = 2, es aparentemente continua, lo estudio analticamente. Hallo el valor de f (2), recordad que como es una funcin a trozos puedo usar inline, o bien puedo usar el comando subs, eligiendo manualmente la rama que corresponde a x = 2. Como me interesan clculos simblicos, voy a denir la x como simblica y por tanto debo de usar, el comando subs para hallar f (2). Si elijo la rama manualmente. >> syms x >> subs((x-3)/(x^2-2),x,2) >> ans = -0.5000 Con el comando inline,
89
Por tanto, funcin es continua en x = 2, puede ser derivable o no serlo. Estudio la derivabilidad en x = 2: Debo de calcular f (2 + h) para h > 0 y para h < 0, encontrndonos con el problema de siempre, al no disponer de una funcin simblica que almacene f (x) de forma simblica, debemos calcular f (2 + h) eligiendo manualmente la rama que toca, segn vamos por la derecha o por la izquierda de 2. >> >> >> >> syms x h rama_izq=(x-3)/(x^2-2); g=(subs(rama_izq,x,2+h)-f(2))/h g = ((-1+h)/((2+h)^2-2)+1/2)/h >> limit(g,h,0,right) >> ans = 3/2 La derivada por la izquierda en x = 2 vale 3/2 (f (2) slo sabr lo que es si deniste f con inline) >> rama_dcha=(2*x-6)/x^2; >> g=(subs(rama_dcha,x,2+h)-f(2))/h >> g = ((-2+2*h)/(2+h)^2+1/2)/h >> limit(g,h,0,left) >> ans = 1 La derivada por la derecha de x = 2 vale 1. Por tanto, la funcin es continua en x = 2 pero no es derivable en x = 2.
3.9.
Exemple 3.9.1. Determinar los mximos-mnimos y puntos de Inexin de la funcin 1 f (x) = e x . Debemos saber que el dominio de la funcin es R\{0}. Puedo empezar dibujando la funcin, a ver la informacin que me aporta la grca, para despus corroborar dicha informacin analticamente. >> fplot(exp(1/x),[-10 10 -1 8])
1 10
10
Figura 3.8: funcin f (x) = e x . La grca (Figura 3.8) me indica que no hay ni mximos ni mnimos relativos; parece que existe un punto de inexin a la izquierda del cero? syms x f=exp(1/x); der_f=diff(f,x) der_f = -1/x^2*exp(1/x) >> solve(der_f,x) Warning: Explicit solution could not be found. > In solve at 140 In sym.solve at 49 >> ans = [ empty sym ]
1 La derivada es x2 e x que no se anula en el dominio de la funcin. De ah que no posea ni mximos ni mnimos relativos. Calculo la derivada segunda, para determinar los puntos de Inexin:
1
25
20
15
10
0 A 5 5 0 5 C 10 15 B 20
Figura 3.9: Dibujo exemple 3.9.2 Exemple 3.9.2. Un hombre conduce un vehculo y debe atravesar un terreno cenagoso. Se encuentra en un puto P a 32 Km del punto ms prximo (lnea recta) de una carretera (punto A) y desea llegar en el menor tiempo posible a un punto B que se encuentra a 16 Km de A, en la lnea de la carretera. A cuntos Km de A debe llegar a la carretera (punto C) si conduce a una velocidad a 48 Km/h por el terreno cenagoso y a 80 Km/h por la carretera? (ver Figura 3.9) Debemos de obtener la funcin a minimizar en trminos de una nica variable, y a partir de ah utilizar matlab como herramienta para determinar su mnimo absoluto.
93
Ejercicio 3.9.6. Dos postes con longitudes 6 y 8 m. se colocan verticalmente sobre el suelo con sus bases separadas por una distancia de 10 m. Calcular la longitud mnima de un cable que vaya desde la punta de uno de los postes hasta un punto en el suelo entre los dos postes y luego hasta la punta del otro poste.
3.10.
An no hemos hablado de la integracin. MATLAB dispone de un integrador simblico, denominado int, que puede integrar fcilmente f=x^2-sin(x): sol=int(f,0,2) sol = 5/3+cos(2) Sin embargo, si reemplazamos f por la funcin h denida de la siguiente forma: h=sqrt(x^2-sin(x^4)) h = (x^2-sin(x^4))^(1/2) int ser incapaz de evaluar la integral: int(h,0,2) Warning: Explicit integral could not be found. > In C:\MATLABR11\toolbox\symbolic\@sym\int.m at line 58 ans = int((x^2-sin(x^4))^(1/2),x = 0 .. 2) Sin embargo, si escribimos double (indicando nmeros de doble precisin) antes de la expresin integral, MATLAB retornar el resultado de una integracin numrica. double(int(h,0,2)) Warning: Explicit integral could not be found. > In C:\MATLABR11\toolbox\symbolic\@sym\int.m at line 58 ans = 1.7196 Podemos comprobar la plausibilidad de esta respuesta dibujando h entre 0 y 2 y estimando el rea bajo la curva: ezplot(h,[0,2]);grid
94
1.5
0.5
0.2
0.4
0.6
0.8
1 x
1.2
1.4
1.6
1.8
x2 sin(x4 )
El valor numrico retornado por MATLAB (Figura 3.10) es algo menos que la mitad del rea de un cuadrado de 2 unidades de lado lo cual es consistente con nuestro grco. La integracin numrica invocada por la combinacin de double e int no es nativa, esto es no es propio sino de MAPLE del cual han sido tomadas las rutinas de clculo simblico de MATLAB. MATLAB tambin dispone de un integrador numrico denominado quadl. Las rutinas double(int(...)) y quadl(...) proporcionan respuestas ligeramente distintas. quadl(inline(vectorize(h)),0,2) ans = 1.7196 Para derivar e integrar una expresion simbolica f, disponemos de las instrucciones diff e int, que actuan como sigue: int(f) Calcula una primitiva de f respecto de la variable simbolica preferente. int(f,s) Calcula una primitiva de f respecto de la variable s. int(f,a,b) Calcula la integral denida de f respecto de la variable simbolica r preferente. int(f,s,a,b) Calcula la integral denida de f respecto de la variable s. r Nota: Por defecto, la variable preferente en una expresion simbolica es la letra x. Si esta no interviene en la expresion, se toma la letra minuscula mas proxima a ella segun el orden alfabetico y que no sea ni la i ni la j. En caso de que haya dos (una anterior y otra posterior), se considera variable preferente el caracter posterior. Exemple 3.10.1. Construyanse las expresiones simbolicas f = ax + b y g = y2 + z y calculense:
95
gdz
Solucion >> syms a b x; >> f=a*x+b;g=y^2+z;% practicamos los dos modos de definir expresiones >> I1=int(f) % integra respecto de la variable preferente x I1 = 1/2*a*x^2+b*x >> I2=int(f,a) % integra respecto de a I2 = 1/2*a^2*x+b*a >> I3=int(g) % integra respecto de la variable preferente y. % Equivale a int(g,y). I3 = 1/3*y^3+z*y >> I4=int(g,z,0,1) % integra respecto de la variable z. I4 = y^2+1/2