atan(x) arco tangente sinh(x) seno hiperbólico cosh(x) coseno hiperbólico tanh(x) tangente hiperbólica asinh(x) arco seno hiperbólico acosh(x) arco coseno hiperbólico atanh(x) arco tangente hiperbólica log(x) logaritmo natural log10(x) logaritmo decimal exp(x) función exponencial sqrt(x) raíz cuadrada sign(x) devuelve -1 si <0, 0 si =0 y 1 si >0 rem(x,y) resto de la división (2 argumentos que no tienen que ser enteros) round(x) redondeo hacia el entero más próximo floor(x) valor entero más próximo hacia parte entera) abs(x) valor absoluto. Prácticas de Matemática Aplicada En la práctica de hoy estudiaremos (algunas de ) las posibilidades de cálculo numérico y representación gráfica con MATLAB. Para transformar y evaluar numéricamente un conjunto de datos los organizaremos cómo vectores. El cálculo matricial es uno de los puntos fuertes de este programa. OPERACIONES BÁSICAS CON MATRICES Y VECTORES Los operadores matriciales de MATLAB son los siguientes: + adición o suma – sustracción o resta .* producto elemento a elemento y ./división elemento a elemento .^ elevar a una potencia elemento a elemento Con el fin de familiarizarse con este tipo de notación, se puede probar la siguiente secuencia de instrucciones en MATLAB observando detenidamente los resultados: >> v= [1 2 3] >> w= [-1 0 3] >> a=v.*w >> v.^2 >> w./v >> v./w En MATLAB los números reales son almacenados en 8 bytes. Es importante saber cómo trabaja MATLAB con estos números y los casos especiales que presentan. MATLAB mantiene una forma especial para los números muy grandes (más grandes que los que es capaz de representar), que son considerados como infinito. Por ejemplo, obsérvese cómo responde el programa al ejecutar el siguiente comando: » 1.0/0.0 Warning: Divide by zero ans = Inf Así pues, para MATLAB el infinito se representa como inf ó Inf. MATLAB tiene también una representación especial para los resultados que no están definidos como números. Por ejemplo, ejecútense los siguientes comandos y obsérvense las respuestas obtenidas: » 0/0 Warning: Divide by zero ans = NaN » inf/inf ans = NaN Notar que hemos intentado dividir por cero y por eso MATLAB nos da un error. FUNCIONES MATEMÁTICAS ELEMENTALES QUE OPERAN DE MODO ESCALAR (componente a componente) Estas funciones, que comprenden las funciones matemáticas trascendentales y otras funciones básicas, actúan sobre cada elemento de la matriz como si se tratase de un escalar. Se aplican de la misma forma a escalares, vectores y matrices. Algunas de las funciones de este grupo son las siguientes: sin(x) seno cos(x) coseno tan(x) tangente asin(x) arco seno acos(x) arco coseno 1 En ambos casos la respuesta es NaN, que es la abreviatura de Not a Number. Este tipo de respuesta, así como la de Inf, son enormemente importantes en MATLAB, pues permiten controlar la fiabilidad de los resultados de los cálculos matriciales. Los NaN se propagan al realizar con ellos cualquier operación aritmética, en el sentido de que, por ejemplo, cualquier número sumado a un NaN da otro NaN. MATLAB tiene esto en cuenta. Algo parecido sucede con los Inf. GRÁFICAS GRÁFICOS BIDIMENSIONALES Los gráficos 2-D de MATLAB están fundamentalmente orientados a la representación gráfica de vectores (y matrices). En el caso más sencillo los argumentos básicos de la función plot van a ser vectores. Cuando una matriz aparezca como argumento, se considerará como un conjunto de vectores columna (en algunos casos también de vectores fila). FORMATOS NUMÉRICOS Matlab trabaja com más digitos de los que vemos normalmente en pantalla. La constante se obtiene en MATLAB con >> pi probamos ahora a cambiar el formato >>format long >> pi Funciones gráficas 2D elementales MATLAB dispone de cuatro funciones básicas para crear gráficos 2-D. Estas funciones se diferencian principalmente por el tipo de escala que utilizan en los ejes de abscisas y de ordenadas. Estas cuatro funciones son las siguientes: plot() crea un gráfico a partir de vectores y/o columnas de matrices, con escalas lineales sobre ambos ejes. loglog() ídem con escala logarítmica en ambos ejes semilogx() ídem con escala lineal en el eje de ordenadas y logarítmica en el eje de abscisas semilogy() ídem con escala lineal en el eje de abscisas y logarítmica en el eje de ordenadas Podemos volver al formato original con >>format EL OPERADOR DOS PUNTOS (:) El operador dos puntos (:) realiza en MATLAB dos funciones distintas: Por una parte permite definir secuencias de números igualmente espaciados (progresión aritmética). Por otra permite hacer referencia a todos los elementos de una fila o una columna de una matriz, pero no estudiaremos esta última. Funciónes PLOT y FPLOT Plot es la función clave de todos los gráficos 2-D en MATLAB. Ya se ha dicho que el elemento básico de los gráficos bidimensionales es el vector. La función plot(), en sus diversas variantes, no hace otra cosa que dibujar vectores. Generación de secuencias de números. Es posible generar mediante MATLAB una progresión aritmética de una forma sencilla (sin utilizar la función linspace()). Por ejemplo, para generar la secuencia [1 3 5 7 9 11 13 15 1 basta con escribir en MATLAB >> 1:2:17 que tiene el siguiente significado general: límite inferior:espaciado:límite superior. En el caso en que el espaciado sea 1 se puede omitir. Así para generar la secuencia [-1 0 1 2 3 4 5 6 7 8 puede hacerse >> -1:1:9 o bien >> -1:9 Una forma de utilizar la función plot() es con dos vectores como argumentos. En este caso los elementos del segundo vector se representan en ordenadas frente a los valores del primero, que se representan en abscisas. Véase por ejemplo cómo se puede dibujar un cuadrilátero de esta forma (obsérvese que para dibujar un polígono cerrado el último punto debe coincidir con el primero): >> x=[1 6 5 2 1]; y=[1 0 4 3 1]; >> plot(x,y) En realidad, el conjunto básico de argumentos de la función plot es una tripleta formada por dos vectores y una cadena de de caracteres que indica el color y el tipo de marcadores para los puntos y el tipo de línea. Por ejemplo: 2 >> x=[1 6 5 2 1]; y=[1 0 4 3 1]; >> plot(x,y,’r-o’) dará como resultado el cuadrilátero en color rojo y los vértices señalados con círculos. En las siguientes columnas se pueden observar distintas posibilidades. y yellow . point - solid m magenta o circle : dotted c cyan x x-mark -. dashdot r red + plus -- dashed g green * star b blue s square w white d diamond k black v triangle(down) ^ triangle(up) < triangle(left) > triangle (right) p pentagram h hexagram Ver el resultado de >> fplot('sin(x)',[0 2*pi -1 1]) >> fplot('sin(x)',[0 2*pi -2 2]) Dibujo de curvas en paramétricas Para dibujar la elipse c(t)=(2cost, 3sint), o<t<2pi, escribimos » t=0:.1:2*pi; x=2*cos(t); y=3*sin(t); plot(x,y) Dibujo de curvas en polares Para dibujar una gráfica en coordenadas polares se usa el comando polar(theta, rho). Theta es el ángulo en radianes y rho la distancia al origen. Ejemplo: mediante >> t=linspace(0, 2*pi, 40) >> r=linspace(2, 2, 40) >> polar(t, r) se obtiene una circunferencia de radio 2. La función plot() permite también dibujar múltiples curvas introduciendo varias parejas de vectores como argumentos. En este caso, cada uno de los segundos vectores se dibujan en ordenadas como función de los valores del primer vector de la pareja, que se representan en abscisas. Si el usuario no decide otra cosa, para las sucesivas líneas se utilizan colores que son permutaciones cíclicas del azul, verde, rojo, cyan, magenta, amarillo y negro. Obsérvese bien cómo se dibujan el seno y el coseno en el siguiente ejemplo: >> x=0:pi/25:6*pi; >> y=sin(x); z=cos(x); >> plot(x,y,x,z) y como podemos variar el aspecto con >> plot(x,y,’co’,x,z,’m:’) El comando fplot( ‘fun’, [min,max]) proporciona un modo directo de dibujar la gáfica de una función. El primer argumento hace referencia a la función y el segundo al control de los ejes. Así se obtiene la gráfica de la función fun que se introduce como primer argumento, en el intervalo del eje x que se indica como segundo argumento. Ejemplo: Mediante >> fplot('sin(x)’,[0 2*pi]) Se obtiene la gráfica de la función seno en el intervalo [0 2*pi] Ejemplo: Ver el resultado de >> t=linspace(0, 2*pi, 100) >> r=2+3*sin(t); >> polar(t,r) Control de los ejes También en este punto MATLAB tiene sus opciones por defecto, que en algunas ocasiones puede interesar cambiar. El comando básico es el comando axis. Por defecto, MATLAB ajusta la escala de cada uno de los ejes de modo que varíe entre el mínimo y el máximo valor de los vectores a representar. Este es el llamado modo "auto", o modo automático. Para definir de modo explícito los valores máximo y mínimo según cada eje, se utiliza el comando: axis([xmin, xmax, ymin, ymax]) mientras que : axis(’auto’) devuelve el escalado de los ejes al valor por defecto o automático. Si se desea el control de ambos ejes el segundo argumento será de la forma [xmin, xmax, ymin, ymax]. Ejemplo: 3 Existen además otras funciones orientadas a añadir títulos al gráfico, a cada uno de los ejes, a dibujar una cuadrícula auxiliar, a introducir texto, etc. Estas funciones son las siguientes: title('título') añade un título al dibujo xlabel('tal') añade una etiqueta al eje de abscisas. Con xlabel off desaparece ylabel('cual') añade una etiqueta al eje de ordenadas. Con ylabel off desaparece text(x,y,'texto') introduce 'texto' en el lugar especificado por las coordenadas x e y. Si x e y son vectores, el texto se repite por cada par de elementos. gtext('texto') introduce texto con ayuda del ratón: el cursor cambia de forma y se espera un clic para introducir el texto en esa posición. Con grid se activa la inclusión de una cuadrícula en el dibujo. Con grid off desaparece la cuadrícula Para ver el funcionamiento de la función grid, se comenzará creando un par de vectores x e y con los que trabajar: >> x=[-10:0.2:10]; y=sin(x); Ahora se deben ejecutar los comandos siguientes (se comienza cerrando la ventana activa, para que al crear la nueva ventana aparezca en primer plano): >> title('Función seno(x) -en rojo- y función coseno(x) -en verde-') >> xlabel('ángulo en radianes'), figure(gcf) >> ylabel('valor de la función trigonométrica'), figure(gcf) >> axis([-12,12,-1.5,1.5]), figure(gcf) >> close >> grid >> plot(x,y) Se puede observar la diferencia con la secuencia que sigue: >> close >> plot(x,y) >> grid fzero('fun',x0) encuentra un cero de fun próximo al valor x introducido. El argumento fun es una función de las que dispone MATLAB u otra definida previamente por el usuario. El argumento x0 puede ser un número o un vector con dos coordenadas. Si x0 es un vector con dos coordenadas, fzero('fun', x0) supone que las coordenadas de x0 son los extremos de un intervalo donde la función cambia de signo (recordar que si la función es copntínua por el teorema de Bolzano existe al menos una raíz). Si x0 es un número, fzero('fun', x0) usa dicho número como una primera estimación del cero y busca un intervalo que lo contenga donde la función cambie de signo. En cualquier caso x0, se puede encontrar, por ejemplo, dibujando la función. RESOLUCIÓN DE ECUACIONES ALGEBRÁICAS Para calcular las raíces de ecuaciones MATLAB dispone de la función fzero Se trata de una función de función. Su objetivo es obtener un valor donde una determinada función no simplemente se anula sino que corta el eje x. ( un cero) Se trata siempre de una función de una variable. La sintaxis es la siguiente: En el primer caso MATLAB ha creado la cuadrícula en una ventana nueva y luego la ha borrado al ejecutar la función plot. En el segundo caso, primero ha dibujado la función y luego ha añadido la cuadrícula. Esto es así porque hay funciones como plot que por defecto crean una nueva figura, y otras funciones como grid que se aplican a la ventana activa modificándola, y sólo crean una ventana nueva cuando no existe ninguna ya creada. fzero('fun',x,tol). Los dos primeros argumentos son los mismos que en el caso anterior. El tercer argumento sirve para fijar el máximo error permitido en la estimación. Si no se introduce este último argumento, automáticamente fzero('fun',x) interpreta que es eps. Para practicar un poco con todo lo que se acaba de explicar, ejecútense las siguientes instrucciones de MATLAB, observando con cuidado los efectos de cada una de ellas en la ventana activa. El comando figure(gcf) (get current figure) hace visible la ventana de gráficos desde la ventana de comandos. Observación. La sentencia fzero('abs(x)+1', 1) no emite respuesta ya que no es posible encontrar un intervalo que contenga al 1, donde la función cambia de signo. El comando fzero es un fichero .m. El algoritmo fue diseñado por T. Dekker y usa una combinación del método de bisección, del método de la secante y métodos de interpolación cuadrática inversa. >> x=[-4*pi:pi/20:4*pi]; >> plot(x,sin(x),'r',x,cos(x),'g') 4 Limitaciones de fzero. No sirve para encontrar posibles valores donde la función se anula sin cambiar de signo. function y=f(x) y=1./(x.^3-2*x-5); y despues lo guardaremos en nuestra partición de disco en la carpeta matapl con el nombre ejint.m Y ejecutamos: Veamos algún ejemplo. Queremos encontrar una aproximación a un cero del polinomio x5-2x2-6x+2. Para ello en primer lugar dibujaremos la gráfica usando >>fplot('x.^5-2*x.^2-6*x+2',[-5,5]) y como observamos que 0.5 está cerca del cero podemos usar ahora: >>fzero('x.^5-2*x.^2-6*x+2',0.5) o también podríamos usar >>fzero('x.^5-2*x.^2-6*x+2',[0,1]) ya que la función cambia de signo en ese intervalo. >>Q = quad('ejint',0,2) para obrener el resultado de la cuadratura ans= -0.4605 RESOLUCIÓN NUMÉRICA DE ECUACIONES DIFERENCIALES INTEGRACIÓN NUMÉRICA Veamos cómo utilizar MATLAB para resolver numéricamente ecuaciones diferenciales. Esto nos será útil especialmente para aquellas ecuaciones que no podamos tratar con pplane o dfield. En inglés, al cálculo numérico de integrales definidas se le llama quadrature. Sabiendo eso, no resulta extraño que la función de MATLAB para evaluar numéricamente una integral definida se llame quad. La función quad evalúa numéricamente la integral usando el método adaptativo de integración de Simpson. La sintaxis de la función quad admite algunas variantes: >>[T,Y] = ode45(odefun,tspan,y0) Donde odefun es un mfile que contiene la ecuación diferencial, tspan son los valores de tiempo entre los que dibujaremos las soluciones e y0 son las condiciones iniciales. Tambien podemos cambiar la tolerancia pero no lo veremos ahora. Resolver un ejemplo de sistema de ecuaciones quad('fun',a,b) y1 ' y 2 y3 y1 (0) 0 y 2 ' y1 y3 y 2 (0) 1 y3 ' 0.51y1 y 2 y3 (0) 1 Obtiene el valor de la integral de la función con nombre ‘fun’ (ha de existir un fichero fun.m) entre a y b (la tolerancia o máximo error permitido es 10 –6 ) quad('fun',a,b,tol) Lo mismo que en el caso anterior pero fijando la tolerancia Para resolver este sistema primero creamos un fichero con las ecuaciones: >> edit function dy = sistema(t,y) dy = zeros(3,1); % un vector columna dy(1) = y(2) * y(3); dy(2) = -y(1) * y(3); dy(3) = -0.51 * y(1) * y(2); Ejemplo. Para obtener una aproximanción de la integral de 2 x 0 3 dx 2x 5 en primer lugar construiremos un m-file con el comando: y lo guardamos como ejeqdif.m >> edit invocamos al editor. En el m-file escribiremos: resolvemos ahora el sistema con: 5 >>[T,Y] = ode45('ejeqdif',[0 12],[0 1 1 ] ); >>plot(T,Y(:,1),'-r',T,Y(:,2),'-.b',T,Y(:,3),'.m') Ejercicios. 1. a) b) c) 2. 3. Dibujar las siguientes funciones usando fplot: 1/(1+x2) en el intervalo [-5, 5], sin(x)/x en el intervalo (-pi, pi). Representar en una misma gráfica los polinomios x2, x3+x2+x+1 y x5-5x3+4x utilizando plot. Delimitar adecuadamente los ejes para mejorar la gráfica si es necesario. Encontrar una aproximación para la raíz de 2cos(x)=x. Para ello en primer lugar dibujaremos la gráfica de 2cos(x)-x y nos servirá para encontrar un punto de partida, o un intervalo donde la función cambia de signo. Aproximar numéricamente las siguientes integrales indefinidas. Notar que no se pueden resolver con métodos elementales. 1 4. a) e 2 x2 dx b) 1 5. cos( x 2 ) dx 0 Resolver las ode’s para una poblacion con crecimiento exponencial y logístico y si inicialmente contamos con 100 unidades. (estudiar con dfield y con ode45 para distintos valores de los parámetros k, r y b) y' kx y' r (1 y / b) y 6