Está en la página 1de 54

Captulo 2

Programacin y Control de Flujo

Salvador Acha Daza, Ph. D.


Presidente del NIAT, S. C.
10/03/16

Programacin y control de flujo


2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9

for, while, if-then-else, break


Funciones, sub-funciones, funciones anidadas
Espacio de trabajo y trayectoria de trabajo
Importacin y exportacin de archivos de datos (texto, hojas
electrnicas, grficas)
Polinomios, races, evaluacin y diferenciacin
Ecuaciones diferenciales ordinarias y Ecuaciones algebraicas de
diferencias
Regresin, Ajuste de curvas
Filtrado de datos y Transformada rpida de Fourier (FFT)
Entrada / salida por puerto serial, comunicacin con perifricos:
modems, impresoras e instrumentos cientficos

10/03/16

Introduccin
El control del flujo durante la ejecucin de
comandos se basa en la estructura de toma de
decisiones.
Con clculos anteriores se decide las operaciones
futuras.
Las estructuras de decisin son del tipo: ciclos for,
ciclos while, if-then-else.
Las estructuras pueden requerir numerosas
instrucciones, entonces pueden formar parte de un
archivo M.

10/03/16

2.1 for, while, if-then-else, break

10/03/16

Ciclo for
x=

Permite que un grupo de comandos


Columns 1 through 7
(instrucciones) se repitan un nmero fijo
0.3090 0.5878 0.8090 0.9511 1.0000
y preestablecido de veces.
Sintaxis
for x=arreglo
(comandos)
end
Los comandos entre el for y el end se
ejecutan una vez por cada columna en
arreglo.
for n=1:10
x(n)=sin(n*pi/10);
end
x

10/03/16

0.9511 0.8090
Columns 8 through 10
0.5878 0.3090 0.0000

1. Un ciclo for no puede terminarse


reasignndole valor a n dentro del ciclo.
2. La creacin del arreglo 1:10 es estndar en
MATLAB. Cualquier arreglo se puede usar en
el ciclo for.
3. Los ciclos for pueden anidarse como se
requiera.
4. Debe evitarse su uso siempre que exista un
procedimiento vectorizado.
5. Para maximizar velocidad se debe preasignar
espacio de arreglos.

Ciclo for
for n=1:10
x(n)=sin(n*pi/10);
n=5;
end
x
x=
Columns 1 through 7
0.3090 0.5878 0.8090 0.9511
1.0000 0.9511 0.8090
Columns 8 through 10
0.5878 0.3090 0.0000
data=[3 9 45;7 16 -1]
data =
3 9 45
7 16 -1
for n=data
x=n(1)-n(2)
end

10/03/16

x=
-4
x=
-7
x=
46
for n=1:2
for m=3:-1:1
A(n,m)=n*n+m*m;
end
end
A
A=
2 5 10
5 8 13

Ciclo for
n=1:10;
x=sin(n*pi/10)
x=
Columns 1 through 7
0.3090 0.5878 0.8090
0.9511 0.8090
Columns 8 through 10
0.5878 0.3090 0.0000

0.9511 1.0000

Este procedimiento se ejecuta ms rpido, es ms


intuitivo y necesita de menos instrucciones.
x=zeros(1,10); % Se preasigna memoria para x
for n=1:10
x(n)=sin(n*pi/10);
end

10/03/16

Ciclo while
Permite que un grupo de comandos
(instrucciones) se evale un nmero
indefinido de veces.
Sintaxis
while expresin
(comandos)
end
Los comandos entre el while y el end
se ejecutan siempre que los elementos
en la expresin sean verdaderos.

10/03/16

num=0;eps=1;
while (1+eps)>1
eps=eps/2;
num=num+1;
end
num
num =
53
eps=2*eps
eps =
2.2204e-016
Esta es una manera de calcular la variable especial
de MATLAB eps. Es un nmero que al
adicionarse a 1 no es significativamente superior a
1 (debido a la precisin finita de 16 digitos, se
espera 10-16).

If-else-end
Muchas veces las secuencias de
comandos deben valuarse con base a
una prueba relacional.
if expresin
(comandos)
end
Los comandos entre el if y end se
evalan si todos los elementos en
expresin son verdaderos (diferentes de
cero).

10/03/16

