Sintaxis en Matlab - Universidad Nacional de Misiones

Anuncio
Universidad Nacional de Misiones
SINTAXIS EN MATLAB
Dr. Ing. Aldo Luis Caballero – MSc. Ing. Corina Feltan
Última versión: agosto de 2013
Se desarrollan a continuación una serie de programas para ejemplificar funciones
en Matlab, especialmente las que se utilizan con bifurcaciones y bucles.
Funciones definidas por el usuario
Se pueden crear funciones similares a las conocidas por el usuario, por ejemplo
magic(2) crea una matriz cuadrada 2x2 con valores al azar. Para esta función
tenemos un argumento de entrada 2, y valores de retorno o argumentos de salida,
cómo se muestra a continuación, si se escribe lo siguiente en la ventana de
comandos:
>> Matriz = magic(2)
Matriz =
1
3
4
2
Para crear funciones definidas por el usuario tenemos varias opciones: crear una
función con el comando function o utilizar las referencias de función, por ejemplo
si queremos que una función halle la edad ingresando como variable de entrada el
año de nacimiento –suponiendo que se tiene como referencia el año 2013–
Escribimos en la ventana de comandos
edad = @(x)(2013-x);
Luego para saber la edad de Nina por ejemplo: Nina = edad(1998) lo que devolverá
como argumento de salida la edad
Otra forma es creando un fichero llamado edad_1.m cuya primera línea es la
siguiente
function [e1,e2,e3…en] = edad_1(x1,x2,x3…xn) donde edad_1 es el nombre de la
función, EL FICHERO CREADO Y LA FUNCIÓN DEBEN TENER UGUAL
NOMBRE, las x son las variables de entrada, en nuestro caso el año de
nacimiento y la variable e de salida nos devolverá la edad pedida
function e = edad_1(x1,x2)
Juan Manuel de Rosas 325 Tel/Fax (+54 3755) 422 179 – 422 170 www.fiobera.unam.edu.ar e-mail: facing@fiobera.unam.edu.ar
CP3360 Oberá Misiones Argentina
Sintaxis en MATLAB
anio = x1;
nombre = x2;
e = 2013 - anio ;
disp(['la edad de ' nombre ' es de ' num2str(e) ' años'])
luego se escribe en la pantalla de comandos
edad_1(1998,'Nina');
Tenga en cuenta que el nombre es una cadena de caracteres y debe ir entre
comillas simples.
Luego usted se da cuenta que el programa no siempre da la respuesta correcta
especialmente si la persona a la que estamos calculando su edad todavía no
cumplió años al día de la fecha, por lo que usted se dispone a programar algo que
sirva, bueno si sirve no siempre es tan fácil de hacer, antes de pasar al programa
vamos a ver otro conceptos
Bifurcaciones
Una bifurcación es una estructura selectiva, se usa para realizar operaciones
cuando se cumple una condición, esto se consigue mediante la sentencia if
Falso
Condición
Verdadero
Sentencias
if condición
sentencias
end
Puede ser que se tengan varias opciones, por lo que se utiliza una bifurcación
múltiple, en la que pueden concatenarse la cantidad de condiciones que se desee.
MODELACIÓN EN INGENIERÍA – Año 2013 –
2
Sintaxis en MATLAB
Falso
Condición
Verdadero
Verdadero
Condición1
Sentencias 2
Sentencias 1
Sentencias 1
Falso
Verdadero
Condición 2
Falso
Sentencias 3
Sentencias 2
if condición 1
sentencias 1
elseif condición 2
sentencias 2
else
sentencias 3
end
Ahora si podemos realizar el siguiente programa para determinar la edad de la
incauta tía o abuela que nunca quiso decirnos su edad.
clc, close all
fecha.dia = input( 'ingrese el día de su nacimiento = ' );%muestra un mensaje en
la ventana de comandos para que el usuario ingrese lo que se le pide que será el
valor que recupera el programa
fecha.mes = input( 'ingrese el número del mes de su nacimiento = ' );
fecha.anio = input( 'ingrese el año de su nacimiento con cuatro dígitos = ' );
f_actual = date; % nos da la fecha actual como una cadena de caracteres
[Y,M,D] = datevec(f_actual); % trasformamos en números la fecha
if M > fecha.mes; % el mes del cumpleaños ya pasó (ya cumplió años)
e = Y - fecha.anio;
elseif M < fecha.mes % el mes del cumpleaños no pasó (todavía no cumplió años
MODELACIÓN EN INGENIERÍA – Año 2013 –
3
Sintaxis en MATLAB
e = Y - fecha.anio -1;
else M == fecha.mes; % si cumple este mes
if D >= fecha.dia % ya cumplió años, su día de cumpleaños ya pasó
e = Y - fecha.anio;
else
% todavía no paso su día de cumpleaños
e = Y - fecha.anio -1;
end
end
h = msgbox(['
''
tenés ' num2str(e) ' años '],'EDAD','help') ; %caja de diálogo
Puede verse que se utilizó para la variable fecha: fecha.dia; fecha.mes; fecha.anio
(no puede utilizarse la letra ñ en Matlab)
Esta forma de llamar a las variables crea una estructura que agrupa datos bajo el
mismo nombre en nuestro caso fecha
>> fecha
fecha =
dia: 15
mes: 12
anio: 1998
Por lo que con nuestro programa podemos ver que Nina tiene 14 años.
Sentencia switch
Realiza una función análoga a if con bifurcación múltiple. Su forma general es la
siguiente
switch expresión
case caso 1
sentencias 1
case caso 2
sentencias 2
otherwise
sentencias 3
ejemplo:
programa que identifica si el número entero ingresado es par o impar
disp(' programa que identifica si un número entero es par o impar ')
disp( ' ' ) % dejamos un espacio para realizar un interlineado
n = input(' ingrese el valor de x = ');
v = mod(n,2); % nos da el resto de la división x/2
MODELACIÓN EN INGENIERÍA – Año 2013 –
4
Sintaxis en MATLAB
switch v
case 0 % es divisible por 2 y su resto es 0
disp( ' ' )
disp(['
''
EL VALOR x = ' num2str(n) ' es PAR ']) %imprime un mensaje
si el número es par num2str(n) convierte al número n en una cadena de
caracteres
otherwise
disp( ' ' )
disp(['
end
''
EL VALOR x = ' num2str(n) ' es IMPAR ']) ;
Bucles
Son estructuras iterativas que se repiten un número determinado de veces
(sentecia for) o hasta que sea necesario (while)
Sentencia for
En esta sentencia las operaciones se repiten un número fijo de veces que viene
determinado por la longitud del vector i
for i = 1:n
setencias
end
Sentencia while
Las sentencias se siguen ejecutando mientras haya algún elemento verdadero, el
bucle se termina cuando todos los elementos de condición sean falsos
Sentencia break
Hace que termine la ejecución de un bucle más interno de los que comprenden a
dicha sentencia
Ahora con lo aprendido podemos mejorar nuestro fichero edad_1.m
function e = edad_1(d,m,a,n)
f_actual = date; % nos da la fecha actual como una cadena de caracteres
[Y,M,D] = datevec(f_actual);
if M > m;
e = Y - a;
elseif M < m
e = Y - a -1;
MODELACIÓN EN INGENIERÍA – Año 2013 –
5
Sintaxis en MATLAB
else M == m;
if D >= d
e = Y - a;
else
e = Y - a -1;
end
end
h = msgbox([n ' tiene ' num2str(e) ' años '],'EDAD','help') ;
y escribimos en la ventana de comandos
edad_1(2,12,1995,'Lucy'); que nos devuelve el siguiente cuadro de diálogo
Ejemplo
% programa que pide al el usuario que ingrese un número y lo compara con un
% numero al azar generado por la computadora y el usuario debe ingresar
% tantas veces el número hasta que lo adivine
clc
num = input(' ingresa un número del 0 al 10 = '); disp(' ')
n_azar = rand *10;
n_ent = fix(n_azar);
if num == n_ent
disp( 'acertaste!!')
break % el programa se interrumpe porque el usuario acertó en número
else
disp ('no acertaste sos un perdedor :( ')
disp(' ')
disp( ['el número era ' num2str(n_ent)]),disp(' ')
while num ~= n_ent % se ejecutaran las sentencias hasta que acierte el número
num = input(' ingresa un número del 0 al 10 = '); disp(' ')
n_azar = rand *10;
n_ent = fix(n_azar);
MODELACIÓN EN INGENIERÍA – Año 2013 –
6
Sintaxis en MATLAB
if num == n_ent
disp( 'acertaste!!')
break
else
disp ('no acertaste sos un perdedor :( ')
disp(' ')
disp( ['el número era ' num2str(n_ent)]), disp(' ')
end
end
end
El siguiente programa es una variante del anterior que pregunta cuántas
oportunidades quiere para adivinar y se ejecuta el programa tantas veces cómo el
usuario desee o adivine el número, lo que ocurra primero.
disp('adivine el número' )
disp(' ')
oport = input('cuántas oportunidades quiere? = ' );disp(' ')
for i = 1:oport
num = input(' ingresa un número del 0 al 10 = '); disp(' ')
n_azar = rand *10; % genera números al azar
n_ent = fix(n_azar); % toma sólo el valor entero de los números generados al azar
if num == n_ent
disp( 'acertaste!!')
break
else
disp ('no acertaste sos un perdedor :( ')
disp(' ')
end
Regresión
En clase se vieron varios ejemplos de programación del método de los mínimos
cuadrados. Matlab tiene varias funciones programadas para ajustes de curvas, la
función:
P = ployfit(x,y,n) realiza un ajuste polinómico de grado n a los puntos dados (x,y)
dando cómo salida los coeficientes del polinomio en potencias descendentes
ܲሺ‫ݔ‬ሻ = ‫݌‬ଵ ∙ ‫ ݔ‬௡ + ‫݌‬ଶ ∙ ‫ ݔ‬௡ିଵ + ⋯ + ‫݌‬௡ ∙ ‫ ݔ‬+ ‫݌‬௡ିଵ
MODELACIÓN EN INGENIERÍA – Año 2013 –
7
Sintaxis en MATLAB
cftool (Curve Fitting Tool) abre una ventana que nos permite encontrar el ajuste de
curva deseado.
Otra opción que tiene Matlab es realizar un ajuste de curva mediante la opción
lsqcurvefit cuya sintaxis es la siguiente:
x = lsqcurvefit(curva,xo,xdatos,ydatos)
donde:
curva = es la función a ajustar y a la que vamos a encontrar los coeficientes y la
creamos como una referencia de función o una función definida por el usuario
por ejemplo si queremos ajustar los siguientes datos:
t= [0 1 2.01 3.01 4 5 6 7.01 8.01 9];
tita= [150 -131.1 114.6 -100.3 87.7 -76.6 67 -58.6 51.2 -44.8];
a la función : ‫ ∙ ܣ‬cosሺ߱ ∙ ‫ݐ‬ሻ ∙ ݁ ି௕௧
A = tita(1);
Ti= @(a,tp)A*cos(a(1).*tp).*exp(-a(2)*tp); % función a ajustar
w= 3; b= 0;xo= [w b]; % condiciones iniciales
ab= lsqcurvefit(Ti,xo,t,tita);
w= ab(1) ; b=ab(2);
T= t(1):.01:t(length(t));
Tita= A*cos(w*T).*exp(-b*T);
plot(t,tita,'*r',T,Tita,'b'), grid on
xlabel('t')
ylabel('tita')
dando como resultado el ajuste de la curva mostrado con la línea azul y
los puntos rojos son los datos.
MODELACIÓN EN INGENIERÍA – Año 2013 –
8
Sintaxis en MATLAB
Solución numérica de ecuaciones: Método de la bisección
a = 0; b = 1; x = a:0.01:b; fx = exp(-x) - x ;
fx = exp(-x) - x; %función que queremos encontrar una raíz
plot(x,fx), grid on
ead=0.01; E=1; x = (a+b)/2; k = 1;
while E>ead
fx = exp(-x)-x;
fa = exp(-a)-a; %función evaluada en a
fb = exp(-b)-b; % función evaluada en b
if fx*fa < 0 ;
b = x;
fb = fx;
else
MODELACIÓN EN INGENIERÍA – Año 2013 –
9
Sintaxis en MATLAB
fx*fb < 0;
a = x;
fa = fx;
end
E = abs((fb-fa)/2);
xi(k) = x ; fxi = exp(-xi(k))-xi(k); k = k + 1; % se arma un vector
para graficar las sucesivas raíces
x = (a+b)/2
end
raiz = x
hold on, plot(xi,fxi,'r.'), grid on
MODELACIÓN EN INGENIERÍA – Año 2013 –
10
Descargar