Vous êtes sur la page 1sur 33

Universidad Nacional Agraria La Molina

Facultad de Ingeniera Agrcola


Departamento de Recursos Hdricos

Anlisis Numrico
(Aplicaciones con MATLAB)

Programacin
con MATLAB

Jess Abel Meja Marcacuzco, Ph.D.


Lima - Per

PROGRAMACIN CON MATLAB


MATLAB proporciona un lenguaje de programacin
de alto nivel y muy poderoso, con un ambiente
computacional interactivo, que incluye estructuras de
datos, funciones, instrucciones de control de flujo,
manejo de entradas/salidas e incluso programacin
orientada a objetos.
Los programas de MATLAB se escriben en archivos
con extensin .m que no es otra cosa que un cdigo
MATLAB (scripts) que ejecuta una serie de
comandos o funciones que aceptan argumentos y
producen una salida. Los archivos-M se crean con el
editor del MATLAB o cualquier otro editor de texto.

Editor de texto y Archivos-M


Para crear un archivo-M se utiliza el Editor/Debugger, que
se activa desde la barra de herramientas de MATLAB o
mediante File New M-file y una vez editado el
programa se puede guardar dentro del directorio del
MATLAB u otro directorio mediante File Set Path Add
Folder. Para ver el contenido de un archivo-M se usa el
comando type seguido del nombre del archivo.

La estructura de un archivo-M, puede incluir:

Comentarios, los cuales empiezan con el smbolo %


Instruccin para leer los datos de entrada
Instrucciones a ejecutar
Instrucciones para escribir los datos de salida.
Instruccin end para terminar la funcin

Instruccin For
Esta sentencia permite ejecutar de forma repetitiva un comando o grupo
de comandos varias veces. La forma general de un bucle o lazo for es:
for variable = expresin
instruccin 1
instruccin 2
instruccin n
end
El bucle siempre empieza con la expresin for y termina con end, e incluye
en su interior un conjunto de instrucciones. Dentro de la instruccin for
puede incluirse otras instrucciones de for generndose un for anidado,
como puede verse a continuacin:
N=3;
for I = 1:N,
for J = 1:N,
A(I,J) = 1/(I+J-1);
end
end

Ejemplo 1: Suma de los 10 primeros nmeros enteros


suma = 0;
for i =1:10
suma = suma +i;
end
fprintf ('La suma es: %g',suma)
La suma es: 55
Ejemplo 2: Suma de los nmeros enteros pares entre 1 y 10
suma = 0;
for i = 0:2:10
suma = suma +i;
end
fprintf ('La suma es: %g',suma)
La suma es: 30
Ejemplo 3: Factorial de un nmero entero positivo
n = input ('dar un nmero entero positivo \n');
factorialn=1;
for i = 1:n
factorialn = factorialn*i;
end
fprintf('El factorial de % g es %g', n, factorialn)
El factorial de 5 es 120

Ejemplo 4: Aplicacin de for anidado

1 2
suma aij 3 4
i 1 j 1
5 6
n

Suma de todos los elementos de una


matriz nxm:

% Suma de los elementos de una matriz nxm (3X2).


n = input ('nmero de filas \n');
m = input ('nmero de columnas \m');
suma = 0;
for i = 1:n
for j = 1:m
fprintf ('elemento %g,%g',i,j);
a(i,j) = input ('de la matriz \n');
suma = suma + a(i,j);
end
end
fprintf ('La suma total es: %g', suma)
La suma total es: 21

Ejemplo 5: Raz cuadrada, cbica y cuarta de los 10 primeros nmeros enteros


clear,clc
disp( ' N cuadrada cubica cuarta ' )
for N=1:10
fprintf(' \n %10.0f ',N)
for R=2:4
raiz(N)=N^(1/R);
fprintf(' %8.5f %8.5f %8.5f\n ',raiz(N))
end
end
N
1
2
3
4
5
6
7
8
9
10

cuadrada cubica
1.00000 1.00000
1.41421 1.25992
1.73205 1.44225
2.00000 1.58740
2.23607 1.70998
2.44949 1.81712
2.64575 1.91293
2.82843 2.00000
3.00000 2.08008
3.16228 2.15443