manzanas=10;
% nmero de manzanas
costo=manzanas*2.5 % costo de las manzanas
costo =
25
if manzanas>5

% dar un 20% de descuento


% al mayoreo
costo=(1-20/100)*costo;

end
costo
costo =
20

if-else-end
En casos que tienen dos alternativas.
if expresin
(comandos valuados si Verdadero)
else
(comandos valuados si Falso)
end
Cuando hay ms de dos alternativas:
if expresin1
(comandos valuados si expresin1 es Verdadera)
elseif expresin2
(comandos valuados si expresin2 es Verdadera)
else
(comandos valuados si las otras expresiones son Falsas)
end

10/03/16

10

break
Es posible salir de los ciclos for y while de manera apropiada, usando la
instruccin break.
EPS=1;
for num=1:1000
EPS=EPS/2;
if (1+EPS)<=1
EPS=EPS*2
break
end
end
EPS =
2.2204e-016
num
num =
53

10/03/16

11

2.2 Funciones, sub-funciones,


funciones anidadas.

10/03/16

12

Funciones
Son creadas en MATLAB como archivos de comandos, pero deben iniciar con el
encabezado siguiente:
Function [variables de salida]= Nombre de la Funcin
(variables de entrada)
Las variables temporales usadas dentro de la funcin son locales. Despus de ejecutada la
funcin desaparecen del espacio de trabajo.
Ejemplo.- funcin trace:
function t = trace(a)
% Trace suma de elementos de la diagonal
% trace(A) es la suma de los elementos diagonal de A
% que es tambin la suma de los eigenvalores de A
t = sum(diag(a));
A=
1 2
3 4
trace(A)
ans =
5

10/03/16

13

Funciones
Una lnea al inicio de la funcin m tiene la sintaxis de
definicin, en la primera lnea del archivo-M el nombre de la
funcin debe ser el mismo que en el archivo sin extensin .m:
function [mean,stdev] = stat(x)
n = length(x);
mean = sum(x)/n;
stdev = sqrt(sum((x-mean).^2/n));
Se define la funcin llamada stat:
Calcula la media y la desviacin estndar de un vector x.
Las variables dentro del cuerpo calculan la media y la desviacin
estndar de un vector. Las variables dentro del cuerpo de la funcin
son variables locales.

10/03/16

14

2.3 Espacio de trabajo y trayectoria


de trabajo

10/03/16

15

Espacio de trabajo
workspace muestra una herramienta para
administrar el espacio de trabajo.
Graphical Interface
Como alternativa a la funcin workspace, se
selecciona workspace desde el men en el
escritorio de MATLAB.
Descripcin
workspace muestra el buscador workspace, que es
una interfase grfica para el usuario que le permite
ver y manejar el contenido del espacio de trabajo
de MATLAB. Muestra una representacin grfica
del desplegado whos, y permite llevar a cabo
funciones equivalentes a clear, load, open, y save.

10/03/16

16

Trayectoria
Interfase Grfica
Como una alternativa a la funcin de trayectoria, se usa la caja de dilogo Set
Path. Para abrirla se selecciona Set Path desde el menu File en el escritorio de
MATLAB.
Sintaxis
path
path('newpath')
path(path,'newpath')
path('newpath',path)
p = path(...)

10/03/16

17

2.4 Importacin y exportacin de


archivos de datos (texto, hojas
electrnicas, )

10/03/16

18

Importacin de datos
Para importar archivos de datos ASCII delimitados
Si los datos usan un caracter diferente a un delimitador de espacio, se tiene varias
funciones para importar. La ms sencilla es la funcin dlmread, por ejemplo para el
archivo ph.dat con contenidos separados por punto y coma:
7.2;8.5;6.2;6.6
5.4;9.2;8.1;7.2
Para leer todo el contenido de este archivo hacia un arreglo llamado A, con la forma
A = dlmread('ph.dat', ';');
Se especifica el delimitador usado en el archivo de datos como el segundo argumento
de dlmread. An cuando los ltimos elementos en cada rengln no tiene al
delimitador, dlmread puede procesar el archivo de manera correcta. dlmread ignora
los caracteres de espacio entre los datos. As el comando dlmread funciona an si el
contenido de ph.dat es
7.2; 8.5;
6.2;6.6
5.4; 9.2 ;8.1;7.2

