Vous êtes sur la page 1sur 14

RESUMEN CLASE 6

COMANDOS BÁSICOS PARA ENTRADA Y SALIDA DE DATOS

Input: nos permite solicitar datos empleando un texto (entre comillas simples) de la siguiente manera:
variable = input (‘mensaje para solicitud de datos’);

disp: muestra un texto (entre comillas simples) en pantalla de la siguiente manera:


disp (‘El algoritmo no ha convergido’)

Si se requiere publicar resultados:


disp ([‘El valor de la hipotenusa es: ’ num2str(hipotenusa)])

Ejemplo: ingresar los datos de dos catetos y calcular su hipotenusa.

clc,close all, clear all


%ingreso de datos
cateto_1=input('Introduzca el cateto 1: ');
cateto_2=input('Introduzca el cateto 2: ');
%cálculo de la hiopotenusa:
hipotenusa=sqrt(cateto_1^2+cateto_2^2);

% Publicación de resultados:

% Método 1:
disp('la hipotenusa es: ')
hipotenusa

% Método 2:
disp(['La hipotenusa es: ', num2str(hipotenusa)]);

La pantalla obtenida es la siguiente:


Método 1:

Método 2:
DEBER:
DOS MANERAS ADICIONALES PARA PUBLICAR RESULTADOS
1.- El comando fprintf se utiliza para visualizar salidas de programas (texto y datos) en Ia
pantalla, o bien para almacenarlas en un archivo, a diferencia de disp, Ia salida puede
tener un formato preestablecido. Gracias a su expresividad, el comando fprintf es útil en
Ia visualización de salidas, pero esta misma razón hace que este comando sea un tanto
complejo y con una sintaxis larga en algunos casos. Pero nos permitirá visualizar
mensajes de texto, números y cadenas en la salida, dar formato a la visualización y
almacenar datos en disco.
Para visualizar texto y datos (valores de variables) juntos, el comando fprintf debe
utilizarse siguiendo la sintaxis:

2.- Con el comando fprintf es posible insertar tantos valores numéricos (variables) como
se quiera dentro del texto. Es necesario teclear % (seguido del formato del elemento) en
tantos sitios como se desee dentro de la cadena de texto, poniendo además después de Ia
cadena, y separadas por comas, las variables a las que se hacen referencia. Debe haber
una por cada %, ordenadas de izquierda a derecha por orden de aparición en el texto.
fprintf('...texto...%f...%f...%f...', variable1, variable2, variable3).
El comando fprintf permite vectorización. Esto significa que cuando se introduce una
variable de tipo array para ser visualizada, el comando muestra tantos elementos como
haya en el array, utilizando incluso una visualización apropiada, en forma de columnas y
filas, para el caso de las matrices. Ejemplo:
OPERADORES RELACIONALES

Operador Significado Sintaxis:


< Menor que A<B
<= Menor o igual a A <= B
> Mayor que A>B
>= Mayor o igual a A >= B
== Igual a A == B
~= Distinto de A ~= B

EJERCICIO: realizar un ejemplo con cada uno de los operadores relacionales


>> 5>8
ans =
0 %El resultado es 0 por que la comparación es falsa.
>> a=5<10
a=
1 %El resultado es 1 por que la comparación es verdadera.
>> b=[2 5 6 4];c=[6 9 4 3];
>> d=c>=b
d=
1 1 0 0
>> b=[2 5 6 4];c=[6 9 4 4];
>> b==c
ans =
0 0 0 1
>> c<=b
ans =
0 0 1 1
>> c~=b
ans =
1 1 1 0

OPERADORES LÓGICOS

Nombre Operador Sintaxis Funciones


Equivalentes
Conjunción & expr1 & expr2 and(A,B)
Disyunción | expr1 | expr2 or(A,B)
Negación ~ ~expr not(A)
Disyunción No hay expr1 xor expr2 xor (A,B)
exclusiva operador
Tablas de verdad de los operadores:

Entradas and or not xor


A B A & B A | B ~A xor(A,B)
0 0 0 0 1 0
0 1 0 1 1 1
1 0 0 1 0 1
1 1 1 1 0 0

EJERCICIO: realizar un ejemplo con cada uno de los operadores lógicos