cuarta
1.00000
1.18921
1.31607
1.41421
1.49535
1.56508
1.62658
1.68179
1.73205
1.77828

Instruccin While
Esta instruccin o sentencia permite ejecutar de forma repetitiva un comando
o grupo de comandos un nmero determinado de veces mientras se cumple
una condicin lgica especificada. La sintaxis general de este bucle es:
while condicin
instrucciones
end
El bucle siempre empieza con la sentencia while seguida de una condicin, y
termina con end, e incluye en su interior todo un conjunto de instrucciones.
Ejemplo: Volumen de esfera cuyo radio, r, vara de 1 a 5
r=0;
while r < 5
r = r +1;
vol = (4/3)*pi*r ^ 3;
fprintf ('El radio es %g y el volumen es %g. \n',r,vol)
end

Instruccin If-end
La declaracin if-end se usa para cambiar la secuencia en que se ejecutan
las instrucciones, satisfaciendo algunas condiciones los valores de las
variables generados durante el programa. Esta instruccin tiene la forma:
if condicin
instrucciones
End
La condicin del if tambin puede contener operadores lgicos. Si la
condicin no se cumple, el programa ejecuta la instruccin despus de end. A
continuacin se presenta un ejemplo del Uso de if y end:
% El programa pide la calificacin para indicar si aprob o reprob un curso
calif = input ('Dame la calificacin:\n');
if calif >=10.5
fprintf ('Felicidades, ests aprobado')
end
if calif<10.5
fprintf ('Lo siento. Ests reprobado')
end

Instruccin If-else-end
El uso de else permite al programador el uso de un solo if en muchos casos
para ejecutar dos conjuntos de instrucciones. La forma del if-else-end es:
If condicin
Instrucciones 1
else
Instrucciones 2
end
Las instrucciones 1 se ejecutan si la condicin es cierta, y las instrucciones 2
si la condicin es falsa. Se ve que el if-else-end sustituye a dos if-end. A
continuacin se presenta un ejemplo de uso de if, else y end
% El programa pide la calificacin para indicar si aprob o reprob un curso
calif = input ('Dame la calificacin:\n');
if calif >= 10.5
fprintf ('Felicidades, ests aprobado')
else
fprintf ('Lo siento, ests reprobado')
end

Instruccin Elseif
Las sentencias if, al igual que las sentencias for, pueden ser
anidadas. Cuando se anidan varias sentencias if se utiliza la
sentencia elseif, cuya sintaxis general es la siguiente:

if condicin 1
instrucciones 1
elseif condicin 2
instrucciones 2
elseif condicin 3
instrucciones 3
.
elseif condicin n
instrucciones n
end

La sintaxis anidada anterior es equivalente a la sintaxis sin anidar siguiente:


if condicin1
instrucciones 1
else
if condicin2
instrucciones 2
else
if condicin3
instrucciones 3
end
end
end

Ejemplo de if, elseif y end


% El programa pide la calificacin para indicar si aprob o reprob un curso
calif = input ('Dame la calificacin:\n');
if calif >= 10.5
fprintf ('Felicidades, ests aprobado')
elseif calif < 10.5
fprintf ('Lo siento, ests reprobado')
end

Instrucciones Switch-Case
La instruccin switch-case se usa cuando queremos verificar si una expresin
es igual a algn valor determinado. No se puede usar para verificar una
condicin como a>5 o b3. Sin embargo, encuentra aplicaciones en muchas
situaciones donde se requiere ejecutar declaraciones distintas dependiendo
del valor de una expresin. La sintaxis es
switch expresin (escalar o cadena)
case valor 1
instruccin 1
case valor 2
instruccin 2
.
otherwise
instruccin (ejecuta si no cumple ningn caso)
end
A continuacin se presenta un ejemplo de una funcin que devuelve 1.0, 1 u
otro nmero segn sea la entrada:

Ejemplo: Uso de la instruccin switch-case


