Practica10 ProgramacionMatLab
Practica10 ProgramacionMatLab
PROGRAMACIÓN EN MATLAB
La utilidad de MatLab es más evidente cuando muchas tareas que son repetitivas y engorrosas, pueden programarse para
hacer más sencillas estas labores. MatLab utiliza un lenguaje propio pero que incorpora muchas características de “C”,
considerándose un lenguaje de alto nivel como lo podría ser Fortran y Pascal; esto hace que aquellos usuarios que estén
familiarizados con estos programas no tengan que preocuparse por formalismos y sintaxis de programación.
Como se mencionó previamente, es posible crear dos tipos de archivos ejecutables con extensión “.m”; los archivos de
comandos y los archivos de función. Estos archivos pueden crearse desde el editor de archivos de MatLab o desde cualquier
editor de texto ASCII.
Al llegar a esta práctica, el lector estará familiarizado con el uso de MatLab, por lo que estará listo para aplicar las
numerosas características de su lenguaje de programación, esto a través de ejemplos prácticos que le guiaran en el aprendizaje de
estas estructuras. Se aconseja su especial atención a los usos de las marcas de puntuación, así como a los diferentes
delimitadores y operadores, especialmente los operadores de matriz y operadores relacionales. Para el control del flujo de
instrucciones, MatLab dispones de lazos o bucles utilizando “for” y “while”; o bien bifurcaciones o construcciones “if-elseif-else” 0
“switch-case-otherwise. Todas las sentencias de control de flujo deben terminar con su respectiva sentencia “end”. Para más
información, vea la ayuda del programa.
Escribir archivos de comando o función en MatLab es más fácil de hacerlo que en otros lenguajes de programación que
existen, sin embargo, escribir un programa eficiente es un arte que viene a través de la experiencia. A continuación se presentan
algunos apuntes que ayudan y que deben tenerse en mente.
2.1 Pseudo código. Antes de iniciar a escribir un programa, utilice un pseudo código. Hágalo completamente en español,
piense en la estructura lógica y la correcta secuencia de las operaciones; defina las variables de entrada y salida; escriba
el programa con palabras sencillas. Al finalizar y estar completamente seguro de que el programa hace lo que usted
quiere, inicie la traducción al lenguaje de MatLab.
2.2 Legibilidad. Seleccione un nombre representativo para el programa, así como para las variables utilizadas. Escriba
suficientes comentarios en el cuerpo del programa. Diseñe y escriba una completa línea de comentarios de ayuda (Se
escribe al inicio del programa). Asegúrese de incluir la sintaxis de cómo usar el programa.
2.3 Manejabilidad. Mantenga su programa manejable, esto es, en procesos complicados divida los cálculos en programas o
funciones más pequeñas. Mantenga sus programas pequeños en longitud.
2.4 Robustez. Agregue opciones de verificación de errores y salida, incluyendo mensajes de ayuda en caso de un error.
2.5 Capacidad de expansión. Estructure el programa para poder extenderlo a otras aplicaciones u otro tipo de datos. Por
ejemplo, si usted escribe una función con variables escalares, pero considera que podría usarse posteriormente para
variables vectoriales, escriba el programa con esto en mente.
2.6 No se olvide de las líneas de comentarios al inicio del programa, que son utilizadas como ayuda en línea por MatLab, útil
tanto para un usuario o para el mismo autor del programa. No olvide escribir la sintaxis de ejecución del archivo. Se
recomienda escribir el nombre del archivo en letras mayúsculas, seguido de su descripción en letras minúsculas, esto para
que el programa mismo no provoque algún problema de ejecución.
Programación en MatLab 2
2.7 Recuerde, el comando “Ellipsis” (tres puntos consecutivos) escrito al final de una línea de comandos, dará continuidad en
la siguiente línea, cuando no alcance el espacio para escribir las sentencias deseadas. Sin embargo, no se puede utilizar
para interrumpir una cadena de caracteres encerradas dentro de apóstrofes.
MatLab tiene su propia sintaxis para las sentencias de control de flujo, tal como los lasos “for” y “while”; así como ramales
o estructuras “if-elseif-else”. Además, provee tres comandos: “break”, “error” y “return”, para controlar la ejecución de archivos.
En la siguiente hoja de trabajo se ejemplificaran el uso de estos comandos, por lo que escriba los programas de la forma
indicada y córralos para entender su aplicación.
EJERCICIOS
Escriba las siguientes rutinas y corralas. Depure el programa si encuentra errores de ejecución.
Para ejecutar el comando, desde la ventana de comandos escriba las siguientes líneas:
>>r=1
>>solucion
2. Genere un archivo llamado “solucionf.m” para generar un archivo de función que resuelva el sistema de ecuaciones del
numeral anterior, donde “r” será una variable de entrada, mientras que “Det_A” y “X” serán las variables de salida.
function[Det_A,X]=solucionf(r);
% “solucion” resuelve un sistema de ecuaciones de 3x3 con parámetro r
% Para ejecutar este archivo, escriba:
% [Det_A,X]=solución(r)
% r es la variable de entrada, mientras que Det_A y X son las de salida
%----------------------------------------------------------------------
>>[Det_A,X]=solucionf(1);
Ejecute nuevamente la función, escribiendo la declaración anterior para la función pero sin el punto y coma al final. ¿Qué sucede?
Observe que después de la ejecución de la función, en la ventada de Workspace, solo aparecen las variables de salida declaradas
en la llamada de la función: “Det_A” y “X”.
3. Modifique el archivo anterior para verificar si el determinante de la matriz A es cero, desplegando un mensaje en caso lo
sea, previo a resolver el sistema de ecuaciones.
if Det_A==0
disp(‘El sistema no tiene solución’);
else
X=A\B
end
>>fun=r.^3-32.5*r.^2+(r-22).*r+100
>>r0=fzero(fun,5)
function f=funcionR(r);
% funcionR crea la función f=r^3-32.5r^2+(r-22)r+100
f= r.^3-32.5*r.^2+(r-22).*r+100
>>fzero(‘funcionR’,5)
Se repetirá el ejercicio del numeral anterior pero con funciones de referencia. Para esto se utilizaran las funciones creadas en el
numeral anterior “fun” y “funcionR”. Escriba en la línea de comandos:
>>f1=@fun;
>>r1=fzero(f1,5);
>>f2=@funcionR
>>r2=fzero(f2,5)
6. Resuelva la siguiente ecuación diferencial de primer orden (ODE, Ordinary diferential ecuation), para diferentes valores de
y .
Cree el archivo de función “ode1.m” para definir la ecuación. Escriba el siguiente contenido:
function xdot=ode1(t,x);
% ode1: function que calcula la derivada xdot para los valores dados de t y x
% Sintaxis de llamada: xdot=ode1(t,x)
%--------------------------------------------------------------------------------
global k_valor c_valor
xdot=k_valor*x+c_valor*sin(t);
Ahora cree el archivo de comandos “solecuacion.m” que resuelve la ecuación diferencial ordinaria.
% Archivo de comando para resolver una ecuación diferencial ordinaria de 1er orden
Global k_valor c_valor % declara las variables globales
k_valor=5;c_valor=2; % Se especifica el valor de las variables globales
ts=[0,20]; % Especifica el intervalo de tiempo [t0, t_final]
x0=1.0; % Se especifica la condición inicial
[t,x]=ode23(‘ode1’,ts,x0); % ejecute ode23 para resolver la ODE
NOTA: El comando “global” hace accesible un conjunto de variables para todas o algunas funciones sin necesidad de declararlas
en la lista de variables de entrada. En este caso, si los valores de k_valor y c_valor son modificados en el archivo de
comando, los mismos estarán disponibles en el archivo “ode1”. La declaración “global” aparece solamente en los
archivos de función y comandos de este ejercicio, por lo que solamente estarán disponibles para estos archivos.
7. For - end. Un lazo “For” es usado para repetir una instrucción o un grupo de instrucciones para un número de veces
establecidas. Se utiliza como un contador para repetir una o un grupo de instrucciones.
La sentencia for repite un conjunto de instrucciones un número predeterminado de veces. La sentencia for de MATLAB es muy
diferente y no tiene la generalidad de la sentencia for de C/C++/Java. La siguiente construcción ejecuta sentencias con valores de
k de 1 a n, variando de uno en uno.
for k=1:n
sentencias
end
o bien,
for k=vectorValores
sentencias
end
Donde vectorValores es un vector con los distintos valores que tomará la variable k. En el siguiente ejemplo se
presenta el caso más general para la variable del bucle (valor_inicial:incremento: valor_final); el bucle se ejecuta por primera vez
con k=n, y luego k se va reduciendo de 0.2 en 0.2 hasta que llega a ser menor que 1, en cuyo caso el bucle se termina:
En el siguiente ejemplo se presenta una estructura correspondiente a dos bucles anidados. La variable l es la que varía más
rápidamente (por cada valor de k, l toma todos sus posibles valores):
For k=1:m
for l=1:n
sentencias
end
end
Una última forma de interés del bucle for es la siguiente (A es una matriz):
for k=A
sentencias
end
En la que la variable k es un vector que va tomando en cada iteración el valor de una de las columnas de A.
Cuando se introducen interactivamente en la línea de comandos, los bucles for se ejecutan sólo después de introducir la
sentencia end que los completa.
8. While – end. Un lazo o bucle “while” se utiliza para ejecutar un grupo de instrucciones por un número indefinido de veces
hasta que una condición especificada se cumpla.
while condicion
sentencias
end
Donde condicion puede ser una expresión vectorial o matricial. Las sentencias se siguen ejecutando mientras haya elementos
distintos de cero en condicion, es decir, mientras haya algún o algunos elementos true. El bucle se termina cuando todos los
elementos de condicion son false (es decir, cero).
9. If-elseif-else. Esta estructura provee bifurcaciones lógicas para realizar cómputos o cálculos.
En su forma más simple, la sentencia if se escribe en la forma siguiente (obsérvese que –a diferencia de C/C++/Java– la
condición no va entre paréntesis, aunque se pueden poner si se desea):
if condicion
sentencias
end
Existe también la bifurcación múltiple, en la que pueden concatenarse tantas condiciones como se desee, y que tiene la forma:
if condicion1
bloque1
elseif condicion2
bloque2
elseif condicion3
bloque3
else % opción por defecto para cuando no se cumplan las condiciones 1,2,3
bloque4
end
La opción por defecto else puede ser omitida: si no está presente no se hace nada en caso de que no se cumpla ninguna
de las condiciones que se han chequeado. Una observación muy importante: la condición del if puede ser una condición matricial,
del tipo A==B, donde A y B son matrices del mismo tamaño. Para que se considere que la condición se cumple, es necesario que
sean iguales dos a dos todos los elementos de las matrices A y B (aij=bij,1≤i≤m, 1≤j≤n). Basta que haya dos elementos aij y bij
diferentes para que las matrices ya no sean iguales, y por tanto las sentencias del if no se ejecuten. Análogamente, una condición
en la forma A~=B exige que todos los elementos sean diferentes dos a dos (aij≠bij, 1≤i≤m, 1≤j≤n). Bastaría que
hubiera dos elementos aij y bij iguales para que la condición no se cumpliese. En resumen:
if A==B exige que todos los elementos sean iguales dos a dos
if A~=B exige que todos los elementos sean diferentes dos a dos
Como se ha dicho, MATLAB dispone de funciones especiales para ayudar en el chequeo de condiciones matriciales. Por ejemplo,
la función isequal(A, B) devuelve un uno si las dos matrices son idénticas y un cero en caso de que difieran en algo.
10. Switch-case-otherwise. Esta estructura provee otra forma de realizar bifurcaciones para realizar cálculos. Una
expresión “switch (variable)” es utilizada para definir diferentes casos de ejecución.
La sentencia switch realiza una función análoga a un conjunto de if...elseif concatenados. Su forma general es la siguiente:
switch switch_expresion
case case_expr1,
bloque1
case {case_expr2, case_expr3, case_expr4,...}
bloque2
...
otherwise, % opción por defecto
bloque3
end
Al principio se evalúa la switch_expresion, cuyo resultado debe ser un número escalar o una cadena de caracteres. Este
resultado se compara con las case_expr, y se ejecuta el bloque de sentencias que corresponda con ese resultado. Si ninguno es
igual a switch_expresion se ejecutan las sentencias correspondientes a otherwise. Según puede verse en el ejemplo anterior,
es posible agrupar varias condiciones dentro de unas llaves (constituyendo lo que se llama un cell array o vector de celdas); basta
la igualdad con cualquier elemento del cell array para que se ejecute ese bloque de sentencias. La “igualdad” debe entenderse en
el sentido del operador de igualdad (==) para escalares y la función strcmp() para cadenas de caracteres). A diferencia de
C/C++/Java16, en MATLAB sólo se ejecuta uno de los bloques relacionado con un case.
11. Break. El comando Break dentro de un lazo “while” o “for” finaliza la ejecución del lazo, aun si la condición de un lazo
If es verdadero.
% Ejemplo de Break
for i=1:5
if i>2 % Verifica si i es menor a 2
disp(‘el programa terminó’)
break % Termina la ejecución del lazo
end
disp(‘Presione Enter’)
end
% Ejemplo de Break
% Se calcula las potencias con base 2 y exponentes de 1 hasta 5
num=1;i=1;
while num<6
num=2^i;
i=i+1;
disp(num)
if i>4
disp(‘El programa terminó’)
end
end