>> A=5;
>> (A>2)&(A<10)
ans =
1
>> B=8;
>> (B<2)|(B>5)
ans =
1
>> ~(B<10)
ans =
0
A = [0 0 pi eps]; B = [0 -2.4 0 1];
C = xor(A,B)
C=
0 1 1 0

OPERADORES LÓGICOS DE CORTOCIRCUITO (&&) (||)

Como vemos en la tabla de verdad anterior, si cualquier operando de una expresión AND es falso, toda la
expresión debe ser falsa. Por lo tanto, si (Exp1) se evalúa como falso, toda la expresión es falsa y se ahorra
tiempo y recursos.
En el caso de OR, si una de las expresiones es verdadera, toda la expresión es verdadera de modo que ya
no hace falta evaluar la otra expresión.
Con el cortocircuito, el segundo operando expr2 es evaluado solamente cuando el primer operando expr1
no determina completamente el resultado.

Sintaxis y descripción
Expr1 && Expr2 representa una operación AND lógica que emplea comportamiento de cortocircuito.
Expr1 || Expr2 representa una operación lógica OR que emplea un comportamiento de cortocircuito.

Ejemplo: En la siguiente afirmación, no tiene sentido evaluar la relación de la derecha si el divisor, b, es


cero.
X = (b ~ = 0) && (a / b> 18,5)
Por tanto, la expresión 1 (parte izquierda) se pone para evitar generar una advertencia de división para cero
de la expresión 2 (parte derecha).
DEBER:

- DOS EJEMPLOS ADICIONALES DE CORTOCIRCUITOS CON AND 1

1.- >> b = 1; a = 20;


x = (b ~= 0) && (a/b > 18.5)
x=
1
2.->>a=5;b=1;c=[2 3 4];
Y=(b>=2)&&(a.*c+b==20)
Y=
0
- DOS EJEMPLOS ADICIONALES DE CORTOCIRCUITOS CON OR

1.- >>X = [1 0 0 1 1]; Y = [0 0 0 0 0];


>> X || Y
>> any(X)||any(Y) %La función any devuelve 1 si algún elemento de X es distinto de
cero, y devuelve cero si todos los elementos de Y son ceros.
ans =
1
2.- >> A = [0 0 0 0 0];B=[0 0 0 0 0];
>> A||B
>> any(A)||any(B)
ans =
0

DECLARACIONES LÓGICAS COMPUESTAS


El número de expresiones que puede evaluar con AND o OR no se limita a dos y se puede tener
declaraciones compuestas, por ejemplo:
expr1 & expr2 & expr3

PRIORIDAD ENTRE OPERADORES:


La prioridad con la que se ejecutan los operadores es la siguiente:

Operador Operación Prioridad


~ NOT La más alta
& AND
| OR La más baja

Sin embargo, se recomienda emplear paréntesis para especificar explícitamente las operaciones que se
desea realizar. Por ejemplo:

(expr1 & expr2) | (expr3 & expr4)

expr1 & (expr2 | expr3) & expr4


DEBER:

- DOS EJEMPLOS ADICIONALES DE DECLARACIONES LÓGICAS COMPUESTAS

1.-
if (notaMedia >= 5) | (examenFinal >= 5)
disp('Aprobado');
end

2.-
if (edad>=18&edad<=20)|(edad==21&edad<=23)
disp('No puede pasar.');
else
disp('Puede pasar.');
end

USO DE OPERADORES ENTRE ESCALARES Y/O MATRICES:


Si uno de los operandos es un escalar y el otro una matriz, el escalar se expande al tamaño de la matriz.
Por ejemplo,
X = 5;
X >= [1 2 3; 4 5 6; 7 8 10]

producen el mismo resultado que:


X = 5*ones(3,3);
X >= [1 2 3; 4 5 6; 7 8 10]

ans =

1 1 1
1 1 0
0 0 0

Como resumen, si S es un escalar, A es una matriz y R es la matriz resultante:

Operación Resultado
S1 & S2 R = S1 & S2
S&A R(1) = S & A(1); ...
R(2) = S & A(2); ...
A1 & A2 R(1) = A1(1) & A2(1);
R(2) = A1(2) & A2(2); ...
S1 | S2 R = S1 | S2
S|A R(1) = S | A(1);
R(2) = S | A(2); ...
A1 | A2 R(1) = A1(1) | A2(1);
R(2) = A1(2) | A2(2); ...
Operación Resultado
~S R = ~S
~A R(1) = ~A(1);
R(2) = ~A(2), ...