% El programa pide la calificacin para indicar si aprob o
reprob un curso
% en funcin de datos preestablecidos
calif = input ('Dame la calificacin:\n');
switch calif
case {11,12,13,14,15,16,17,18,19,20}
fprintf ('Felicidades, ests aprobado')
case {0,1,2,3,4,5,6,7,8,9,10}
fprintf ('Lo siento, ests reprobado')
otherwise
fprintf ('No fue suficiente, faltan datos')
end

Instrucciones Continue y Break

La instruccin continue pasa el control a la iteracin siguiente


en el bucle for o while en el cual aparece ignorando las
restantes instrucciones en el cuerpo de bucle. La instruccin
break finaliza la ejecucin de un bucle for o while en el cual
aparece continuando la ejecucin en la siguiente instruccin
fuera del bucle.
Instruccin Return
En ocasiones en que es necesario terminar la ejecucin del
programa, antes de finalizar, se usa la instruccin return. De
este modo, en el momento en que la funcin o programa
encuentra un return, interrumpir la ejecucin y regresar el
control al programa o funcin.

FUNCIONES
Las funciones especficos se definen mediante el comando
function. La sintaxis es la siguiente:
function parmetros de salida = nombre de la funcin(parmetros de entrada)

Ejemplo 1: Definimos la funcin fun1(x)= x3-2x+cosx, creando


el correspondiente archivo-M de nombre fun1.m:
function p = fun1(x)
p = x^3-2*x+cos(x);
El parmetro de salida es p; en nombre de la funcin fun1 y el
parmetro de entrada x. Ejecutando esta funcin, se obtiene:
>> fun1(2)
ans =
3.5839

Ejemplo 2: Funcin que calcula el factorial de n y crea el


archivo factorial.m
function x = factorial (n)
factorial = 1;
if n = = 0
factorial = 1;
else
for i = 1:n
factorial = factorial*i;
end
end
x = factorial
Al ejecutar esta funcin se obtiene:
>>factorial(5)
ans =
120

Ejemplo 3: La funcin factorial (n) se puede reescribir tambin


como una funcin recursiva:
% Funcin fact_rec.m
function x = fact_rec(n)
if n ~=1
x = n*fact_rec(n-1);
else
x = 1;
end
Al ejecutar esta funcin se obtiene:
>> fact_rec(5)
ans =
120

Ejemplo 4: La funcin factorial(n) ahora puede ser parte de otro programa o


puede ser usada repetitivamente sin necesidad de reescribir el cdigo cada
vez que la usemos.
% Archivo programa.m que calcula el factorial de n, verificando si este es
entero o negativo
n = input ('Dame un entero n\n');
error = 0;
if floor (n)~= n % verifica si es entero
error = 1; % n no es entero
end
if n<0 % verifica si n es negativo
error = 2; % n es negativo
end
if error ==1
fprintf ('El nmero que me diste no es entero\n')
elseif error ==2
fprintf ('El nmero que me diste es negativo\n')
elseif error ~=1&&error~=2
x = factorial (n);
fprintf ('El factorial de %g es %g.\n',n,x)
end

Al correr el programa para los valores de n: -6, 5 y 1.4, se


obtiene:

>> programa
Dame un entero n
-6
El nmero que me diste es negativo
>> programa
Dame un entero n
5
El factorial de 5 es 120.

>> programa
Dame un entero n
1.4
El nmero que me diste no es entero

Ejemplo 5: Solucin de una ecuacin de segundo grado: ax2 +


bx + c = 0; cuyas salidas son: x1 y x2:

function[x1,x2]=ecuacion2(a,b,c)
d=b^2-4*a*c;
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
Al correr esta funcin obtenemos, para la ecuacin x2 + 2x + 3 =
0, resulta:
>> [x1,x2]=ecuacion2(1,2,3)
x1 =
-1.0000 + 1.4142i
x2 =
-1.0000 - 1.4142i

Ejemplo 6: Uso de una funcin para ver si un nmero es > 0 < 0:


% Programa principal2.m
x = input ('Dar valor de x: \n');
y = mayor_menor (x);
fprintf ('Termina la corrida. \n')

La funcin mayor_menor es:


% Funcin mayor_menor.m
function y = mayor_menor (x)
if x < 0
fprintf ('x es menor a 0 \n')
y = x;
return
else
fprintf ('x es mayor o igual a 0 \n')
end
y = x;

>> principal2
Dar valor de x:
15
x es mayor o igual a 0
Termina la corrida.

>> principal2
Dar valor de x:
0
x es mayor o igual a 0
Termina la corrida.
>> principal2
Dar valor de x:
-10
x es menor a 0
Termina la corrida.

Variables de funciones
Las variables del programa principal y de una funcin son
independientes aunque tengan el mismo nombre. En
general pueden tener distintos valores, a menos de que
sean declaradas como argumentos de la funcin.
Ejemplo 1: Verificar cmo se pasan las variables entre
subrutinas. Las funciones no tienen declaradas todas las
variables como argumentos de entrada o salida.
Para ello se crean los archivos: primero de la funcin
prueba.m y del programa principal.m
En la siguiente transparencia se presentan los respectivos
archivos:

% Funcin prueba.m para ver variables


function y = prueba(x)
fprintf ('Entrando a la funcin prueba \n')
a = 10;
b = 20;
c = 30;
y = 5;
fprintf ('Estoy dentro de la funcin prueba \n')
fprintf ('Las variables de la funcin prueba son: \n a=%g \n b=%g \n c=%g
\n',a,b,c)
fprintf ('Saliendo de la funcin prueba \n')
% Programa principal.m invoca la funcin prueba con las mismas variables
a = 50;
b = 60;
c = 70;
fprintf ('Las variables del programa principal son: \n a=%g \n b=%g \n c=%g
\n',a,b,c)
y = prueba (1);
fprintf ('Estoy de regreso en el programa principal \n');
fprintf ('Las variables del programa principal son: \n a=%g \n b=%g \n c=%g
\n',a,b,c)

Al correr el programa principal vemos que los valores de a, b y c


declarados antes de la funcin prueba no se pasan a la funcin y al
regresar al programa principal, tampoco se pasan de la funcin al
programa principal ya que no se declararon.
>> principal
Las variables del programa principal son:
a = 50
b = 60
c = 70
Entrando a la funcin prueba
Estoy dentro de la funcin prueba
Las variables de la funcin prueba son:
a = 10
b = 20
c = 30
Saliendo de la funcin prueba
Estoy de regreso en el programa principal
Las variables del programa principal son:
a = 50
b = 60
c = 70

Ejemplo 2: Paso de variables de un programa principal a una


funcin
Para pasar valores del programa principal a una funcin,
consideremos la siguiente funcin:
%Funcin prueba1
function y = prueba1(a,b,c)
a = a*2;
b = b*3;
c = c*4;
y = 5;
fprintf ('Estoy dentro de la funcin prueba2 \n')
fprintf ('Las variables de la funcin prueba2 son: \n a=%g \n
b=%g \n c=%g \n',a,b,c)
fprintf ('Saliendo de la funcin prueba2 \n')

Ahora usamos esta funcin dentro del siguiente programa


principal1:
%Archivo principal1
a = 50;
b = 60;
c = 70;
fprintf('Las variables antes de la funcin prueba2:\n a=%g\n
b=%g \n c=%g\n', a, b, c)
p = prueba1(a,b,c);
fprintf('De regreso al programa principal \n');
fprintf('Las variables del programa principal son: \n a=%g \n
b=%g \n c=%g \n', a, b, c)

Al correr el programa obtenemos lo siguiente:

>> principal1
Las variables antes de la funcin prueba1 son:
a = 50
b = 60
c = 70
Estoy dentro de la funcin prueba1
Las variables de la funcin prueba1 son:
a = 100
b = 180
c = 280
Saliendo de la funcin prueba1
De regreso al programa principal1
Las variables del programa principal1 son:
a = 50
b = 60
c = 70
Notamos que los valores de a = 50, b = 60 y c = 70 se pasan a la funcin,
ah se modifican. Al regresar al programa se mantienen en los valores
originales. Esto quiere decir que podemos pasar valores de variables de
un programa principal a una funcin, pero no a la inversa.

MANEJO DE ARCHIVOS
Los archivos de datos pueden ser creados por MATLAB o por algn otro
programa, permitiendo intercambiar datos entre estos programas. Por
ejemplo, se pueden crear datos con Excel y luego usados por MATLAB para
realizar clculos y graficarlos y viceversa. Una ventaja de usar archivos con
los datos de entrada/salida es que pueden ser almacenados y usados
nuevamente.

Abrir y cerrar archivos


MATLAB abre un archivo con el comando fopen cuya sintaxis es:
fid = fopen (nombre del archivo, licencias)

Despus de terminar de usar los datos de un archivo, este debe cerrarse con
el comando fclose que tiene la sintaxis:
status = fclose(fid)
Donde fid es un identificador (handle) del archivo que se acaba de abrir o
cerrar.

Cuando se abre un archivo este identificador empieza con el valor 3 ya que


los identificadores de -1 a 2 tienen un significado especfico para MATLAB.
Cuando se cierra el archivo la variable status nos da otro identificador para
saber si el archivo se cerr correctamente; un status = 0 indica que se cerr
correctamente y un status -1 indica que no se pudo cerrar el archivo.

Cdigos de licencias para abrir archivos


Licencia
r
r +
w
w +
a
a +

Accin
Abre el archivo existente para leer
Abre el archivo existente para leer y escribir
Abre el archivo existente o crea uno nuevo para escribir
Abre el archivo existente o crea uno nuevo para leer y escribir
Abre el archivo para escribir, aadiendo los nuevos datos al final
Abre el archivo para leer y escribir.

Identificadores para archivos


Identificador fid
-1
0
1
2

Significado
Error al abrir un archivo no existente
Entrada estndar, teclado abierto para escribir (r)
Salida estndar, ventana de comandos abierta para aadir
datos Error estndar; abierto para aadir datos al final

Escritura de informacin en un archivo


La forma ms simple de escribir en un archivo es usando la instruccin fprintf
>>fprintf('Escribe esto que va a la pantalla')
Para escribir a un archivo se requiere crear y luego abrirlos; por ejemplo:
>>fid1 = fopen('archivo1.txt', 'w');
>>fid2 = fopen('archivo2.txt', 'w);

Escribimos a un archivo indicando su identificador; del modo siguiente:


>>fprintf (fid1, 'aqu escribimos a archivo1.txt \n');
>>fprintf (fid2, 'aqu escribimos a archivo2.txt \n');
Para ver lo escrito en el bloc de notas, primero cerramos los archivos con:
>>fclose(3);fclose(4);
Ahora los podemos abrir con el bloc de notas y observar el contenido

INTERCAMBIO DE DATOS ENTRE MATLAB Y EXCEL

Dado que tanto MATLAB como EXCEL pueden leer y escribir datos en
archivos, es posible que los datos de un archivo creado por MATLAB puedan
ser ledos por EXCEL y viceversa. Para ello MATLAB puede crear archivos
de datos separados por comas (separadores o delimitadores) para que
EXCEL pueda leerlos. Al ejecutar, EXCEL abre el archivo y lee los datos
reconociendo que estos datos no fueron creados por Excel y que estn
delimitados por separadores.
Para que Excel pueda leer, datos generados por MATLAB, seleccionamos
Delimited y presionamos Next y en la ventana de dilogo especificamos la
coma como delimitador (el delimitador por omisin es el Tab). Antes de
presionar el botn de siguiente seleccionamos todos los datos, presionamos
finalizar y Excel importa los datos para procesarlos como Excel.
Para leer con MATLAB datos creados en EXCEL, el formato csv permite el
intercambio de datos entre distintos programas. Excel permite crear archivos
con esta extensin que, por lo tanto, pueden ser ledos por MATLAB,
usando: csvread ('archivo.csv')

Vous aimerez peut-être aussi