Sei sulla pagina 1di 27

07. PROGRAMACION CON MATLAB Mg.

Amado Malca Villalobos

PROGRAMACION CON MatLab

Un programa en MatLab, es una secuencia de instrucciones lógicamente ordenadas, que le indica al


programa en forma detallada todo lo que debe hacer. Si le indicamos algo que no es coherente
matemáticamente, obviamente generara un error.
En un programa por lo general hay que tomar algunas ‘decisiones’, que la asume el computador, para
ello hay que darle la orden adecuada. Así vamos a tener diferentes tipos de instrucciones:

Operadores relacionales
Operadores lógicos
Sentencias condicionales
Sentencias de iteración
Ficheros de función
Programa principal
Subprogramas

OPERADORES RELACIONALES
Estos son un conjunto de operadores básicos, con los cuales se construye cualquier expresión lógica,
la cual arroja el valor “1” si la expresión es verdadera, y genera el valor “0” si al expresión es falsa.
Estas expresiones nos ayudan a tomar decisiones.
Considere los siguientes valores de las variables:
>> x=4,y=5,z=8,w=-6
x= 4
y= 5
z= 8
w = -6
>>
Operador Descripción Tecla rápida Ejemplo
relacional:
Menor que Alt 60 >> x+y<8
< ans = 0
Mayor que Alt 62 >> z+y>w
> ans = 1
Menor o igual que Alt 60, alt 61 >> 2*x+3*y<=38+w
<= ans = 1
Mayor o igual que Alt 62, alt 61 >> x-z+y>=w
>= ans = 1
Igual a Alt 61, alt 61 >> 5*x-z==18+w
== ans = 1
Diferente de Alt 126, alt 61 >> x+y+z+w~=11
~= ans = 0

Notas:
01) El signo “=”, solo asigna un valor, a diferencia de el signo”==” que compara.
02) El resultado de la comparación será 1, cuando sea verdadero, y 0 cuando sea falso.

Ejemplos: Ejecute los siguientes comandos, y analize el resultado:


>> (4>9)+(6==8-2)+(8+5~=13)+(6<=16)
>> (6<9+8)+(1+6>=8-2)+(7-7+8~=17)+(6>=56)
>> (56==78-21)-(16-45~=6*7+9)-(8^2+5==72/6)+3*(6<=16)
>> [1 5 8 9 80]>[2 6 7 28 6]
>> A=[1 2 4;5 6 7;9 8 4]
>> A>=5

>> B=A>=5
>> C=[11 12 44;51 61 71;93 86 44]
>> D=C+5
>> C=[21 -12 44;55 71 71;83 96 54]
>> B==C, D~=B

07 programación en MatLab 1
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

>> X=B==C, Y=D~=B, Z=C<=D


Otro ejemplo, en el que vamos a comparar los elementos de una matriz con el numero más pequeño de
las maquina: eps = 2.2204e-16
>> A=[2 3 6 -8 0 5 ]
A = 2 3 6 -8 0 5
>> abs(A)<eps
ans = 0 0 0 0 1 0
>>

En MATLAB los operadores relacionales pueden aplicarse a vectores y matrices, y


eso hace que tengan un significado especial. Por ejemplo, dada una matriz A la
comparacion abs(A)<eps genera una matriz de 0's y 1's con el mismo tamaño de
A. El elemento (i; j) de dicha matriz es 1 si |Aij| < eps, siendo eps el epsilon de la
maquina (=2.204e-16).
>> A=[-1 2 0; 0 -1 -3; 1 -1 0]
A=
-1 2 0
0 -1 -3
1 -1 0
>> B=abs(A)<eps
B=
0 0 1
1 0 0
0 0 1
>>

La sentencia any(abs(A)<eps) genera un vector de 0's y 1's; 0 si la correspondiente


columna es cero y 1 en caso contrario. Es decir, any responde true si algún
elemento no es cero y false si todos son cero.
>> any(B)
ans = 1 0 1
>>
Y la sentencia any(any(abs(A)<eps)) produce un 0 (i.e. false) si todos los elementos
de any(B) son cero y 1 (true) en caso contrario.
>> any(any(B))
ans = 1
>>
Así pues, la sentencia any(any(abs(A)<eps)) se puede utilizar como una condición.
Será verdadera si y solo si algún elemento de A es, en modulo, más pequeño que
eps. En caso contrario es falsa.
Hay un operador lógico similar: all. Responde true si todos los elementos del vector
son distintos de cero; en caso contrario, responde false. Con la matriz A de más
arriba:
>> all(A)
ans = 0 1 0
>>
En efecto, la _unica columna de A con todos sus elementos distintos de cero es la
segunda. Pero como ninguna columna de A tiene todos sus elementos menores
que eps:
>> all(abs(A)<eps)
ans = 0 0 0
>>

Vemos en estos ejemplos que al igual que en otros lenguajes de programación, si


una comparación se cumple el resultado es 1 (true), mientras que si no se cumple
es 0 (false). Recíprocamente, cualquier valor distinto de cero es considerado como
true y el cero equivale a false. Cuando los operadores relacionales de MATLAB se
aplican a dos matrices o vectores del mismo tamaño, la comparación se realiza

07 programación en MatLab 2
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

elemento a elemento, y el resultado es otra matriz de unos y ceros del mismo


tamaño, que recoge el resultado de cada comparación entre elementos. Por
ejemplo:

>> A=[1 2;0 3]; B=[4 2;1 5];


>> A==B
ans =
0 1
0 0
>> A~=B
ans =
1 0
1 1
>> A>2
ans =
0 0
0 1
>>
Para saber si dos matrices son iguales, se puede usar la expresión isequal(A,B)

>> isequal(A,B)
ans = 0
La expresión isequal(A,B) es equivalente a all(all(A==B)). Por otra parte, isequal es
una de las muchas funciones lógicas que empiezan por is. He aqui una selección
de ellas. Para obtener un listado completo escribe doc is tras el prompt de MATLAB

ischar verdadero si la entrada es un vector de caracteres