10/03/16

19

Importacin de datos
Importacin de Datos desde Archivos-MAT
Se usa la funcin load
Se revisan los contenidos de MAT-File
Cargar a una estructura
Cargar Data Binarios
Cargar Datos ASCII
Al usar la funcin de carga
Para importar variables desde un archivo binario o ASCII sobre un disco hacia el
espacio de trabajo, se use la funcin load. Se puede cargar todas las variables desde el
espacio de trabajo en una sola operacin (si se omite el nombre del archivo, MATLAB
carga desde el archivo matlab.mat)
Las variables de carga o cargar justo aquellas variables que ya se especifican:
load nombrearchivo var1 var2 ... varN
Al usar el caracter (*) en el nombre para cargar aquellas variables que cumplen con
un patrn especfico. (Slo funciona para archivos MAT.) Por ejemplo, el siguiente
comando carga todas las variables que inician con str desde el archivo strinfo.mat
load strinfo str*

10/03/16

20

Exportacin de datos
Exportando Archivos de Datos ASCII Delimitados
Para exportar un arreglo como un archivo de datos ASCII delimitado, puede usarse la
funcin save, especificando el calificador -ASCII, o la funcin dlmwrite.
Usando la funcin save
para exportar el arreglo A,
A = [ 1 2 3 4 ; 5 6 7 8 ];
Se usa la funcin save, como se muestra:
save my_data.out A -ASCII
Si se ve el archivo creado en un editor de texto, se tiene:
1.0000000e+000 2.0000000e+000 3.0000000e+000 4.0000000e+000
5.0000000e+000 6.0000000e+000 7.0000000e+000 8.0000000e+000
Por default, save usa espacios como delimitadores pero se pueden usar tabs en lugar de
espacios al especificar la opcin -tabs.

10/03/16

21

Exportacin de datos
Exportando Archivos de Datos ASCII Delimitados
Para exportar un arreglo como un archivo de datos ASCII delimitado, puede usarse la
funcin save, especificando el calificador -ASCII, o la funcin dlmwrite.
Usando la funcin dlmwrite
Para exportar un arreglo en formato ASCII y especificar un delimitador usado en el
archivo, se usa la funcin dlmwrite.
Por ejemplo, para exportar el arreglo A,
A = [ 1 2 3 4 ; 5 6 7 8 ];
Como un archivo de datos ASCII que usa punto y como delimitador, se hace por
medio del comando:
dlmwrite('my_data.out',A, ';')
Si se usa un editor de texto el contenido del archivo se ve como:
1;2;3;4
5;6;7;8
Observe que dlmwrite no inserta delimitadores al final de los renglones.

10/03/16

22

Hojas electrnicas

10/03/16

23

2.5 Polinomios:
races, evaluacin y diferenciacin

10/03/16

24

Races de polinomios
Encontrar races de un polinomio, es decir aquellos valores en los cuales
p(x) = 0. En MATLAB un polinomio se representa por un vector rengln de
sus coeficientes en orden descendente.
p ( x) x 4 12 x 3 25 x 116

>> p=[1 -12 0 25 116]


p=
1 -12 0 25 116
>> r=roots(p)
r=
11.7473
2.7028
-1.2251 + 1.4672i
-1.2251 - 1.4672i

10/03/16

>> pp=poly(r)
pp =
1.0000 -12.0000 -0.0000 25.0000 116.0000
>> pp=real(pp)
pp =
1.0000 -12.0000 -0.0000 25.0000 116.0000

25

Multiplicacin de polinomios
Se lleva a cabo por medio de la convolucin de dos arreglos.
a ( x) x 3 2 x 2 3x 4
b ( x) x 3 4 x 2 9 x 16

>> a=[1 2 3 4]; b=[1 4 9 16];


>> c=conv(a,b)
c=
1 6 20 50 75 84 64
c ( x) x 6 6 x 5 20 x 4 50 x 3 75 x 2 84 x 64

Una multiplicacin de ms de dos polinomios se obtiene por el uso repetido


de conv.

10/03/16

26

Suma
No se da una funcin directa para la suma de polinomios.
a ( x) x 3 2 x 2 3x 4
b ( x) x 3 4 x 2 9 x 16

>> d=a+b
d=
2 6 12

20