Ejemplo (matrices y escalar):

Genere una matriz 3x5 cuyos elementos estén entre 0 y 50. Después encuentre una matriz en la que 1
indique que el elemento respectivo es > 40, de lo contrario muestre 0.

R = 50* rand(3,5)
R > 40

Resultados:

R=

40.7362 45.6688 13.9249 48.2444 47.8583


45.2896 31.6180 27.3441 7.8807 24.2688
6.3493 4.8770 47.8753 48.5296 40.0140

ans =

1 1 0 1 1
1 0 0 0 0
0 0 1 1 1

Ejemplo (matrices y matrices):

Genere una matriz 3x5 cuyos elementos estén entre 0 y 50. Después encuentre una matriz en la que 1
indique que el elemento respectivo está entre 25 y 35, de lo contrario muestre 0.

Resolución:
R = 50* rand(3,5)
(R > 25) & (R < 35)

Resultados:
R=

35.3023 2.3086 34.7414 1.7223 38.2758


1.5916 4.8566 15.8550 21.9372 39.7600
13.8461 41.1729 47.5111 19.0779 9.3436

ans =

0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
INSTRUCCIÓN FIND

Es muy útil para encontrar la ubicación, es decir, los índices de los elementos que cumplan una
determinada condición:

[fila,columna] = find (expresión)

Ejemplo 1:
Genere una matriz 3x5 cuyos elementos estén entre 0 y 100. Después encuentre la ubicación de los
elementos mayores que 25 y menores que 35.

Resolución:
clc, close all, clear all
R = 100* rand(3,5)
[fila, columna] = find (R > 25 & R < 35)

Resultados:

R= fila = columna =
34.9984 61.6045 83.0829 91.7194 75.3729 1 1
19.6595 47.3289 58.5264 28.5839 38.0446 3 1
25.1084 35.1660 54.9724 75.7200 56.7822 2 4

Es decir, los elementos mayores que 25 y menores que 35 están ubicados en (1,1), en (3,1) y en
(2,4).

INSTRUCCIONES PARA CONTROL DE PROGRAMA:

BUCLES IF WHILE SWITCH

for k=n1:paso:n2 if expresión 1 while expresión switch expresión


instruc. 1 instrucciones case expresión 1
instrucciones elseif expression 2 : instruc. 1
: instruc. 2 end case expresión 2
end else instruc. 2
instruc. 3 Con break se rompe la :
Con break se rompe la end ejecución otherwise
ejecución instruc.
end

BUCLES ANIDADOS
Se puede tener tantos bucles anidados como se desee. NO HAY LIMITE.

Ejemplo: Dado la matriz A, sin emplear el operador (:), pasar a vector barriendo a) por filas de derecha a
izquierda, b) por columnas de arriba abajo.
Resolución:

clc, close all, clear all


A=[1 2 3;4 5 6; 7 8 9]
[NumeroDeFilas, NumeroDeColumnas] = size(A);

% Barrido por filas de derecha a izquierda:


k=1;
for i=1:1:NumeroDeFilas
for j=1:1:NumeroDeColumnas
B(k)=A(i,j);
k=k+1;
end
end
B
% Barrido por columnas de arriba hacia abajo:
k=1;
for i=1:1:NumeroDeColumnas
for j=1:1:NumeroDeFilas
C(k)=A(j,i);
k=k+1;
end
end
C

Los resultados obtenidos son los siguientes:

ANIMACIONES:
Con el objetivo de dar vida a nuestros ejemplos posteriores, nos interesa tener un método para poder
realizar animaciones, es decir, una secuencia de gráficos de modo que se vea la evolución de los resultados
dependiendo de la variación de algún parámetro. Para cumplir con este objetivo emplearemos la instrucción
pause que permite detener el proceso en tantos segundos, dentro de un lazo for, por ejemplo. Si se desea
que el resultado actual se superponga con el anterior, emplearemos la instrucción hold on antes de la
instrucción plot.

pause:
- Sin parámetros de entrada: Hace que la función en ejecución se detenga y espere a que presione
cualquier tecla antes de continuar.
- pause (n): Hace que la función en ejecución se detenga y espere durante n segundos antes de
continuar. La resolución del reloj es específica de la plataforma. Una pausa de 0.01 segundos
debería ser soportada en la mayoría de las plataformas.
Ejemplo: realizar la animación de una onda sinusoidal variando su fase.