isempty verdadero si la entrada es un vector vacio
isequal verdadero si los vectores son iguales
isfinite detecta los elementos finitos de un vector
isfloat verdadero si el vector es de elementos en coma flotante
isinf detecta los elementos infinitos de un vector
isinteger verdadero si el vector es de números enteros
isnan detecta los elementos que son NaN en un vector
isnumeric verdadero si el vector es de números (no de caracteres)
isprime detecta los números primos en un vector
is real verdadero si todos los números del vector son reales
isvector verdadero si se trata de un vector

Algunos ejemplos adicionales con la matriz A de más arriba

>> A
A=
1 2
0 3
>> isfinite(A)
ans =
1 1
1 1
>> isnumeric(A)
ans = 1
>> isreal(A)
ans = 1
>> isvector(A)
ans = 0
>>

07 programación en MatLab 3
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

OPERADORES LÓGICOS
Nom Tecla Ejemplo
Operador Descripción
bre rápida
La conjunción Alt 38 >> (6<9 & 0==7-6)+~(5>=3 & 7~=8-1)
& y ans = 1
La disyunción Alt 124 >> (4|-8)+(6&0)+(~(7>9)|(5==-8))
| o inclusiva ans = 2
La negacion Alt 126 >> ~0+~5+~(-7)
~ no ans = 1
Verdad si cualquiera de los
any elementos de un vector es no cero
Verdad si todos los elementos de un
all vector son no cero

Algunos ejemplos
>> x=[-1 1 1]; y=[ 1 2 -3];
>> x>0, y>0
ans =0 1 1
ans =1 1 0
>> x>0 & y>0
ans =0 1 0
>> x>0 | y>0
ans =1 1 1
>> xor(x>0,y>0)
ans =1 0 1
>> any(x>0)
ans =1
>> all(x>0)
ans =0
>>

Para terminar con los operadores lógicos estudiamos otro comando muy útil: find.
Este comando devuelve los indices (los lugares que ocupan) los elementos no
nulos de un vector. Por ejemplo
>> x=[-3 1 0 -inf 0]
x =-3 1 0 -Inf 0
>> f=find(x)
f =1 2 4
Una primera aplicación es extraer de x los elementos no nulos:
>> x(f)
ans = -3 1 -Inf
Podemos extraer los elementos finitos
> x(find(isfinite(x)))
ans =
-3 1 0 0
o reemplazar las componentes negativas por cero:
>> x(find(x<0))=0
x=01000
Cuando find se aplica a una matriz se hace mirandola como un vector; es decir al
vector A(:) que se obtiene -recordemos- poniendo las columnas de A una debajo de
otra. Por ejemplo
>> A=[ 4 2 16; 12 4 3], B=[12 3 1; 10 -1 7]
A=
4 2 16
12 4 3
B=
12 3 1
10 -1 7

07 programación en MatLab 4
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

>> C=A<B
C=
110
001
>> C(:)
ans =
1
0
1
0
0
1
>> find(A<B)
ans =
1
3
6
Otro posible uso de find con matrices es [i,j]=find(A) que devuelve vectores i y j con
los índices de las filas y columnas de A distintos de cero, respectivamente. Asi
>> [i,j]=find(A<B)
i=
1
1
2
j=
1
2
3
nos dice que en las posiciones (1; 1), (1; 2) y (2; 3) están los elementos de A que
son menores que los de B.

FUNCIONES LÓGICAS PREDEFINIDAS


Función Ejemplos
Equivalencia Descripción
Lógica
La conjunción >> and(4<8,16==9+7)
and(a,b) a b ans = 1
La disyunción inclusiva >> or(4>8,33~=9+7)
or(a,b) a b ans = 1
La negacion >> not(4>8 | 33~=9+7)
.not(a) ~a ans = 0
La disyunción exclusiva >> xor(4>8,33~=9+7)
xor(a,b) a b ans = 1
Cuantificador universal >> all([4 5 7 9])
Si todos son no nulos el valor es 1. ans = 1
all(A) A >> all([4 5 7 9 0])
ans = 0
Cuantificador particular >> any([4 5 7 9 0])
Si algún elemento es no nulo el ans = 1
valor es 1 >> any([0 0 0 0 0 0 0])
any(A) A ans = 0
>> any([0 0 0 0 0 0 6])
ans = 1
>> find([7 6 0 -4;5 -1 3
0;0 2 9 0])
ans = 1
Busca los elementos no nulos, y los enumera,
find(A) indicando el lugar donde se hallan
2
4
5
6

07 programación en MatLab 5
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

8
9
10
>> find([7 6 0 -4;5 -1 3
0;0 2 9 0]>5)
Busca los elementos mayores que el valor d, e ans =
find(A>d) indica el lugar donde se encuentran. 1
4
9

Ejemplo de aplicación:
El vector:
T = [25 38 30 33 34 35 36 38 39 39 40 39 37 35 35 35 34 33 32 32 31 30 28 24]
Representa la temperatura en grados centígrados, por horas del dia 12 de Enero.
a) Indicar cuantas veces la temperatura fue mayor de 30 grados.
b) El número de horas que la temperatura estuvo entre 25 y 35 grados.
c) El número de horas que la temperatura no estuvo entre 20 y 30 grados.

Solución

a) Indicar cuantas veces la temperatura fue mayor de 30 grados.

>> T = [25 38 30 33 34 35 36 38 39 39 40 39 37 35 35 35 34 33 32 32 31 30 28 24]


T = Columns 1 through 14
25 38 30 33 34 35 36 38 39 39 40 39 37 35
Columns 15 through 24
35 35 34 33 32 32 31 30 28 24
>> T>30
ans = Columns 1 through 14
0 1 0 1 1 1 1 1 1 1 1 1 1 1
Columns 15 through 24
1 1 1 1 1 1 1 0 0 0
>> sum(T>30)
ans = 19
>> find(T>30)
ans = Columns 1 through 14
2 4 5 6 7 8 9 10 11 12 13 14 15 16
Columns 15 through 19
17 18 19 20 21
>>
Rpta: 30 veces, en las horas: 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17
18 19 20 21

