Guía 2 - Laboratorio de Matemáticas Aplicadas

Anuncio
UNIVERSIDAD DE LOS ANDES
FACULTAD DE MATEMATICAS
CURSO DE ANALISIS NUMERICO
TALLER GUIA SOBRE MANEJO DE PROGRAMACION BASICA EN MATLAB1
Temas a tratar:
Definición de funciones en MATLAB
Aspectos básicos de programación: if, for, while, switch.
Recordemos las ventanas básicas de MATLAB:
WorkSpace
Ventana de Edición
Command Window
Donde, los comandos o las operaciones sin importancia se efectúan en el Command
Window; las variables definidas en el WorkSpace y en el Editor se escribirán el código
de programación. AUN CUANDO SE PUEDEN EFECTUAR COMANDOS DE
PROGRAMACION DENTRO DEL COMMAND WINDOW, NUNCA SE DEBE
1
David Méndez Suárez.
Estudiante Ing. Industrial
Uniandes
[email protected]
UTILIZAR DICHA OPCION YA QUE DEBERAN EFECTUAR TODOS LOS
COMANDOS CADA VEZ QUE QUIERAN EJECUTAR SU FUNCION2.
El primer paso para Definir una función es introducir su nombre, la variable de salida (o
el conjunto de variables) así como los imput que utilizara la función; esto se desarrolla
de la siguiente manera:
Function a = furier (x,y)
a será el output de la función, furier será el nombre (este se utilizara desde el
command window para ejecutarla) “x” y “y” serán los imput de la función.
NOTA: Tenga presente que no se especifica la naturaleza de ninguna de las variables
(es decir, no se dice si es una matriz o un vector o un real o una función).
Una vez se escribe el encabezado el usuario podrá trabajar libremente recurriendo a
todas las librerías y funciones predeterminadas que MATLAB posee3. No es necesario
utilizar algún tipo de comando o código para mostrar la finalización de una función.
Simplemente hay que ser cuidadosos de poner los datos finales dentro de las
variables que se definieron como output.
Hagamos una serie de ejemplos:
Construyamos una función coseno _ grafica. Que tome un vector con datos, calcule el
coseno para cada uno de ellos y grafique la función.
El algoritmo en MATLAB seria:
function resultado= coseno_grafica (x)
resultado=cos(x);
hold on;
title('Grafica de Coseno');
plot(x,resultado,'r');
Para guardarlo, por default MATLAB propone el mismo nombre con que se definió la
función (coseno _ grafica) no lo cambien ya que en algunas oportunidades el
programa molesta cuando se ejecutan las funciones.
De igual manera, si es la primera vez que utilizaran una carpeta especifica (por
ejemplo, su memoria de USB) es necesario agregar a la misma un directorio que
matlab reconocerá para encontrar un conjunto de funciones (se llama Sethpat) este es
un procedimiento muy sencillo:
1) Ingresen a File, busquen la opción Seth Path… , esta les abrira la siguiente
ventana:
2
Si por alguna razón ninguna de las ventanas les aparece a ustedes una vez inician MATLAB, pueden
buscarla ingresando a DESKTOP y la opción DESKTOP LAYOUT.
3
Para una lista completa ingresé a HELP. En la opción MATLAB aparecerá una lista completa por orden
alfabético así como por categoría. Dentro del curso ustedes podrán utilizarlas al menos que se indique lo
contrario ya que en algunas oportunidades se les pedirá la creación de funciones que ya existen, tales
como sacar los valores propios o la inversa de una matriz.
Hagan clic en Add fólder y posteriormente Save4.
Una vez guardada la función y asegurada la existencia del Path, podemos ejecutar
nuestra función desde el command window:
>> x=-2*pi: pi/6:2*pi;
>> Coseno _ grafica (x);
Primero definimos el vector imput (desde  2 hasta 2 ) para posteriormente
ejecutar la función.
Para definir mas de una salida dentro de una función en MATLAB, se define un
conjunto de variables de salida, utilizando los paréntesis cuadrados:
function [q,w,e]=nombre(a,b,c)
Ahora modifiquemos nuestra función para graficar coseno y tangente, de igual manera,
la función nos tiene que dar dos vectores con la información. Nuestros imput serán: el
vector de valores en x, así como el color que queremos las graficas:
function [seno,coseno]= coseno_grafica (x,color_seno,color_coseno)
seno=sin(x);
coseno=cos(x);
hold on;
title('Grafica de Coseno');
plot(x,seno,color_seno);
plot(x,coseno,color_coseno);
Note que MATLAB es bastante versátil en el manejo de la información, ya que en este
caso, x es un vector, mientras que “seno _ color” y “coseno _ color” son unos valores
char.
Ahora ejecutemos nuestra nueva función:
>> x=-2*pi:pi/6:2*pi;
>> [a,b]=coseno _ grafica (x,'r','b');
Los resultados son a, b y la grafica de seno y coseno:
4
Recuerden, si en la carpeta que vana utilizar para guardar la función ya aparece el archivo setpath no es
necesario realizar este procedimiento.
Grafica de Coseno
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-8
-6
-4
-2
0
2
4
6
8
Sin embargo gran parte del potencial de las funciones radica en su manejo de
funciones lógicas.
ALGUNAS OPERACIONES LOGICAS NECESARIAS.
Operaciones Numericas:
< Menor que
<= Menor o igual que
> Mayor que
>= Mayor o igual que
== Igual que
~= Diferente que
Operaciones Logicas:
&& and
|| or
~ no.
PROCEDIMIENTOS IF
Sirven para ejecutar un conjunto de tareas cuando se cumple una función específica.
Normalmente esta relacionado con la comparación de alguna variable con un valor
específico, así como de los resultados de una operación requerida. Algunos ejemplos
de encabezados:
If a==2
If (a==s) && (w==1)
De igual manera se pueden realizar operaciones, e incluso utilizar funciones.
If det(A)==0 %Si el determinante de la función A es igual a cero%
If det(A)==0 && eig(A)==0
Una vez escritos los comandos que se utilizaran en el if, este se finaliza con la palabra
end, de tal manera que el depurador reconozca donde inicia y donde finaliza dicha
subrutina, por ejemplo:
If a~=0
c=b/a;
end
Al igual que lenguajes de programación como C++, MATLAB también permite anidar if,
lo único necesario es tener presente que cada anidacion necesitara un end para
finalizarlo.
If a~=0
c=b/a;
else if a<0
c=b;
end
PROCEDIMIENTO FOR
El procedimiento for suele utilizarse para hacer un recorrido sobre un arreglo (vector o
una matriz.
for i=1:10
Note que for toma una variable (que bien puede no estar definida) para generar un
intervalo donde realizar las tareas posteriores al for; de igual manera dentro de los
parámetros pueden encontrarse funciones o procedimientos que definan el intervalo
donde se trabajara:
for i=1:length(A)
for i=min(A):max(A)
Ejemplo:
Desarrollemos una función que calcule la media y la varianza de un conjunto de
datos:
function [media,varianza] =estadistica(x)
media=0;
varianza=0;
n=length(x);
%Primero se calculara la media
for i=1:n
media=media+x(i)/n;
end
%Ahora se calculara la varianza
for i=1:n
varianza=varianza+((x(i)-media)^2)/(n-1);
end
Tomemos la siguiente lista de valores:
-0.300232159
-1.277683168
0.244257308
1.27647354
1.198350219
1.733133104
-2.18358764
-0.234181243
1.095022526
-1.086700649
-0.69020416
-1.690432327
Luego, los resultados fueron:
>> [media,varianza] =estadística(s)
Media =
-0.1596
Varianza =
1.6439
De igual manera también se pueden presentar un anidado de ciclos for, por ejemplo
aquel relacionado con la consecución de la suma de los elementos de aquellos
vectores columna que se encuentran en una matriz.
function a=suma_vectores(Q)
tamano=size(Q)
a=zeros(tamano(2),1);
for i=1:tamano(1)
for j=1:tamano(2)
a(j)=a(j)+Q(i,j);
end
end
De la matriz:
0.17029328 0.61015656 0.35029145 0.0753502
0.1900998 0.0966216 0.76299326 0.69154942
0.36649678 0.72884304 0.6732078 0.66734825
0.93914609 0.65352336 0.54356517 0.40617084
Los resultados fueron los siguientes:
>> a=suma_vectores (Q)
a=
1.6660
2.0891
2.3301
1.8404
Por ultimo, introduzcamos una última función que recopile lo que hallamos visto:
Suponga que tenemos una lista con los resultados de una prueba de esferzo
realizadas con 2 tipos diferentes de acero, 10-20 y 10-40. El experimento consistió en
tomar 5 varillas de cada uno de los tipos de acero, elaborar 4 probetas y desarrollar la
respectiva prueba. Para guardar la información, se construyo una matriz, donde cada
una de sus filas corresponde a las pruebas realizadas sobre una varilla especifica.
Para saber a que tipo de acero corresponde la información, se construyo un vector
donde sus posiciones muestran dicha información. Para el acero 10-20 se codifico con
la opción 1 mientras que el 10-40 la opción 2, luego si la i-esima componente del
vector tiene el número 1, quiere decir que la i-esima columna de la matriz posee la
información correspondiente a un acero 10-20.
Construya una funciona en MATLAB que reciba una matriz, su correspondiente vector
guía y el tipo de acero para que este extraiga los resultados relacionados en una
matriz que contenga el resultado de todos los experimentos.
function W=acero(Q,v,tipo)
W=[]
a=zeros(1,4)
tamano=size(Q)
for i=1:length(v)
if v(i)==tipo
for j=1:tamano(2)
a(j)=Q(i,j)
end
W=cat(1,W,a);
end
end
Tomemos la siguiente matriz:
0,38200018
0,88460952
0,86324656
0,03238014
0,28504288
0,37183752
0,42616047
0,99124119
0,70503861
0,30021058
0,10068056
0,95846431
0,13858455
0,16412854
0,34308908
0,35560167
0,30390332
0,25626392
0,81652272
0,750206
0,59648427
0,01449629
0,24503311
0,21961119
0,55363628
0,9103061
0,97570727
0,9516892
0,97250282
0,35148167
Con su vector indicador:
1
2
2
2
1
1
2
1
0,89910581
0,4074221
0,04547258
0,01709037
0,35737175
0,46601764
0,80666524
0,05343791
0,46632282
0,77565844
1
2
Luego, al implementar la función “acero” los resultados fueron:
>> W=acero(Q,V,2)
W=
0.8846
0.8632
0.0324
0.4262
0.3002
0.9585
0.1386
0.1641
0.3039
0.7502
0.0145
0.2450
0.2196
0.9757
0.3515
0.4074
0.0455
0.0171
0.8067
0.7757
0.5965
0.5536
0.9103
0.9517
0.9725
0.8991
0.3574
0.4660
0.0534
0.4663
>> W=acero(Q,V,1)
W=
0.3820
0.2850
0.3718
0.9912
0.7050
0.1007
0.3431
0.3556
0.2563
0.8165
Note algo interesante:
>> cat(1,acero(Q,V,1),acero(Q,V,2))
ans =
0.3820
0.2850
0.3718
0.9912
0.7050
0.8846
0.8632
0.0324
0.4262
0.3002
0.1007
0.3431
0.3556
0.2563
0.8165
0.9585
0.1386
0.1641
0.3039
0.7502
0.5965
0.5536
0.9103
0.9517
0.9725
0.0145
0.2450
0.2196
0.9757
0.3515
0.8991
0.3574
0.4660
0.0534
0.4663
0.4074
0.0455
0.0171
0.8067
0.7757
La tarea cat(1,acero(Q,V,1),acero(Q,V,2)) organiza los experimentos, poniendo en las
cinco primeras filas los aceros 10-20 y en las ultimas cinco los 10-40.
PROCEDIMIENTO WHILE
El procedimiento While sirve como un indicador para controlar la ejecución de cierta
rutina basada una condición especifica. Por ejemplo, dentro de nuestro curso será muy
útil para mantener cierto procedimiento funcionando mientras que nuestro error sea
menor a un número específico.
while a>b
while a/b==2
while mod(x,2)==0
RECURSIONES
SERIES DE FIBONACCI:
function a=fibo(n)
if n==0
a=0;
else if n==1
a=1;
else
a=fibo(n-1)+fibo(n-2);
end
end
DETERMINANTE DE UNA MATRIZ:
function d=determinante(A)
d=0;
tam=size(A);
if tam(1)~=tam(2)
d='no se puede invertir la matriz';
else if tam(1)==1
d=A;
else for i=1:tam(1)
B=A
B(i,:)=[]
B(:,1)=[]
d=d+((-1)^(i+1))*A(i,1)*determinante(B)
end
end
end
FUNCIÓN DE JOSÉ LUIS
function Vec=puntosiete(MatA)
%el alg. tendra como precondicion la mat. de pares de datos
%y devolvera un vector con la pendiente y el corte de la recta que
%optimiza el error cuadratico
[n,m]=size(MatA);
uno=zeros(1,n);
Vec=0
if (m==2) %evita procesar matrices del tamaño incorrecto
X=MatA(:,1);
Y=MatA(:,2);
for k= 1:n
uno(k)=1;
end
A=dot(X,uno);% sumatoria de Xi
B=dot(Y,uno);% sumatoria de Yi
C=dot(X,X);% sumatoria de Xi*Xi
D=dot(Y,X);% sumatoria de Yi*Yi
M1=[n A; A C];
Vb=[B; D];
Vec=inv(M1)*Vb
corte=Vec(1)
pendiente=Vec(2)
end
Descargar