clc, close all, clear all


x=[-2*pi:0.1:2*pi];

for k=1:20 % 20 valores de fase posible


y=sin(x+k*pi/8);
% hold on % quitar el comentario si se desea superponer las imágenes.
plot(x,y);
grid on
pause(.5) % pausa de 0.5 segundos
end

Si además nos interesa grabar esta secuencia de imágenes en un archivo (avi), se debe capturar cada una
de las gráficas como fotogramas por medio de la instrucción getframe. Todas estas se almacenan en un
arreglo que se puede convertir en archivo avi empleando la instrucción movie2avi.

getframe:
La función getframe devuelve un vector columna con la información necesaria para reproducir la imagen
que se acaba de representar en la figura o ventana gráfica activa. El tamaño de este vector columna
depende del tamaño de la ventana, pero no de la complejidad del dibujo. Generalmete getframe se usa
dentro de un ciclo FOR para crear un arreglo con varios cuadros de una película.

movie2avi:
Crear una película entrelazada de audio / vídeo (AVI) de la película de MATLAB, su sintáxis es:
movie2avi(mov,filename)
movie2avi(mov,filename,param,value,param,value...)

Ejemplo: Determinar la ecuación de una recta que pasa por un punto (x1, y1) y que tenga una pendiente
conocida m. Después, si (x1, y1) es (1,2) realizar la animación de esta recta girando desde 0 a 360 grados.
Resolución:
La ecuación de una recta que pasa por un punto (x1, y1) y tiene una pendiente m=tan α es la siguiente:
𝑦 = m(𝑥 − 𝑥1 ) + 𝑦1 = tan 𝛼(𝑥 − 𝑥1 ) + 𝑦1

Para el caso particular de (x1, y1) = (1,2):

𝑦 = tan 𝛼 (𝑥 − 1) + 2

Ya que necesitamos que la recta gire desde 0 hasta 360, el ángulo alfa actuará como contador en el lazo
for:
clc, close all, clear all
for angulo =1:360
x=-50:0.1:50;
y=tan(angulo*pi/180)*(x-1)+2;
plot (x,y);
grid on;
axis ([-50,50,-50,50]);
xlabel ('x');
ylabel('y');
M(angulo) = getframe
end

movie2avi (M, 'video2','fps', 10)

DEBER:
Realizar DOS aplicaciones libres sobre animación que tengan una complejidad considerable.

1.- Animación del tiro parabólico:

Código:
clear,close all,clear all
figure(1)
%variables
x=[];
v=[];
F=[];
%parametros
m=1;
g=[0;-9.81];
h=0.01;
%condiciones iniciales
x=[0;0];
v=[0.1;4];
%variable externa
F=m*g;
for step=1:100
plot(x(1),x(2),'ob');
title(['step :',num2str(step)]);
axis([-0.2 0.2 -1 1]);
pause(0.01);
%guardar valor anterior
xa=x;
va=v;
%paso integración
vpm = va + (h/2)*(F/m);
xpm = xa + (h/2)*va;
v = va + h*(F/m);
x = xa + h*vpm;
end
2.- Órbita de una partícula alrededor de otra estática.

Código:
clear,clear all,close all
figure(1)
%variables
x=[];
v=[];
F=[];
%parametros
m=1;
M=1e20;
G=6.67e-11;
h=0.01;
%condiciones iniciales
x=[-1e3;0];
v=[0;-2e3];
%variable externa
F=-G*(m*M/norm(x)^2)*(x/norm(x));
for step=1:500
hold off;
scatter(x(1),x(2), 'black','filled');
hold on
scatter(0,0,'black','filled');
title(['step : ', num2str(step)]);
axis([-1.5e3 1.5e3 -1.5e3 1.5e3]);
pause(0.01);
%guardar valor anterior
xa=x;
va=v;
%paso integración
F=-G*(m*M/norm(xa)^2)*(xa/norm(xa));
vpm = va + (h/2)*(F/m);
xpm = xa + (h/2)*va;
F=-G*(m*M/norm(xpm)^2)*(xpm/norm(xpm));
v = va + h*(F/m);
x = xa + h*vpm;
end

Vous aimerez peut-être aussi