b) El número de horas que la temperatura estuvo entre 25 y 35 grados.

>> T>25 & T<35


ans = Columns 1 through 14
0 0 1 1 1 0 0 0 0 0 0 0 0 0
Columns 15 through 24
0 0 1 1 1 1 1 1 1 0
>> sum(T>25 & T<35)
ans = 10
>> find(T>25 & T<35)
ans = 3 4 5 17 18 19 20 21 22 23
>>

Rpta: 10 veces, en las horas 3 4 5 17 18 19 20 21 22 23

c) El número de horas que la temperatura no estuvo entre 20 y 30 grados.

>> not(T>20 & T<30)

07 programación en MatLab 6
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

ans = Columns 1 through 14


0 1 1 1 1 1 1 1 1 1 1 1 1 1
Columns 15 through 24
1 1 1 1 1 1 1 1 0 0
>> find(not(T>20 & T<30))
ans = Columns 1 through 14
2 3 4 5 6 7 8 9 10 11 12 13 14 15
Columns 15 through 21
16 17 18 19 20 21 22
>> sum(not(T>20 & T<30))
ans = 21
>>

Rpta: 21 veces en las horas: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16


17 18 19 20 21 22

07 programación en MatLab 7
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

PROGRAMACION EN MatLab

Para la estructura de programación en MATLAB se requiere conocer por lo menos


los siguientes comandos:

END : Determina hasta cual orden llega el efecto de if, for, y while. (Para ejemplos
de su uso ver if, while y for)
IF: Verifica si se cumple cierta condición, y de acuerdo a si se cumple o no
realiza la acción que se desee.
WHILE: Realiza una parte del programa mientras se cumpla alguna condición.
FOR: Muy parecido al While, pero utiliza un contador, es útil si se quiere repetir
una parte del programa un número determinado de veces.
CLEAR: Borra todas las variables de la memoria. Es recomendable usarlo al
principio de todos los programas. (simplemente escriba clear; al comienzo del
programa)
PLOT: Sirve para obtener resultados gráficos en 2D.
DISP: Sirve para escribir texto de salida o vectores. de resultados.
INPUT: Se utiliza para que el programa pida valores de variables mientras se
ejecuta.

SENTENCIAS CONDICIONALES
Sentencia Condicional: if – end

La forma más simple de una bifurcación del tipo if . . . end es la siguiente

if condición
Sentencias
end

Aquí se ejecuta un solo conjunto de instrucciones

Esquema logico Estructura lógica

Diagrama de flujo
Pr ograma
......
en MatLab
Si exp. condicional
Falso Sentencia
if ......
Instrucciones
Verdadero ......
MatLab
......
Instrucciones
End
Pr ograma
End ......
en MatLab

07 programación en MatLab 8
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

Ejemplo: Decidir si un numero entero positivo ingresado por la ventana de comandos


es múltiplo de 3 o de 5.
Solución

Archivo: multiplo35.m Ejecución en MatLab