d ( x) 2 x 3 6 x 2 12 x 20

Con polinomios de orden diferente el de menor orden debe llenarse con


ceros para hacerlo del mismo orden.
>> e=c+[0 0 0 d]
e=
1 6 20 52

10/03/16

81

96

84

27

Divisin
Cuando se requiere dividir un polinomio entre otro se usa deconv.
c ( x) x 6 6 x 5 20 x 4 50 x 3 75 x 2 84 x 64
b ( x) x 3 4 x 2 9 x 16

>> [q,r]=deconv(c,b)
q=
1 2 3 4
r=
0 0 0 0 0

10/03/16

28

Derivadas
Con la instruccin polyder se logra este resultado.
>> g=[1 6 20 48 69 72 44]
g=
1 6 20 48 69 72 44
>> h=polyder(g)
h=
6 30 80 144 138 72

10/03/16

29

Grficas
Debe ser posible evaluar polinomios. La funcin polyval
>> x=linspace(-1,3); % Cien puntos entre -1 y 3
>> p=[1 4 -7 -10]
% Usa el polinomio
p=
Evaluacin de polinomio
35
1 4 -7 -10
30
>> v=polyval(p,x);
25
>> plot(x,v),title('Evaluacin de
polinomio'),xlabel('x')
20
15
10
5
0
-5
-10
-15
-1

10/03/16

-0.5

0.5

1
x

1.5

2.5

30

Evaluacin matricial
Con la funcin polyvalm(p,A) se trabaja en el espacio de las matrices
cuadradas.
n
Un polinomio est dado como: p( s) pi s i
i 0

Y con la matriz cuadrada A, p(A) se tiene como:


p= 1 1 1
A=[2 3;5 8]
A= 2
5

p( A) pi Ai
i 0

p( s) pi s i p2 s 2 p1s p0 s 2 s 1
i 0

3
8

polyval(p,A)
ans = 7 13
31 73
polyvalm(p,A)
ans = 22 33
55 88

p ( 2)
p(5)

p(3)

7 13

p(8) 31 73

22 33
p ( A) pi Ai p2 A 2 p1 A p0 A 2 A I

i 0
55 88

10/03/16

31

Polinomios racionales
En expresiones de las transformadas Fourier, Laplace o Z aparecen
polinomios racionales. En MATLAB se representan por los polinomios del
numerador y del denominador. Se usa la funcin residue.
10( s 2)
( s 1)( s 3)( s 4)

10/03/16

>> num=10*[1 2];


% Numerador del polinomio
>> den=poly([-1;-3;-4]); % Polinomio del Denominador
>> [res,poles,k]=residue(num,den)
res =
-6.6667
5.0000
1.6667
poles =
-4.0000
-3.0000
-1.0000
k=
[]

32

Polinomios racionales
El resultado anterior significa que las fracciones parciales son:
10( s 2)
6.6667
5
1.6667

0
( s 1)( s 3)( s 4)
( s 1)
( s 3) ( s 4)

La funcin residue tambin puede realizar la operacin inversa:


>> [n,d]=residue(res,poles,k)
n=
-0.0000 10.0000 20.0000
d=
1.0000 8.0000 19.0000 12.0000
>> roots(d)
ans =
-4.0000
-3.0000
-1.0000

10/03/16

33

Derivadas de polinomios racionales


La funcin polyder obtiene la derivada si se dan las dos entradas.

d
10( s 2)

ds ( s 1)( s 3)( s 4)

>> [b,a]=polyder(num,den)
b=
-20 -140 -320 -260
a=
1 16 102 328 553 456 144

10/03/16

34

2.6 Ecuaciones diferenciales


ordinarias y Ecuaciones algebraicas de
diferencias

10/03/16

35

Ecuaciones diferenciales
MATLAB tiene dos mtodos para resolver ecuaciones diferenciales
ordinarias.
1. ode23 mtodo de Runge-Kutta de 2 y 3er orden
2. ode45 mtodo de Runge-Kutta de 4 y 5 orden
dx
f ( x, t )
Se requiere forma normal como en sistema de primer orden:
dt

Donde x es un vector cuya longitud es el orden de la ecuacin y t es la variable


independiente (tiempo para sistemas dinmicos).
La forma de llamado de la funcin:

[ x, t ] ode23(' xdot ' , t 0, tf , x0)

Donde xdot.m es el archivo que permite calcular la funcin f, con dos


argumentos de entrada t y x.
t0 y tf son tiempo inicial y final y x0 vector de condiciones iniciales.

10/03/16

36

Ejemplo
Un caso interesante es la ecuacin de van der Pol:
d 2x

( x 2 1)

dt 2
x 1 x2

dx
x0
dt

x 2 x2 (1 x12 ) x1

function dydt = vanderpol(t,y,Mu)


% funcin vanderpol.m define la ecuacin
dydt = [y(2); Mu*(1-y(1)^2)*y(2)-y(1)];
Ecuacin van der Pol, = 1

2.5

% Grfica de la solucin
plot(t,y(:,1))
xlabel('t')
ylabel('solucin y')
title('Ecuacin van der Pol, \mu = 1')

10/03/16

2
1.5
1
solucin y

% Archivo "Ecdiff1.m". Comandos para llamar


% ODE45
tspan = [0, 20];
y0 = [2; 0];
Mu = 1;
[t,y] = ode45(@vanderpol, tspan, y0,[],Mu);

0.5
0
-0.5
-1
-1.5
-2
-2.5

10
t

12

14

16

18

37

20

Ejemplo (cont.)
>> plot(t,y(:,1),t,y(:,2))

-1

-2

-3

10/03/16

10

12

14

16

18

20

38

Ecuaciones de diferencias
Las ecuaciones de diferencias y MATLAB filtering tienen funciones para
trabajar ecuaciones de diferencias y filtros.
Las funciones operan sobre vectores.
Los vectores se usan para almacenar seales de datos muestreados, en
secuencias para el procesamiento de seales y el anlisis de datos.
En sistemas con entradas mltiples, cada rengln de una matriz corresponde a
un punto de muestra con cada entrada colocada como una columna de la
matriz.
La funcin y = filter(b,a,x)
procesa los datos en el vector x con el filtro descrito por el vector a y b,
creando los datos filtrados y.

10/03/16

39

Ecuaciones de diferencias
El comando filter puede pensarse como una implementacin eficiente de una ecuacin
de diferencias.
La estructura del filtro es de la forma general de lnea con retardo y derivaciones,
descrita por la ecuacin de diferencias, como se muestra, donde n es el ndice de la
muestra actual, na es el orden del polinomio descrito por el vector a y nb es la orden del
polinomio descrito por el vector b.
La salida y(n), es una combinacin lineal de las entradas actuales y previas, x(n) x(n1) ..., y salidas previas, y(n-1) y(n-2) ... Si se supone, por ejemplo que se desea
suavizar los datos de transito con un filtro de promedios mviles para ver el transito
promedio en una ventana de 4 horas. Este proceso se representa por una ecuacin de
diferencias. a(1) y (n) b(1) b(2) x(n 1) b(3) x(n 2) b(nb) x(n nb 1)
a (2) y (n 1) a(3) y (n 2) a (na ) x(n na 1)
y ( n)

10/03/16

1
1
1
1
x(n) x(n 1) x(n 2) x(n 3)
4
4
4
4

40

Ecuaciones de diferencias
a = 1;
b = [1/4 1/4 1/4 1/4]; load count.dat; x = count(:,1); y = filter(b,a,x);
t = 1:length(x);
plot(t,x,'-.',t,y,'-'), grid on, legend('Datos originales','Data suavizados',2)
120
Datos originales
Data suavizados
100

80

60

40

20

10/03/16

10

15

20

25

41

Ecuaciones de diferencias y funcin de


transferencia
Las diferencias son la base de los sistemas discretos que son la contraparte
de las ecuaciones diferenciales lineales de orden n y con coeficientes
constantes.
A partir de estas expresiones se aplica la transformada z, considerando
condiciones iniciales cero y a partir de ah se obtienen las funciones de
transferencia.
n

k 0

k 0

ak xn k bk u n k

nm

k
a
z
X
(
z
)

k
bk z k U ( z )
k 0

k 0

bk z k

m
m 1
b1 z b0
bm z bm 1 z
an z n an 1 z n 1 a1 z a0
k
ak z
k 0

X ( z)
G( z)

U ( z)

10/03/16

k 0
n

42

2.7 Regresin y ajuste de curvas

10/03/16

43

Mnimos Cuadrados
Salvador Acha Daza
Presidente del NIAT, S. C.

10/03/16

44

Introduccin
Se trata de mostrar de manera sencilla el ajuste de curvas a
datos experimentales, usando el concepto de mnimos
cuadrados.
En muchas aplicaciones de la ingeniera y de la ciencia los
modelos son lineales en los coeficientes; lo cual permite
escribir una forma explcita para la solucin.
Al tener redundancia, (mayor nmero de observaciones que
parmetros), se puede plantear bajo consideraciones
estadsticas apropiadas una prueba de significacin estadstica
para los parmetros del modelo propuesto.
10/03/16

45

Ecuaciones para el Clculo de los


Coeficientes
Fig. 1 Diagrama de dispersin, observaciones en el plano x-y
x

x
x

Al sumar los errores al cuadrado, se tiene SS


n

SS i2
2
1

2
2

2
n

i 1

i y iobs y iterica y iobs (a 1 x i a o )

10/03/16

46

El gradiente de SS:
2
2
2
2
SS y1 a1 x1 a o y 2 a1 x 2 a o y 3 a1 x 3 a o y 4 a1 x 4 a o
y las componentes del gradiente se obtienen como:
SS
a 0
1
SS

SS 0
a o

Artculo mnimos cuadrados


S. Acha D., D. Acha Izq.

10/03/16

47

2.8

Filtrado de datos y Transformada rpida de


Fourier (FFT)

10/03/16

48

Transformada rpida de Fourier


El dominio de la frecuencia tiene herramientas como Series de Fourier,
Transformada de Fourier y sus formas discretas, las cuales son piezas clave
en el procesamiento de seales. MATLAB tiene implementadas las
funciones fft, ifft, fft2, ifft2 y ffshift, que trabajan las transformadas
discretas y sus inversas en una y dos dimensiones.
La funcin fft calcula la transformada discreta de Fourier. Cuando el
nmero de datos es potencia de dos o un producto de factores primos, se
usa algoritmos de transformada rpida.
N 1

F (k ) f (n) e j 2nk / N
n0

k 0, 1, , N 1

Como MATLAB no permite ndices cero, se debe desplazar el valor en uno:


N

F (k ) f (n) e j 2n ( n 1)( k 1) / N
n 1

10/03/16

k 1, 2, , N

49

Transformada inversa
1 N
f ( n)
F (k ) e j 2n ( n 1)( k 1) / N
N k 1

n 1, 2,, N

Ejemplo.- Para la funcin f(t) ilustrar el uso de la FFT, considerando el


problema de estimar la Transformada de Fourier continua.
12 e 3t t 0
f (t )
t0
0
F ( )

12
3 j

10/03/16

La solucin analtica se conoce, an as sirve para ilustrar


la estimacin por medio de la Transformada de Fourier.

50

Ejemplo.- Para la funcin f(t) ilustrar el uso de la FFT, considerando el


problema de estimar la Transformada de Fourier continua.
N=128;
% Se selecciona una potencia de 2 por velocidad
t=linspace(0,3,N);
% Valores de tiempo para evaluar
f=12*exp(-3*t);
% Valuar la funcin y minimizar enmascaramiento
Ts=t(2)-t(1);
% Periodo de muestreo
Ws=2*pi/Ts;
% frecuencia de muestreo (rad/seg)
F=fft(f);
% Clculo de la fft
Fp=F(1:N/2+1)*Ts;
% Slo valores positivos de F, multiplicados por Ts
W=Ws*(0:N/2)/N;
% Se crea frecuencia continua, hasta frec. Nyquist
Fa=12./(3+j*W);
% Se vala analticamente la T. de Fourier
plot(W,abs(Fa),W,abs(Fp),'+')
xlabel ('Frecuencia, rad/seg'),ylabel('abs(F(W))')

10/03/16

51

4.5
4
3.5

abs(F(W))

3
2.5
2
1.5
1
0.5
0

10/03/16

20

40

60
80
Frecuencia, rad/seg

100

120

140

52

2.9 Entrada / salida por puerto serial,


comunicacin con perifricos: modems,
impresoras e instrumentos cientficos

10/03/16

53

10/03/16

54

También podría gustarte