Академический Документы
Профессиональный Документы
Культура Документы
0
Para la asignatura Reactores Qumicos de 4 curso de Ingeniero Qumico en la UGR Curso 2008/2009 Miguel Garca Romn
ndice.
1. Primeros pasos con Matlab. 1.1. La pantalla de MatLab 2. Uso de operadores y realizacin de operaciones sencillas 2.1. Formato de los nmeros en MatLab 2.2. Operaciones con escalares y funciones matemticas bsicas 2.3. Definicin de variables escalares 3. Manejo de matrices (arrays) 3.1. Introduccin manual de matrices 3.2. Manipulacin y Operaciones con matrices. 4. Representaciones grficas: El comando plot 4.1. El comando plot. 4.2. Representacin de grficos a partir de funciones. 4.3. Representar varias funciones en el mismo grfico. 4.4. Dar formato a los grficos. 4.5. Escalas no lineales y grficos especiales. 5. Ficheros de programa (script). 5.1. Ejecucin de un fichero script: El directorio de trabajo actual. 5.2. Asignacin de valores a las variables de un fichero script y comandos de salida. 5.3. Importacin y exportacin de datos. 6. Ficheros de funcin. 6.1. Creacin de un fichero de funcin. 6.2. Variables Globales. 6.3. Funciones inline. 7. Programacin en MatLab. 7.1. Operadores relacionales y operaciones lgicas. 7.2. Sentencias de programacin. 8. Algunas aplicaciones importantes de MatLab. 8.1. Polinomios. 8.2. Ajuste de curvas. La funcin polyfit. 8.3. Interpolacin. 8.4. Solucin de ecuaciones de una variable. 8.5. Clculo del mximo y mnimo de una funcin. 8.6. Integracin numrica. 8.7. Resolucin de ecuaciones diferenciales ordinarias. 5 5 6 6 7 8 8 8 10 15 15 18 18 21 22 25 25 26 27 27 28 29 32 32 33 35 37 37 38 39 40 40 42 42
1.1.
La pantalla de MatLab
La pantalla principal de MatLab cuenta con tres subventanas que por defecto estarn presentes la primera vez que se abre el programa. stas son: Command Window, que es la que nos permite introducir las rdenes o comandos en el programa. Command History Window, que muestra la secuencia de comandos ejecutados Current Directory Window/Workspace, muestra los programas presentes en el directorio actual, aunque haciendo clic en la pestaa correspondiente situada bajo la ventana, se muestran los valores de las variables que se hayan asignado.
Adems de stas existen otras ventanas importantes: Figure Window, que muestra las figuras resultado de algn comando, y por tanto aparece cuando se ejecutan stos, aunque puede dejarse fija si se desea.
2.1.
El formato por defecto de los nmeros en MatLab muestra slo cuatro decimales (formato short). A continuacin se enumeran los principales formatos numricos que maneja MatLab. Hay que tener en cuenta que la forma en que MatLab realiza los clculos es independiente de cmo se muestran los resultados. Formato long: muestra hasta 14 decimales Formato short e/long e: anlogos al short y al long, pero que usa siempre notacin cientfica. Formato short g y long g: elige la mejor opcin entre short o short e y long o long e. El uso del formato short g es bastante recomendable, ya que emplea la notacin cientfica slo cuando es necesario para visualizar el nmero. Para cambiar entre los distintos formatos se puede usar el comando format (el cambio slo es vlido para la presente sesin) o bien hacerlo desde el Men FilePreferences, en el apartado Command Window (el cambio se mantiene al entrar y salir del programa). A continuacin se muestran algunos ejemplos de aplicacin de estos formatos:
>> format short e >> a=[1.5777889 0.0000005 548129453975] a = 1.5778e+000 5.0000e-007 5.4813e+011
>> format short g >> a=[1.5777889 0.0000005 548129453975] a = 1.5778 5e-007 5.4813e+011
2.2.
MatLab permite realizar operaciones con escalares de forma anloga a una calculadora, usando los siguientes operadores: Operador Operacin Suma Resta Multiplicacin Divisin Potencia Ejemplo 2+3 23 2 3 2/3 = 3\2 =
+ /\ ^
2 3
2^3 = 23 = 8
Las operaciones pueden realizarse directamente con nmeros, o bien con variables, a las que previamente se les asigna un valor numrico (un escalar o una matriz). Adems MatLab dispone de una vastsima librera de funciones, algunas de las cuales se abordarn con ms detalle en estas notas. Sin embargo, en la siguiente Tabla se recoge la forma de escribir en MatLab las funciones matemticas elementales.
2.3.
La asignacin de valores escalares es muy sencilla, como se ve en el siguiente ejemplo que asigna el valor 15 a la variable x: >> x=15 A partir de este momento es posible usar la variable x en clculos sucesivos o como argumento de funciones. En cuanto al nombre de las variables, este puede tener hasta 63 caracteres, que pueden ser letras, dgitos y el carcter de subrayado, si bien deben comenzar por una letra. Hay que tener en cuenta que MatLab distingue maysculas de minsculas. Si se desea borrar alguna o todas las variables, se debe usar el comando clear, especificando despus el nombre de las variables a borrar. Si no se especifica nada, las borra todas ellas.
3.1.
La forma ms sencilla de introducir los elementos de una matriz, cuando stos son conocidos, es hacerlo manualmente mediante la ventana de comandos. Para ello basta con escribirlos entre corchetes y separados por un espacio o coma (elementos de una misma fila) o un punto y coma (elementos de diferentes filas), tal y como se observa en los ejemplos siguientes:
>> A=[1 2 3] A = 1 B = 1 2 3 2 3 >> B=[1;2;3]
Otra forma de introducir vectores es especificar el primer trmino (a), la diferencia entre cada dos trminos (d), que obviamente no puede variar, y el ltimo trmino (z), p. ej., x=[a:d:z]. Esto resulta til para especificar, por ejemplo, los valores de la variable independiente (x) para los cuales se representarn los valores correspondientes de la variable dependiente (y).
>> x=[0:0.25:1] x = 0 0.25 0.5 0.75 1
Es tambin posible crear un vector especificando el primer y el ltimo elemento (a y b, p. ej.), as como el nmero total de elementos del vector (n). La distancia entre dos elementos sucesivos depender, evidentemente, del nmero total de trminos que deseemos. Para hacer esto se usa el comando linspace, de la forma siguiente: x=linspace(a,b,n).
>> x=linspace(1,4,7) x = 1 1.5 2 2.5 3 3.5 4
Si no se especifica el nmero de elementos se considera 100 por defecto. Una vez introducida una matriz es conveniente conocer algunos comandos para trabajar con ellas: Para obtener el elemento i-simo de un vector A, escribiremos A(i) Si es una matriz, tendremos que especificar tanto la fila como la columna en la que se encuentra el elemento en cuestin. As si se encuentra en la fila i y en la columna j, escribiremos: A(i,j) De esta forma es posible tambin asignar nuevos valores al elemento que queramos, sin modificar el resto de la matriz. Si queremos especificar un rango de elementos de un vector o matriz, usaremos dos puntos, de la siguiente manera: i. A(m:n): Se refiere a los elementos comprendidos entre las posiciones m a n del vector A.
3.2.
10
Operador
Funcin Transposicin
Comentario Cambia las filas por columnas y viceversa Sirven para sumar y restar matrices, que debern tener el mismo nmero de filas y columnas, de acuerdo con las reglas algebraicas de suma y resta de matrices. Tambin sirven para sumar o restar
Suma
Resta
un escalar a una matriz, en cuyo caso lo sumar o restar a todos los elementos de la misma. Efecta el producto de matrices, siguiendo las leyes algebraicas. Por ello las dimensiones de las matrices a multiplicar sern: (m,n) * (n,p) = (m,p). Tambin permiten multiplicar un escalar por una matriz, lo que implica hacerlo por cada uno de sus elementos. Realiza el producto escalar de dos vectores. dot(a,b) sera el producto escalar de los vectores a y b, que deben ser dos vectores (fila o
Multiplicacin
dot
Producto escalar
columna) con el mismo nmero de elementos. Equivale a la multiplicacin matricial de un vector fila x un vector columna del mismo nmero de elementos.
Potencia
Slo se puede aplicar a matrices cuadradas. Un caso particular es la potencia -1, que nos da la matriz inversa, la cual tambin se puede obtener mediante el comando inv()
inv(A)
Inversa
det(A) /
11
Las dos formas de divisin de matrices son tiles para resolver sistemas de ecuaciones lineales. Por ejemplo, sea el sistema de ecuaciones lineales y su forma matricial:
3 x + 2 y z = 10 8 x 3 y + 4 z = 21 5 x + 2 y + z = 13
3 2 1 x 10 8 3 4 * y = 21 5 2 1 z 13
[x
3 8 5 z ]* 2 3 2 = [10 21 13] 1 4 1
12
>> x=b*inv(a) x = 3.225 >> x=b/a x = 3.225 -0.7 -1.725 -0.7 -1.725
En este punto conviene aclarar que para entender las diferentes operaciones con matrices que se han resumido en la tabla y ejemplos anteriores es necesario conocer o recordar el lgebra matricial, acudiendo para ello a un texto general de matemticas. A parte de las anteriores operaciones, MatLab tambin permite operar con las matrices elemento a elemento. La operacin elemento a elemento no sigue las reglas del lgebra matricial, en lo que se refiere al producto y la divisin, ya que lo que hace es operar con cada par de elementos de la matriz que ocupen la misma posicin. Por eso este tipo de operaciones slo se pueden hacer con matrices de las mismas dimensiones, tal y como sucede con la suma y resta algebraica de matrices. Para que las operaciones de multiplicacin, divisin y potenciacin se realicen elemento a elemento es necesario aadir un punto delante de los smbolos: .* ./ .\ .^
En los siguientes ejemplos se muestra como aplicar las anteriores operaciones: >> v=[1 2 3 4 5]; >> w=[2 2 2 2 2];
13
Las operaciones elemento a elemento son muy tiles para calcular los valores de una funcin, y, para distintos valores de la variable/s independiente/s. Para ello se aplica la funcin a un vector previamente definido, como en el ejemplo siguiente. Luego podramos usar ese conjunto de valores para hacer una representacin grfica de la funcin en cuestin. >> x=[1 2 3 4 5]; >> y=x.^2 y = 1 4 9 16 25
Esta operacin sin el punto, conducira a un error, al no ser x una matriz cuadrada
Las funciones predefinidas de MatLab tambin funcionan elemento a elemento cuando se aplican a un vector, como en el siguiente ejemplo.
14
Adems existe una serie de comandos que conviene conocer para trabajar con matrices o vectores: a) b) length(A): Devuelve el nmero de elementos del vector o matriz A size(A): Devuelve un vector fila [m,n], donde m y n representan el nmero de filas y columnas respectivamente de la matriz A. c) d) e) max(A): Si A es un vector devuelve el elemento mayor. min(A): Si A es un vector devuelve el elemento menor. sort(A): Si A es un vector devuelve el mismo vector, pero ordenado en orden ascendente. f) g) h) mean(A): Si A es un vector devuelve la media de sus elementos. median(A): Si A es un vector devuelve la mediana de sus elementos. std(A): Si A es un vector devuelve la desviacin estndar de sus elementos. Los anteriores comandos, cuyo uso se ha explicado sobre vectores, pueden tambin ser aplicados sobe matrices, pero en ese caso realiza la operacin correspondiente sobre cada columna de la matriz, con lo que devuelve un vector.
4. Representaciones grficas.
4.1. El comando plot.
La generacin de grficos en dos dimensiones en MatLab se lleva a cabo usando el comando plot, cuya sintaxis es la siguiente: plot(x,y, especificadores de lnea, propiedades, valores) x e y son dos vectores con el mismo nmero de elementos, siendo el primero de ellos el que contiene los valores de la variable x (eje de abscisas) y el segundo de la variable y (eje de ordenadas), aunque sus nombres pueden ser cualesquiera.
15
Los especificadores de lnea son los argumentos que definen el tipo y aspecto de la lnea y/o marcador que se usar para la representacin de los datos. En la Tabla siguiente se resumen los ms importantes: Estilo lnea Continua Discontinua De puntos Rayas y puntos Especif. -: -. Color rojo azul magenta verde cian amarillo blanco Especif. r b m g e y w Marcador signo ms crculo asterisco punto cuadrado diamante estrella de cinco puntas estrella negro k de seis puntas h p Especif. + o * . s d
Para utilizar estos especificadores hay que hacerlo en la secuencia: color Estilo de lnea Estilo de marcador. Por ejemplo: b-* dibujara una lnea continua azul, con asteriscos azules como marcadores. Las Propiedades y Valores permiten modificar la apariencia de la curva o los marcadores, actuando concretamente sobre el grosor de la lnea, el tamao de los marcadores, el color de borde y de relleno de los marcadores. Por ejemplo, el comando markerfacecolor permite modificar el color de relleno de los marcadores. Se escribe cada propiedad entre comillas simples, y a continuacin su respectivo valor, separado por una coma, y tambin entre comillas simples. El orden de las propiedades es indiferente. Mediante esta opcin es posible indicar tambin el color y estilo de la lnea, tipo de marcador, etc., tal y como se muestra en el ejemplo siguiente A continuacin se incluyen como ejemplo los comandos para representar dos grficos diferentes y las salidas correspondientes.
16
1200
1100
1000
900
800
700
600
500 1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
Grfico 1
1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 0 1 2 3 4 5 6 7
Grfico 2 Como puede apreciarse para realizar el Grfico 1, que presenta la evolucin anual de las ventas de una empresa, simplemente se han introducido los dos vectores que contiene los datos a representar (aos y ventas). En el Grfico 2 lo que se representa 17
4.2.
En el ejemplo anterior se ha usado el comando plot para representar una funcin, lo que requiere calcular los valores de dicha funcin en el intervalo a representar, como se ha visto. Existe otra forma de representar funciones, que implica el uso del comando fplot. La sintaxis del mismo es la siguiente: fplot ('funcion', limites, especificadores de linea) Un ejemplo de su uso puede verse a continuacin, con su correspondiente salida. >> %- Grfico 3 -% >> fplot('cos(x)',[0 2*pi],'g--')
Grfico 3
4.3.
En muchas ocasiones se hace necesario representar varias funciones o curvas en el mismo grfico, o incluso incluir dos grficos en la misma ventana grfica. Para lo primero, hay tres posibles opciones: 1) Usar el comando plot, colocando en los argumentos los datos y opciones de representacin de cada curva, una a continuacin de la otra, tal y como se muestra en el ejemplo:
18
19
Grfico 4
Cuando se trata de colocar varios grficos en una misma ventana grfica, pero separados en subventanas, se utiliza el comando subplot, que permite indicar el nmero de subventanas y la posicin del grfico a representar dentro de ellas. Su sintaxis es: subplot(m,n,p) siendo m x n el nmero de subventanas (m filas y n columnas) y p la posicin del grfico dentro de ellas, contando de arriba a abajo y de izquierda a derecha. A continuacin se incluye un ejemplo de su utilizacin. >>%- Grfico 5 -% >> x=[1 2 3]; >> y=[1 2 3]; >> subplot(2,2,1) >> hold on >> plot(x,y)
20
10 8 6 4 2 0 1 1.5 2 2.5 3
Hasta ahora se ha visto como crear representaciones grficas elementales y dado formato a lneas y marcadores, pero no al resto del grfico: ttulo y escala de los ejes, ttulo del grfico, leyenda, etc. Existen comandos que permiten hacer esto, y que son de utilidad cuando el grfico es generado mediante un programa. Estos comandos no se han incluido en la presente gua, pero se puede obtener mayor informacin sobre los mismos usando la ayuda del MatLab (basta escribir Annotating Plots en el buscador). Adems estas opciones estn tambin disponibles en la propia ventana grfica que se despliega cada vez que ejecutamos plot. Basta desplegar el editor de propiedades en el men View y hacer clic sobre cada una de las partes del grfico, para que se desplieguen sus
21
Grfico 6
4.5.
Terminaremos este apartado describiendo brevemente la generacin de grficos especiales y el uso de escalas logartmicas y coordenadas polares. A parte de los grficos presentados hasta ahora, que representan puntos discretos y lneas, MatLab permite tambin construir grficos especiales, como los de barras, sectores o histogramas. Para ello dispone de los comandos: Grfico de barras verticales: bar(x,y) Grfico de barras horizontales: barh(x,y) Grfico de sectores: pie(x) Histogramas: hist(x)
A continuacin se presentan algunos ejemplos de cada uno de estos grficos. >> anno=[2000:2003];
n de casos
45 40 35 30 25 20 15 10 5
>> casos=[27 34 45 41]; >> bar(anno,casos,'r') >> xlabel('ao') >> ylabel('n de casos')
2000
2001
ao
2002
2003
Grfico 7
22
2003
2002
ao
2001 0
>> ylabel('ao')
10
15
n de casos
20
25
30
35
40
45
72%
nota
Grfico 10
Otro aspecto interesante es el uso de escala logartmica, muy utilizada para linealizar ciertas relaciones. Para generar un grfico con escala logartmica (doble o simple) se usan los comandos loglog(x,y), semilogx(x,y) semilogy(x,y), donde x e y son los datos a representar. Por ejemplo, para la funcin y = x1.5, la representacin en escala lineal y doble logartmica sera:
23
>> plot(x,y)
20
40
60
80
100
10
y
10
1
10 0 10
10
10
Grfico 12 A continuacin se presenta un ejemplo de aplicacin con ejes semilogartmicos, donde el uso de la escala logartmica en el eje de ordenadas permite la obtencin de un representacin lineal. >> x=linspace(0,100,101); >> y=5*exp(-x/25);>> >> plot(x,y) >> semilogy(x,y)
Por ltimo se introduce el comando polar, que permite obtener grficos en coordenadas polares, y cuya sintaxis es: polar (theta, radio, 'especificadores de linea') >> t=linspace(0,2*pi,200); >> r=cos(2*t); >> polar(t,r,'r--')
180 150 90 120 1 0.8 0.6 0.4 0.2 0 30 60
210
330
240 270
300
Grfico 13
24
5.1.
Una vez guardado, para ejecutar un fichero script, basta con escribir su nombre en la ventana de comandos de MatLab y pulsar la tecla Enter ( ). Es indispensable que el fichero se haya guardado en el directorio de trabajo actual de MatLab (por ejemplo, C:\MATLAB7\work), que es en el que el programa busca1 y guarda los ficheros. En caso de que el fichero se encuentre en otro directorio, ser necesario cambiar el directorio actual (mediante la Current Directory Window) a aquel donde se haya grabado el fichero que pretendemos ejecutar. En la figura siguiente se muestra el fichero ej1, que representa la funcin y=exp(x) entre 0 y 10.
icono Run
Otra forma de ejecutar un fichero script es mediante el icono Run, que se encuentra en el editor de ficheros, como se muestra en la figura anterior.
1
Realmente MatLab busca en todos los directorios incluidos en el Set Path, de donde se pueden aadir y quitar las rutas, mediante el men File Set Path
25
Nociones bsicas de MatLab 7.0 5.2. Asignacin de valores a las variables de un fichero script y comandos de salida.
Las variables utilizadas en un fichero script son compartidas (variables globales) con las que se introducen mediante la ventana de comandos. Esto quiere decir que es posible asignarles un valor o bien dentro del propio fichero, como en el ejemplo 1, o bien mediante la ventana de comandos. Lo primero nos evita tener que teclear cada vez los valores de las variables, pero obliga a editar el m-file cada vez que queremos modificar los valores de las variables. La asignacin mediante la ventana de comandos permite cambiar ms fcilmente los valores, pero obliga a teclearlos cada vez. Otra posibilidad consiste en escribir una/s lnea/s de cdigo en el fichero script, para que cada vez que lo ejecutemos nos pida el valor de alguna o todas las variables, como se aprecia en el ejemplo 2.
En el ejemplo 2 se usa el comando input(mensaje) para asignar la variable x. De esta forma aparece en pantalla un texto (mensaje) preguntando al usuario el valor que desea asignar a la variable. Adems se usa el comando disp, que es un comando de salida, para mostrar el resultado. El comando disp puede servir para mostrar un texto, en cuyo caso necesita las comillas simples, o bien puede usarse para mostrar el valor de una variable, para lo que no deben usarse comillas, tal y como se muestra en el ejemplo 2. Cuando se usa disp para mostrar el valor de una variable slo se visualiza dicho valor, pero no el nombre de la variable. Una limitacin del comando disp es que no permite intercalar el valor de la variable entre dos cadenas de texto. Para ello hay que recurrir a otro comando de salida, fprintf, que adems permite dar formato y grabar las salidas a un fichero. Mayor informacin acerca de este comando, cuya sintaxis es ms compleja, puede encontrarse a travs de la ayuda del MatLab.
26
Es muy frecuente que en el tratamiento de datos con MatLab tengamos que importar datos desde otros programas, como por ejemplo desde una hoja de clculo de Excel, o tambin que queramos volcar el resultado de los clculos realizados con MatLab en una hoja de clculo de Excel. Para la importacin de datos MatLab cuenta con un asistente que facilita la labor, y que es capaz de identificar datos en formatos diferentes. Para usar dicho asistente debemos ir a la opcin Import Data del men File. Cuando se trata de datos que estn en Excel, MatLab permite importarlos utilizando un comando especfico, xlsread, que tiene la ventaja de que podemos incluirlo en un fichero script, e invocarlo mediante el mismo. La sintaxis de este comando es la siguiente: nombre_variable=xlsread('nombre_fichero','nombre_hoja','rango') Los tres parmetros anteriores son cadenas de datos que representan el nombre del fichero, la hoja correspondiente dentro del mismo, y el rango dentro de la hoja. El rango debe indicarse de la forma B4:C16, segn la notacin usada por Excel. En realidad slo es imprescindible el nombre del fichero, ya que el comando acta por defecto sobre todos los datos numricos que haya en la Hoja1. Para exportar datos a Excel puede usarse el comando xlswrite, el cual tiene la siguiente sintaxis: xlswrite('nombre_fichero',nombre variable,'nombre_hoja','rango') Los parmetros son anlogos a los del comando xlsread. El archivo de Excel puede ya existir, en cuyo caso pedir confirmacin para sobrescribir los datos (cosa que suceder si el rango especificado ya estaba ocupado con datos previos), o bien puede ser creado mediante el mismo comando.
6. Ficheros de funcin.
Como se ha visto, MatLab cuenta con numerosas funciones predefinidas (sin(x), factorial(x), exp(x), etc.) que pueden ser utilizadas simplemente escribiendo su nombre en la ventana de comandos o en un fichero script. Sin embargo a veces es necesario definir nuevas funciones, para lo cual se utilizan los ficheros de funcin. Estos ficheros son realmente de script y contienen el cdigo de la funcin, de modo que una vez creados pueden ser invocados mediante la ventana de comandos, como cualquier funcin predefinida de Matlab, o lo que es ms importante, por medio de otro fichero de programa, del que realmente constituyen un subprograma. Lo normal
27
6.1.
Tal y como se ha indicado los ficheros de funcin se crean como un fichero de script, es decir, mediante el editor de MatLab u otro editor de textos, y luego se guardan dndoles el mismo nombre que a la funcin y la extensin .m. Para poder ejecutarlos debern encontrarse en el directorio actual de trabajo de MatLab, como cualquier fichero script. Constan, obligatoriamente, de las siguientes partes: 1) Definicin de la funcin: Ha de incluirse en la primera lnea de texto ejecutable. Tiene la siguiente estructura:
28
A continuacin se muestra la entrada y salida en la ventana de comandos de MatLab cuando se invoca a la funcin, as como cuando se usa el comando Help, para obtener ayuda sobre ella. >> PM_metano=HCmolmass(1)
PM_metano = 16
6.2.
Variables Globales.
Cada funcin de MatLab usa una serie de variables (asignadas a los argumentos de entrada y salida), de modo que, por defecto, los valores que se asignan a dichas variables slo son accesibles a la funcin en cuestin. Es decir, que estas variables, que se denominan locales, slo sirven para que se hagan los clculos dentro de la propia funcin, pero no es posible acceder a su valor desde la ventana de comandos o por parte de un fichero script diferente. De hecho, la variable no aparece en el
29
Para que el programa tenga acceso a ambas variables ambas deben ser tambin declaradas globales en el cdigo de la funcin:
De esta forma, podramos leer los valores de MW y n mediante el programa ej3, tal y como se ve en las siguientes secuencias de comandos.
30
Sin embargo hay que ser muy cuidadoso a la hora de utilizar las variables globales, ya que una vez su valor ha sido asignado al ejecutar la funcin por primera vez, ya no cambia al ejecutar la funcin una segunda vez, lo que puede dar lugar a errores. Vase a continuacin lo que ocurrira si tras teclear el ejemplo anterior en la ventana de comandos, intentamos usar la funcin HCmolmass para calcular el peso molecular de un hidrocarburo de 2 carbonos. >> PM_etano=HCmolmass(2) Warning: The value of local variables may have been changed to match the globals. Future versions of MATLAB will require that you declare a variable to be global before you use that variable. > In HCmolmass at 6 PM_etano = 16 Como puede verse, la variable MW mantiene su valor anterior, e incluso el MatLab advierte del posible error. Para poder aplicar nuevamente la funcin HCmolmass es necesario borrar los valores de las variables globales, mediante el comando clear global, tal como se ve a continuacin, donde tambin se aprecia como se nos sigue advirtiendo de un posible error. >> clear global >> PM_etano=HCmolmass(2)
31
6.3.
Funciones inline.
En MatLab existe otra forma de definir funciones sin crear un fichero de funcin. Esta forma se puede usar directamente en la ventana de comandos, o bien en el cdigo de un fichero script normal. Para ello se utiliza el comando inline, con la siguiente sintaxis: nombre = inline('expresin matematica') El nombre de la funcin se pone en primer lugar, y a continuacin, tras el comando inline se coloca, escrita en forma de cadena, la expresin matemtica que se debe evaluar, como en el ejemplo siguiente: >> raiz_cubica=inline('x^(1/3)') raiz_cubica = Inline function: raiz_cubica(x) = x^(1/3) >> r=raiz_cubica(27) r = 3 Es posible definir funciones inline con ms de una variable, o aplicarlas a vectores o matrices (usando las operaciones elemento a elemento). Para ms informacin, consultar la ayuda de MatLab.
7. Programacin en MatLab.
Hasta ahora hemos escrito pequeos programas en MatLab, tanto en ficheros script, como en ficheros funcin. Todos ellos eran muy simples y no permitan, por ejemplo, fijar condicin alguna a la hora de realizar los clculos o repetirlos un nmero
32
7.1.
MatLab.
Descripcin Menor que. Mayor que. Menor o igual que. Mayor o igual que. Igual a. Distinto de.
Estos operadores se usan en operaciones lgicas, cuya salida es siempre un 1 (verdadero) o un 0 (falso), o una matriz de unos y/ ceros, como puede verse en los ejemplos siguientes. >> A=1; >> B=5; >> r1=A<B r1 = 1 >> r2=A>B r2 = 0 >> C=[1 2 3 4 5]; >> D=[0 -3 6 4 8]; >> r3=C>D r3 = 1 1 0 0 0
33
34
>> notas=[5 6 4 8 3 9 2 4 6 8 9 9 5 6 7 7.5 4 7 7 8]; >> A=notas>=7; >> B=notas<9; >> C=A&B; >> notables=find(C) notables = 4 10 15 16 18 19 20
Como puede verse el vector notables contiene los ndices de los elementos del vector notas que son menores de 9 y mayores o iguales que 7, es decir que corresponden a un notable. Si tenemos todos los nombres de los alumnos en un vector, ser muy fcil generar otro vector con los nombres de aquellos que tienen notable.
7.2.
Sentencias de programacin.
Abordaremos a continuacin la sintaxis de los principales tipos de sentencias de programacin en MatLab: Sentencias condicionales:
La sentencia if
Permiten ejecutar una serie de comandos si se verifican unas condiciones previamente especificadas. La instruccin que se usa es if end segn el diagrama de flujo siguiente:
Detrs de if deben escribirse una serie de operaciones lgicas, del modo: if a<b if C==D 35
Como puede verse la sentencia else nos permite elegir entre dos grupos de instrucciones, y la sentencia elseif entre tres grupos, aunque, como pueden usarse todas las elseif que queramos, realmente lo que nos permite es elegir entre tantos grupos de instrucciones como queramos. En caso de usarse la sentencia elseif no es obligatorio terminar con un else. Existe adems otra sentencia condicional, que es switch-case. Para ms informacin se puede consultar la ayuda de MatLab. Bucles: Permiten ejecutar una instruccin o conjunto de ellas un nmero determinado de veces. Los ms importantes son los siguientes:
Bucle for-end
Su peculiaridad es que tenemos que conocer, desde el primer momento, el nmero de veces que la instruccin se repetir. La estructura del mismo es:
36
Bucle while-end
En este caso no se conoce el nmero exacto de ejecuciones de los comandos del bucle que sern necesarias, por lo que stos se ejecutarn mientras se cumpla una determinada condicin, que obviamente debe especificarse. Su estructura por tanto, es: while expresin_condicional (serie de comandos en MatLab) end Para que esta estructura funcione es imprescindible que al menos una de las variables de la sentencia condicional cambie de valor cada vez que se ejecutan los comandos. La sentencia break puede usarse para romper un bucle, especialmente cuando ste contenga sentencias condicionales. Cuando el MatLab llega a esta instruccin, salta directamente a la sentencia end y da por terminado el bucle.
8.1.
Polinomios.
En MatLab un polinomio se introduce como un vector fila, cuyos elementos son los coeficientes del polinomio. Si el polinomio no contiene todos los trminos (por ejemplo, tiene el x3, pero no el x2), deber ponerse un 0 en el lugar del coeficiente correspondiente al trmino que falta.
37
8.2.
Es muy frecuente cuando se tratan datos experimentales que se plantee la necesidad de ajustarlos a un polinomio o a otro tipo de funcin. La funcin polyfit permite ajustar un conjunto de puntos a un polinomio de dos formas diferentes. Su sintaxis es la siguiente: polyfit(x,y,n) El comando anterior calcula el polinomio de grado n que mejor ajusta el conjunto de puntos cuyas coordenadas x (variable independiente) e y (variable dependiente) vienen dadas por los vectores x e y respectivamente. El mximo grado ser siempre inferior en una unidad al nmero total de puntos a ajustar, es decir al nmero total de elementos de los vectores x y. Hay que ser muy cauteloso cuando se usan polinomios de alto grado que pasan por todos o casi todos los puntos, ya que en estos casos se producen desviaciones muy importantes entre los puntos, como puede verse en la imagen siguiente, donde se usan dos polinomios de grado diferente para ajustar un conjunto de cinco puntos, mediante la funcin polyfit.
8 7.5 7
8 10
5 puntos grado 4
9
6.5 6 5.5 5
5 7
4.5
4
10
12
10
12
p=polyfit(x,y,2)
r=polyfit(x,y,4)
38
8.3.
Interpolacin.
Cuando disponemos de una serie de datos en forma de puntos (x,y) podemos obtener el valor de y para un x diferente, aunque normalmente dentro del rango de valores de x conocidos. A esto se le llama interpolar. Para interpolar existen diferentes mtodos matemticos, que suponen una determinada tendencia para la evolucin de los datos; por ejemplo, lo ms sencillo es suponer que los valores varan linealmente entre cada pareja de datos conocidos. Para realizar interpolaciones en MatLab se usa la funcin interp1, que tiene la siguiente sintaxis: yi=interp1(x,y,xi,metodo) x e y son las coordenadas de los puntos (datos) conocidos. xi son los valores de la variable independiente x para los cuales deseamos conocer el correspondiente valor de y (variable dependiente), que se almacenarn en el vector yi. Es tambin posible especificar el mtodo de interpolacin. Los tres ms importantes son: linear: supone un segmento lineal entre cada par de puntos. spline: supone un segmento polinmico cbico entre cada par de puntos. pchip: utiliza interpolacin de Hermite cbica (tambin 'cubic').
En la siguiente figura se aprecian tres casos de interpolacin con cada uno de los mtodos anteriores. La lnea continua representa la funcin real a la que pertenecen los puntos. La lnea discontinua corresponde a los puntos interpolados.
linear
spline
pchip
39
8.4.
Toda ecuacin de una variable, polinmica o no, puede ponerse en la forma f(x) = 0, con lo que su solucin es posible resolviendo dicha ecuacin. Para ello MatLab cuenta con la funcin fzero, cuya sintaxis es: fzero(funcion,x0) El comando anterior devuelve un escalar x que satisface la igualdad f(x) = 0. Para realizar este clculo MatLab emplea mtodos numricos iterativos, de modo que hay que suministrar un valor, x0, prximo a la solucin esperada, para que comience las iteraciones. La funcin que hay que poner como argumento puede ser una cadena de texto o bien se la puede definir mediante un fichero de funcin. A continuacin se muestra un ejemplo, que nos permite resolver la ecuacin x2 + 8 = ex >> sol=fzero('x^2-exp(x)+8',0) sol = 2.7421 Una buena forma de averiguar dnde una funcin tiene una solucin, o simplemente si la tiene, es realizar una representacin grfica de la funcin
8.5.
MatLab cuenta con una funcin para calcular el mximo o mnimo local de una funcin de una variable. Se trata de fminbnd, que se usa de la siguiente forma: fminbnd(funcion,x1,x2) El comando anterior devuelve el valor donde la funcin especificada alcanza el mnimo, dentro del intervalo x1 x x2. Para visualizar el valore que toma la funcin, hay que modificar ligeramente la sintaxis: [x fval]=fminbnd(funcion,x1,x2) De esta forma el valor de la funcin en x se asigna a la variable fval.
40
-1000
f(x)
-2000
-3000
-4000
-5000 -10
-8
-6
-4
-2
0
x
10
>> [x fx]=fminbnd('2.5*x^3-21*x^2+0.25*x-5',-10,10) z = -10 fx = -4.6075e+003 >> [x fx]=fminbnd('2.5*x^3-21*x^2+0.25*x-5',0,10) x = 5.5940 fx = -223.1207 La funcin fminbnd se puede tambin usar para encontrar el mximo, para lo cual basta aplicarla a la funcin multiplicada por 1.
41
8.6.
Integracin numrica.
La integracin es una operacin muy frecuente en los clculos cientfico-tcnicos, y en una gran cantidad de ocasiones no es posible realizarla analticamente, sino que es necesario usar la integracin numrica, incluso porque lo que se conoce no es la funcin a integrar (que adems puede no ser integrable), sino una serie de puntos. Para ello se pueden usar las siguientes funciones: quad quadl: Realiza la integracin numrica de una funcin, y se debe usar de la forma siguiente: quad(funcion,a,b) siendo a y b los lmites de integracin y la funcin una cadena de texto o una funcin existente en MatLab o predefinida por el usuario. La funcin siempre debe escribirse de forma que permita realizar operaciones elemento a elemento, ya que esta es la forma de calcular que usa MatLab. El comando quadl slo se diferencia del quad en la forma de calcular la integral, que es ms precisa en quadl que en quad. trapz: Realiza la integracin numrica a partir de un conjunto de puntos, dado por sus coordenadas x e y, de la forma: trapz(x,y)
8.7.
MatLab posee numerosas herramientas de clculo para abordar la resolucin de ecuaciones diferenciales, desde las ms simples (ecuaciones diferenciales ordinarias de primer orden, ODE) hasta casos ms complejos y sistemas de ecuaciones diferenciales. A continuacin se describirn los pasos para resolver un caso sencillo con las funciones predefinidas de MatLab. I) Partiremos de una ecuacin diferencial en la que se describe la evolucin de una variable dependiente (y) en funcin del tiempo (t). En general esa ecuacin debe ponerse en la forma general:
dy = f ( y, t ) dt
t0 t t f
y (t0 ) = y0
La solucin al problema ser una funcin o ms frecuentemente un conjunto de valores de dicha funcin en el intervalo considerado.
42
Lo normal es utilizar el ode45, y si no da resultado recurrir a los dems, empezando por el ode15s. IV) Se resuelve el problema usando el mtodo seleccionado: [t,y]=nombre_metodo(funcion,tspan,y0) nombre_metodo puede ser cualquiera de los indicados en la tabla anterior. funcion debe ser el nombre (cadena de texto) usado para designar a la funcin generada en el paso II. tspan es un vector que define el intervalo de valores de tiempo (o de la variable independiente que sea) para el que se calcular la solucin.
43
I)
dA = 0.05 A dt
0 t 60
A(0) = 100
Como variables de entrada de la funcin se ponen t y a, lo que es necesario para usar luego la funcin ode45, aunque en este caso dA/dt no es funcin directa de t. III) Usaremos el mtodo ode45 IV) Resolvemos el problema mediante: [t a]=ode45('desact',[0:1:60],100);
Al tratarse de una EDO muy sencilla se podra resolver integrando directamente la ecuacin, pero lo haremos mediante los mtodos numricos que incorpora el MatLab.
44
100 80 60
A,%
40 20
10
20
30
t, min.
40
50
60
45
Esta gua se basa en el libro Matlab: Una introduccin con ejemplos prcticos de Amos Gilat, Ed. Revert, Barcelona, 2006. Este libro es traduccin de la segunda edicin de la obra, publicada por John Wiley & Sons, USA, 2005.
46
Notas
47
Notas
48
Notas
49
Notas
50
Notas
51
Notas
52
Notas
53
Notas
54