% Programa que determina si un entero >> multiplo35
positivo es Ingrese un entero positivo: sqrt(2)
% multiplo de 3 o de 5 El numero no es entero positivo
n=input('Ingrese un entero positivo'); >> multiplo35
if n~=round(n) | n<=0 Ingrese un entero positivo: -8
disp('El numero no es entero El numero no es entero positivo
positivo') >> multiplo35
break Ingrese un entero positivo: 60
end El numero es múltiplo de 3
El numero es múltiplo de 5
if rem(n,3)==0 >> multiplo35
disp('El numero es múltiplo de 3') Ingrese un entero positivo: 57
end El numero es múltiplo de 3
if rem(n,5)==0 >> multiplo35
disp('El numero es múltiplo de 5') Ingrese un entero positivo: 56
end El numero no es múltiplo de 3, ni de
if rem(n,3)~=0 & rem(n,5)~=0 5
disp('El numero no es múltiplo de 3, >>
ni de 5')
end

Ejemplo: Un trabajador tiene una remuneración básica como vendedor de 1 200


nuevos soles, pero si las ventas en el mes son mayores a 50 000, tiene una
bonificación adicional del 1% sobre la diferencia. Indicar el salario para diferentes
casos de ventas.
Solución

Archivo: sueldo.m Ejecución en MatLab


>> sueldo
% programa que calcula el sueldo de una indique las ventas efectuadas en el
persona mes 30000
% en base al monto de las ventas indique el monto base de las ventas
% Si las ventas son menor o igual que un 25000
monto M, el sueldo es S indique el salario base
% si la ventas superan M, el sueldo es S 1200
mas El sueldo de cada trabajador es de:
% la diferencia de las ventas con M 1250.00 nuevos soles
V=input('indique las ventas efectuadas >> sueldo
en el mes\n'); indique las ventas efectuadas en el
M=input('indique el monto base de las mes 50000
ventas\n'); indique el monto base de las ventas
S=input('indique el salario base\n'); 60000
if (V>M) indique el salario base
S=S+0.01*(V-M); 1200
end El sueldo de cada trabajador es de:
fprintf('El sueldo de cada trabajador es 1200.00 nuevos soles
de: %6.2f nuevos soles\n',S); >>

07 programación en MatLab 9
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

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, cuando no se cumplan las condiciones 1,2,3
bloque4
end
Donde la opción por defecto else puede ser omitida: si no esta presente no se hace
nada en caso de que no se cumpla ninguna de las condiciones que se han
chequeado.

Sentencia Condicional: if – else - end


Aquí se ejecutan dos grupos de instrucciones

Esquema logico Estructura lógica

Diagrama de flujo Pr ograma


......
en MatLab
Si exp. condicional
Falso
Sentencia
if .... Instrucciones
Verdadero
.... 01 MatLab
Else
Grupo 1 de Grupo 2 de
Instrucciones Instrucciones .... Instrucciones
.... 02 MatLab
End
End
Pr ograma
......
en MatLab

Ejemplo: Determinar si un numero entero positivo es par o impar


Archivo: multiplo35.m Ejecucion en MatLab
% Programa que determina si un entero >> paroimpar
positivo es Ingrese un entero positivo: 67
% par o impar El numero entero es impar
n=input('Ingrese un entero positivo: >> paroimpar
'); Ingrese un entero positivo: 34
if n~=round(n) | n<=0 El numero entero es par
disp('El numero no es entero >> paroimpar
positivo') Ingrese un entero positivo: sqrt(2)
break El numero no es entero positivo
end >> paroimpar
Ingrese un entero positivo: exp(log(5))
if rem(n,2)==0 El numero entero es impar
disp('El numero entero es par')
else
disp('El numero entero es impar')
end

07 programación en MatLab 10
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

Ejemplo: Se necesita calculare el volumen de agua en un tanque, con la forma que se


indica en el grafico
Diametro 44 m
rh
16 m

h
29 m

Diametro 20 m
SOLUCION: El volumen es igual
100 h 0 h 29
3
V h 4 3h 4000
47 29 h 45
3 4 3
Archivo: volumen.m
% programa que calcula el volumen de agua
% de un deposito cilíndrico-conico
% la entrada es el nivel del agua en m.
% La salida es el volumen de agua en m3.
h=input('indique el nivel del agua del tanque\n');
if (h<=29)
V=100*pi*h;
else
V=((4/3)*(((3*h/4)-47)^3))-(4000*pi/3);
end
fprintf('El volumen de es: %6.2f metros cubicos\n',V);
Ejecución en MatLab
>> volumen
indique el nivel del agua del tanque 20
El volumen de es: 6283.19 metros cubicos
>> volumen
indique el nivel del agua del tanque 25
El volumen de es: 7853.98 metros cubicos
>>

x 0 x
Ejemplo: Hallando el valor absoluto de un numero. x
x x 0
Archivo: valorabs.m Ejecución en MatLab
function y=valorabs(x) >> valorabs(88)
% esta fumncion calcula el valor ans = 88
absoluto >> valorabs(-45)
% de un numero real x ans = 45
% donde el resultado es x, si es no >> valorabs(0)
negativo ans = 0
% y es -x si es negativo >>
if (x>=0)
y=x;
else
y=-x;
end

07 programación en MatLab 11
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

SENTENCIA CONDICIONAL: IF – ELSEIF – ELSE - END


Aquí la ventaja es que se pueden ejecutar tres grupos de instrucciones en forma disyuntiva, es decir en
forma independiente.

Esquema lógico Estructura Lógica


Diagrama de flujo ......Pr ograma en MatLab
if exp. condicional
...... Instrucciones
Falso
Sentencia ...... 01 MatLab
if
elseif exp. condicional
Verdadero ...... Instrucciones
Falso
Sentencia
Grupo 1 de ...... 02 MatLab
elseif
Instrucciones
else
Verdadero
...... Instrucciones
Grupo 3 de Grupo 2 de ...... 03 MatLab
Instrucciones Instrucciones
end
......Pr ograma en MatLab
end

Ejemplo: Determinar si un numero entero positivo es par o impar, con un enfoque: : if –


elseif – else - end

Archivo: paroimpar2.m Ejecución en MatLab


% Programa que determina si un
entero positivo es >> paroimpar2
Ingrese un entero positivo: 45
% par o impar El numero entero es impar
n=input('Ingrese un entero >> paroimpar2
positivo: '); Ingrese un entero positivo: -78
if n~=round(n) | n<=0 El numero no es entero positivo
disp('El numero no es entero >> paroimpar2
positivo') Ingrese un entero positivo: sqrt(2)
El numero no es entero positivo
break >> paroimpar2
elseif rem(n,2)==0 Ingrese un entero positivo: 44
disp('El numero entero es El numero entero es par
par') >>
else
disp('El numero entero es
impar')
end

Ejemplo: El siguiente programa comprueba si un numero es positivo, si no lo es


produce un mensaje de error con el comando disp que sirve para escribir mensajes
en la pantalla (más adelante se explica con detalle la acción de este comando). A
continuación comprueba si, siendo positivo, es par. La orden rem(p,q) calcula el
resto de la división euclídea de p por q. Si el número es positivo lo divide por 2 y en
caso contrario, le suma 1 y el resultado lo divide por 2.

07 programación en MatLab 12
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

if n<0 | n==0
disp('Introduce un número positivo');
elseif rem(n,2)==0
a=n/2;
else
a=(n+1)/2
end
Naturalmente la condición n<0 | n==0 podría sustituirse por la más compacta n<=0.
Se ha escrito de la forma expuesta para hacer uso de una condición con dos
relaciones y un operador lógico.

Sentencia: switch-case
Es otra estructura para el control de flujo de un programa. Esta sentencia proporciona un mecanismo
para escoger y ejecutar un grupo de instrucciones de entre varios grupos posibles.
Estructura lógica

......Pr ograma en MatLab


switch exp resion
case valor 1
......
Grupo 1 de instrucciones
......
case valor 2
......
Grupo 2 de instrucciones
......
case valor 3
......
Grupo 3 de instrucciones
......
otherwise
......
Grupo 4 de instrucciones
......
end
......Pr ograma en MatLab

¿Cómo funciona la sentencia switch-case?


El valor de la expresión del switch se compara con los valores de cada comando
case. Si se encuentra una coincidencia, entonces se ejecutan las instrucciones que
siguen a dicho comando case (solo un grupo de instrucciones).
Si hay más de una coincidencia, solo se atenderá a la primera que se encuentra.
Si no se encuentran coincidencias se ejecutan las instrucciones que siguen al
comando otherwise, si este ha sido declarado (es opcional).
Si no se encuentran coincidencias y no está declarado el comando otherwise,
entonces no se ejecutara ninguna instrucción o grupo de instrucciones.
Una sentencia case puede tener más de un valor con el que establecer coincidencias.
Para declararlos solo es necesario ponerlos a continuación, uno detrás del otro, entre
llaves y separados por comas, de la forma: {valor1, valor2, valor3, . . . }. En este
caso al tener más de un valor, el grupo de instrucciones correspondientes al case se

07 programación en MatLab 13
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

ejecutara siempre que al menos haya coincidencia con alguno de los valores
indicados.

Ejemplo: Decidir de un conjunto de notas de 0 a 20, en forma de un vector, y luego indicar:


a) cuantas están entre 0 y 10 inclusive.
b) Cuantas están entre 11 y 13 inclusive.
c) Cuantas están entre 14 y 17 inclusive.
d) Cuantas están entre 18 y 20 inclusive.

Archivo: notalumno.m Ejecución en MatLab


function notalumno(x) >> notalumno(5)
% Programa que discrimina notas: Desaprobado
% Dado las notas en forma de vector >> notalumno(15)
%cuantas están entre 0 y 10 inclusive. Bueno
%Cuantas están entre 11 y 13 inclusive. >> notalumno(sqrt(2))
%Cuantas están entre 14 y 17 inclusive. Compre un cerebro
%Cuantas están entre 18 y 20 inclusive. >> notalumno(-pi)
Compre un cerebro
switch x >> notalumno(20)
case {0,1,2,3,4,5,6,7,8,9,10} Excelente
disp('Desaprobado') >>
case {11,12,13}
disp('Regular')
case {14,15,16,17}
disp('Bueno')
case {18,19,20}
disp('Excelente')
otherwise
disp('Compre un cerebro')
end

Ejemplo de aplicación:
Escribir un programa para convertir una expresión de longitud, que puede estar en m, dm, cm, mm,
dam, hm, km, pulgada, pie, yarda. En otro número equivalente en otra unidad indicada por el usuario.
SOLUCION:
Por cuestiones del espacio en la hoja, primero presentaremos la ejecución y luego el programa.
Ejecución en MatLab
>> cambiounidad
Introduzca el valor de la distancia que hay que convertir: 3777
Introduzca la unidad actual de la distancia (m, cm, dm, mm, dam, hm, km): dm
Introduzca la nueva unidad para la distancia (m, cm, dm, mm, dam, hm, km): km
V=0.3777km
>> cambiounidad
Introduzca el valor de la distancia que hay que convertir: 6799
Introduzca la unidad actual de la distancia (m, cm, dm, mm, dam, hm, km): ham
Introduzca la nueva unidad para la distancia (m, cm, dm, mm, dam, hm, km): m
Horror, La unidad de entrada o la de conversión se ha tecleado en forma incorrecta\n
>> cambiounidad
Introduzca el valor de la distancia que hay que convertir: 98888888
Introduzca la unidad actual de la distancia (m, cm, dm, mm, dam, hm, km): mm
Introduzca la nueva unidad para la distancia (m, cm, dm, mm, dam, hm, km): km
V=98.8889km
>>

07 programación en MatLab 14
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

Programa en MatLab

Archivo: cambiounidad.m
Vent=input('Introduzca el valor de la distancia que hay que
convertir:\n');
UnitEnt=input('Introduzca la unidad actual de la distancia (m, cm, dm,
mm, dam, hm, km):\n','s');
UnitSal=input('Introduzca la nueva unidad para la distancia (m, cm, dm,
mm, dam, hm, km):\n','s');
error=0;
switch UnitEnt
case 'm'
Vi=Vent;
case 'cm'
Vi=Vent/100;
case 'dm'
Vi=Vent/10;
case 'mm'
Vi=Vent/1000;
case 'dam'
Vi=Vent*10;
case 'hm'
Vi=Vent*100;
case 'km'
Vi=Vent*1000;
otherwise
error=1;
end
switch UnitSal
case 'm'
Vf=Vi;
case 'cm'
Vf=100*Vi;
case 'dm'
Vf=10*Vi;
case 'mm'
Vf=1000*Vi;
case 'dam'
Vf=Vi/10;
case 'hm'
Vf=Vi/100;
case 'km'
Vf=Vi/1000;
otherwise
error=1;
end
if error==1
disp('Horror, La unidad de entrada o la de conversión se ha tecleado
en forma incorrecta\n')
else
fprintf('V=%g%s\n',Vf,UnitSal)
end

Ejemplo05: Elabore un programa que pida la edad de una persona, y visualice lo siguiente
Si 0 edad 6 , mostrar: infante
Si 6 edad 12 , mostrar: niño
Si 12 edad 18 , mostrar: adolescente
Si 18 edad 25 , mostrar: joven
Si 25 edad 60 , mostrar: adulto
Si 60 edad , mostrar: anciano

%Etapas de un ser humano


%Uso del comando menu
Edad=menu('Indique su
edad:','0<=E<6','6<=E<12','12<=E<18','18<=E<25','25<=E<60','60<=E');

07 programación en MatLab 15
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

switch Edad
case 1
disp('Infante')
case 2
disp('Niño')
case 3
disp('Adolescente')
case 4
disp('Joven')
case 5
disp('Adulto')
case 6
disp('Anciano')
end

BUCLES o ITERACIONES
Los bucles o iteraciones se usan para controlar el flujo de un programa. En un bucle,
la ejecución de uno o varios comandos se repite varias veces consecutivamente. Cada
una de estas repeticiones se denomina paso o iteración.
En MatLab tenemos definido dos tipos de bucle:

Bucle for-end: el numero de iteraciones se define al comienzo del bucle.

Bucle while-end: El numero de iteraciones no se conoce al inicio del bucle,


depende de que se cumpla o no alguna condición.

En ambos casos se puede salir de estos bucles, antes de que acaben con el comando
breack.

BUCLES DEL TIPO FOR-END


Estructura Lógica
for k f : s :t
k: variable índice del bucle
.... Comandos f: valor inicial de k
.... en MatLab s: incremento del valor k, por defecto 1
t: valor límite de la variable k
end

Ejemplo: Sumar los 50 primeros números enteros positivos múltiplos de 7.


Solución:
SOLUCION:
Programa: sumnat.m Ejecución en MatLab
function s=sumnat(n) >> sumnat(3)
% esta función suma de ans = 6
% los n primeros números naturales >> sumnat(0)
% el resultado es la suma de tales ans = 0
números >> sumnat(-6)
s=0; ans = 0
for k=1:1:n >> sumnat(6)
s=s+k ans = 21
end >>

07 programación en MatLab 16
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

Por ejemplo, para sumar los 25 primeros términos de la serie 1/n:


>> n=0;
>> for i=1:25
n=n+1/i;
end
>> n
n =3.8160
Otra forma de definir una expresión es usando notación vectorial:
>> for x=[pi/6 pi/4 pi/3]
disp([x, sin(x)])
end
0.5236 0.5000
0.7854 0.7071
1.0472 0.8660
n k
1 k
Ejemplo: Calcular la suma de términos de la siguiente serie:
k 1 2k
SOLUCION:
Programa: sumserie.m Ejecución en MatLab
% este programa calcula la suma de >> sumserie
términos ingrese el numero de términos de la
% de la serie: serie: 5
% Sum(k=1:n)((-1)^k)*k/(2^k)) la suma de los términos de la serie es: -
% a función suma 0.2813
% los n primeros números naturales >> sumserie
% el resultado es la suma de tales ingrese el numero de términos de la
números serie: 99
la suma de los términos de la serie es: -
n=input('ingrese el numero de 0.2222
términos de la serie: \n'); >> sumserie
s=0; ingrese el numero de términos de la
for k=1:1:n serie: 5
s=s+((-1)^k)*k)/(2^k); la suma de los términos de la serie es:
end 1.7813
fprintf('la suma de los términos de >>
la serie es: %5.4f \n',s)

Ejemplo: La función seno se puede aproximar usando la serie de Taylor. Como


k
1 x2k 1

sigue: sen( x) , donde x esta en radianes


k 1 2k 1!
SOLUCION:

07 programación en MatLab 17
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

Programa: senserie.m Ejecución en MatLab


% este programa calcula el seno de x, >> senserie
donde x esta en radianes ingrese el valor del ángulo en
% mediante la serie de Taylor % con n grados sexagesimales: 190
términos, en la serie ingrese el numero de términos a
% las variables de entrada son x en considerar: 3
grados sexagesimales El seno aproximado es: 0.5801
% y n que es el numero de términos >> senserie
% La salida es el valor aproximado del ingrese el valor del ángulo en
seno grados sexagesimales: 150
x=input('ingrese el valor del ángulo en ingrese el numero de términos a
grados sexagesimales: \n'); considerar: 7
n=input('ingrese el numero de términos El seno aproximado es: 0.5000
a considerar: \n'); >>
s=0;xr=x*pi/180;
for k=0:1:n-1
s=s+((-
1)^k)*(xr^(2*k+1))/factorial(2*k+1);
end
fprintf('El seno aproximado es: %5.4f
\n',s)

Puede comprobar para x = 1, en sexagesimales seria 180/pi.


k
1 1 1 1 1
sen(1) ..... ....
1! 3! 5! 7! 2k 1 !
Ejemplo: Ahora vamos a considerar el problema de cambiar los elementos de un
vector bajo ciertas condiciones.
El programa multiplica por tres los elementos del vector que sean positivos, y
múltiplos de 3 ó 5; y eleva al cuadrado los negativos mayores que -10.
SOLUCION:
Diagrama de flujo

for k=1:n

x(n)>0&(rem(x(n),3)==0
F | rem(x(n),8)==0)

V
x(n)<0 & x(n)>-10
F x(n) = 3*x(n)

x(n)= (x(n))^2

end

07 programación en MatLab 18
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

Archivo: cambiavector.m
% Este programa cambia los elementos de un vector.
% multiplica por tres los elementos positivos, y múltiplos de 3 ó
5
% eleva al cuadrado los negativos mayores que -10.

x=input('Ingrese un vector con elementos enteros: \n');


n=length(x);

for k=1:1:n
if x(k)>0 & ( rem(x(k),3)==0 | rem(x(k),8)==0 )
x(k)=3*x(k);
elseif x(k)<0 & x(k)>-10
x(k)=x(k)^2;
end
end
x

Ejecucion en MatLab
>> cambiavector
Ingrese un vector con elementos enteros:
[1 5 9 0 -5 -30 64]
x = 1 5 27 0 25 -30 192
>> cambiavector
Ingrese un vector con elementos enteros:
[1 5 7 16 15 -20 -7 9 0 -5 -30 64]
x = 1 5 7 48 45 -20 49 27 0 25
-30 192
>>

Y por supuesto, se pueden encajar múltiples bucles for. . . end unos dentro de otros. El
siguiente código proporciona una matriz simétrica 5 x 5 con el elemento i/j en la posicion (i;
j) para i >= j:
>> n=5; A=eye(n);
>> for j=2:n
for i=1:j-1
A(i,j)=i/j;
A(j,i)=i/j;
end
end
>> A
A=
1.0000 0.5000 0.3333 0.2500 0.2000
0.5000 1.0000 0.6667 0.5000 0.4000
0.3333 0.6667 1.0000 0.7500 0.6000
0.2500 0.5000 0.7500 1.0000 0.8000
0.2000 0.4000 0.6000 0.8000 1.0000

Ejemplo: Crear una matriz de orden m por n, donde el elemento i j este dado por la expresión:
ai j 3i 4 j
SOLUCION:

07 programación en MatLab 19
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

Programa: creamatriz.m
% Creacion de una matriz de orden mxn
% Donde el elemento i j esta dado por
% a(i,j)=3i-4j
m=input('ingrese el numero de filas de la matriz ');
n=input('ingrese el numero de columnas de la matriz ');
A=zeros(m,n);
for k=1:1:m
for l=1:1:n
A(k,l)=3*k-4*l;
end
end
A
Ejecucion en MatLab
>> creamatriz
ingrese el numero de filas de la matriz 4
ingrese el numero de columnas de la matriz 5
A=
-1 -5 -9 -13 -17
2 -2 -6 -10 -14
5 1 -3 -7 -11
8 4 0 -4 -8
>> creamatriz
ingrese el numero de filas de la matriz 5
ingrese el numero de columnas de la matriz 8
A=
-1 -5 -9 -13 -17 -21 -25 -29
2 -2 -6 -10 -14 -18 -22 -26
5 1 -3 -7 -11 -15 -19 -23
8 4 0 -4 -8 -12 -16 -20
11 7 3 -1 -5 -9 -13 -17
>> creamatriz
ingrese el numero de filas de la matriz 0
ingrese el numero de columnas de la matriz 0
A = []
>>

Ejemplo: Construya el triangulo de Pascal como una matriz de orden n por n. Donde
el elemento
a(1,j)=a(i,1)=1; a(i,j)= a(i,j-1)+a(i-1,j) para todo i>1, j>1.
Solución:
SOLUCION:

07 programación en MatLab 20
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

Programa: matrizpascal.m
% Programa que construya el triangulo de Pascal
% como una matriz de orden n por n.
% Donde el elemento a(1,j)=a(i,1)=1
% a(i,j)= a(i,j-1)+a(i-1,j)
% para todo i>1, j>1.

n=input('ingrese el orden de la matriz ');


A=ones(n,n);
for k=2:1:n
for l=2:1:n
A(k,l)=A(k,l-1)+A(k-1,l);
end
end
A
Ejecucion en MatLab
>> matrizpascal
ingrese el orden de la matriz 5
A=
1 1 1 1 1
1 2 3 4 5
1 3 6 10 15
1 4 10 20 35
1 5 15 35 70
>> matrizpascal
ingrese el orden de la matriz 4
A=
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
>>

Ejemplo09: Hallar los términos de la sucesión de Fibonacci hasta el término n

% Calculo de los terminos de la sucesion de Fibonacci:


% F(1)=1
% F(2)=1
% F(n+2)=F(n+1)+F(n), para todo n entero positivo

n=input('Ingrese la cantidad de terminos a mostrar: ');


F=zeros(n,1);
F(1)=1;
F(2)=1;
if n==1 | n==2
disp(F)
elseif n>2
for k=1:n-2
F(k+2)=F(k+1)+F(k);
end
disp(F)
else
disp('El valor de n, no es el adecuado')
end

07 programación en MatLab 21
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

BUCLES DEL TIPO WHILE - END


Este tipo de bucle se usa cuando hay necesidad de un proceso iterativo, pero se
desconoce cuantos pasos deben hacerse, generalmente está sujeto a condiciones que
se hallan al ejecutar la solución del `problema.
En algún caso será necesario del uso de algún comando que pare el programa en caso
de que no se halle la condición pedida.

Estructura lógica
while exp resion _ condicional
.... Instrucciones
.... de MatLab
end

Donde la expresión condicional puede ser una expresión vectorial o matricial. Las sentencias
se siguen ejecutando mientras haya elementos distintos de cero en condición; es decir,
mientras haya algún o algunos elementos true. El bucle se termina cuando todos los
elementos de condición son false (es decir, cero).

Recomendaciones:
La expresión condicional del comando while debe incluir al menos una variable
Respecto a esta variable debe tener un valor asignado cuando se ejecute el comando
while por primera vez
La o las varibles de la expresión condicional deben cambiar entre la sentencia while
y end, de otro modo se tendría un bicle infinito
Para evitar un bucle infinito se puede usar el comando break
Un bucle infinito también se puede terminar con Ctrl + C 0 Ctrl + break

Ejemplo: En el siguiente ejemplo se ejecutan una serie de operaciones sobre un cierto


número n mientras este se mantenga mayor que 1. Concretamente, si n es par se divide por 2
y si es impar se multiplica por 3 y se le suma 1:
while n>1
if rem(n,2)==0
n=n/2
else
n=3*n+1
end;
end;
¿Crees que este proceso tiene fin cualquiera que sea el valor de n? (Conjetura de Collatz,
misterio de Siracusa, problema de Kakutani, algoritmo de Hasse o problema de Ulam).

Ejemplo: A una variable x se le incrementa su valor inicial en 7, mientras que esta


sea menor de 200.
SOLUCION:

07 programación en MatLab 22
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

Programa: incrementador.m
% Este programa incrementa un numero inicial en 7,
% mientras este sea menor que 200
x=input('Ingrese un numero: \n');
n=0;
while x<200;
x=x+7;
n=n+1;
end
fprintf('El nuevo valor es: %-3.2i \n',x)
fprintf('Se ha incrementado %-3i veces el siete\n',n)

Ejecucion en MatLab
>> incrementador
Ingrese un numero: 45
El nuevo valor es: 206
Se ha incrementado 23 veces el siete
>> incrementador
Ingrese un numero: 234
El nuevo valor es: 234
Se ha incrementado 0 veces el siete
>>

Ejemplo: Elaborar un programa que divida en tres partes un intervalo, y tome la parte
intermedia hasta que la longitud sea menor que 0.001
SOLUCION:
Programa: trisecaintervalo.m
% Este programa divide en tres partes un intervalo
% y toma la parte intermedia
% hasta que la longitud sea menor que 0.001
a=input('Ingrese el lado izquierdo del intervalo: \n');
b=input('Ingrese el lado derecho del intervalo: \n');
if b-a > 0.001
while b-a>0.001;
a=(b+2*a)/3;
b=(a+b)/2;
end
fprintf('El lado izquierdo del nuevo intervalo es: %-3.5f
\n',a)
fprintf('El lado derecho del nuevo intervalo es: %-
3.5f\n',b)
else
fprintf('Los datos no generan un intervalo valido. &$####
\n')
end
Ejecucion en MatLab
>> trisecaintervalo
Ingrese el lado izquierdo del intervalo: 1
Ingrese el lado derecho del intervalo: 4
El lado izquierdo del nuevo intervalo es: 2.49977
El lado derecho del nuevo intervalo es: 2.50023
>> trisecaintervalo
Ingrese el lado izquierdo del intervalo: 5
Ingrese el lado derecho del intervalo: 2
Los datos no generan un intervalo valido. &$####
>>

07 programación en MatLab 23
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

Ejemplo: La función exponencial al ser expresada como una serie de Taylor, queda
como sigue:
x xn x 2 x3 x 4 x5
e 1 x
n 0 n! 2! 3! 4! 5!
x
Hallar el valor de e , con los sumandos necesarios hasta que el ultimo sumando sea
menor que 0.000001. Además la suma no debe pasar de 30 términos, si fuese el caso
hay que indicar que se necesitan más sumandos.
Hallar con este programa: e 2 , e 4 , e10 y e 20
SOLUCION:
Programa: seriexp.m
% Este programa calcula el valor de e^x con la Serie de
Taylor
% hasta que el ultimo termino sea menor que 0.00000l,
% o haya 30 términos como máximo

x=input('Ingrese el valor de x: \n');


n=1;sn=1;s=sn;
while sn>0.000001 & n<30

s=s+(x^n)/factorial(n);
n=n+1;
sn=abs((x^n)/factorial(n));
end
if n>=30
fprintf('Se necesitan mas de 30 terminos \n')
else
fprintf('El valor de exp(%f) es %-3.5f\n',x,s)
end
Ejecucion del programa
>> seriexp
Ingrese el valor de x: 2
El valor de exp(2.000000) es 7.38906
>> seriexp
Ingrese el valor de x: 21
Se necesitan mas de 30 terminos
>> seriexp
Ingrese el valor de x: 0
El valor de exp(0.000000) es 1.00000
>> seriexp
Ingrese el valor de x: 8
Se necesitan mas de 30 terminos
>> seriexp
Ingrese el valor de x: 5
El valor de exp(5.000000) es 148.41316
>>

LOS COMANDOS BREAK Y CONTINUE


El comando break se usa principalmente para terminar un posible bucle infinito; si esta dentro de un
bucle, pero si esta en un programa normal, termina el programa.

El comando “continue” lo que hace es terminar la iteración de un bucle y pasar a la siguiente


iteración.

07 programación en MatLab 24
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

EJEMPLOS ADICIONALES
Ejemplo01. Usando el bucle for - end, hallar la raíz cuadrada de los primeros 20
números, y presentarlos en una tabla de 20 por 2.

% Calculo de la raiz cuadrada de los n primeros enteros positivos


% usando el comando for-end
n=input('ingrese la cantidad de terminos: ');
u=[1:n]';
v=ones(n,1);
for k=1:1:n;
v(k)=sqrt(u(k));
end
%R=[u v];
%disp(R)
disp('')
disp('numero raiz cuadrada')
for k=1:n;
fprintf('%5.0i %5.4f\n',u(k),v(k))
end

Ejemplo02: Hallar el factorial de un número entero no negativo

% Calculo de el factorial de un numero entero no negativo

n=input('El valor de n, es: ')


p=1;

if n<0
disp('Error, ingreso un valor inadecuado ')
break
elseif n==0
fact=p;
else
for k=1:n
p=p*k;
end
fact=p;
end

fprintf('El factorial de %5i es %5i\n',n,fact)

Ejemplo03:METODO DE BISECCION
Considérese la ecuación f x 0 , Donde la función f cumple las condiciones para aplicar el
método de las tangentes en cierto intervalo. La solución se da por un proceso iterativo:
x1
f ( xk )
xk 1 xk ,k 1, 2,3,
f '( xk )
x
Según ello resolver: e x 0, x 1,0

% Solucion de una ecuacion f(x) = 0, por el metodo de Newton


%
clear
f=0;
df=0;
x(1)=input('ingrese el valor inicial');
tol=input('Ingrese la tolerancia');
miter=input('ingrese el nuemro maximo de iteraciones');

07 programación en MatLab 25
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

k=1;
d=1;
while abs(d)>=tol & k<miter
[f df]=fun(x(k));
x(k+1)=x(k)-(f/df);
d=x(k+1)-x(k);
k=k+1;
end

if abs(d)>tol
sol=[]
disp('El numero de iteraciones no es suficiente o el proceso
diverge')
else
sol=x'
disp('El numero de iteraciones es:')
k
end

Ejemplo04: Método del Punto Fijo


Considérese la ecuación x g x , Donde la función g cumple las condiciones para aplicar el
método del punto fijo. La solución se da por un proceso iterativo:
x1
xk 1 g ( xk ), k 1, 2,3,
x0 2
Según ello resolver: 1 2
4 4x x x
2
% Solucion de una ecuacion por el metodo del Punto Fijo
%
% Calculo de los terminos de la sucesion de Fibonacci:
% con la funcion recursiva:
% F(1)=1
% F(2)=1
% F(n+2)=F(n+1)+F(n), para todo n entero positivo

x1=input('Ingrese la aproximacion inicial: ');


tol=input('Ingrese la tolerancia de error: ');
miter=input('Ingrese el numero maximo de iteraciones: ');

x(1)=x1;
k=1;
d=1;
while d>=tol & k<miter
x(k+1)=-exp(x(k));
d=abs(x(k+1)-x(k));
k=k+1;
end
disp(x')
fprintf('El numero de iteraciones es: %5.0f',k)

Ejemplo 05: En los meses de Enero a Diciembre del 2012, se registro un promedio de lluvia
mensual :
286 253 254 305 274 203 165 190 161 228 224 280
Hallar el valor promedio en el año
El numero de meses en que la temperatura estuvo debajo de la media, y en qué meses se dio.

07 programación en MatLab 26
07. PROGRAMACION CON MATLAB Mg. Amado Malca Villalobos

clear
lluvia=[286 253 254 305 274 203 165 190 161 228
224 280];

n=length(lluvia);
prom=sum(lluvia)/n;
D=zeros(1,n);
for k=1:n
D(k)=lluvia(k)>prom;
end
D

07 programación en MatLab 27

Potrebbero piacerti anche