Está en la página 1de 55

Seguridad F u n c i en o Internet nes Oriol Roca

MatLab

PROGRAMACION EN MATLAB

FUNCIONES EN MATLAB

FUNCIONES Son ficheros con una estructura especial, que definen funciones anlogas a las de MATLAB. Con carcter general, una funcin recibe unos DATOS DE ENTRADA, ejecuta unas RDENES y produce unos DATOS DE SALIDA.

Funciones

MatLab

Fu unn in oen F cc io se

M aM t La at bL

ab

Funciones

MatLab

Tipos de Funciones Funciones predefinidas en MATLAB. Funciones definidas por el usuario (crea sus propias funciones).

FUNCIONES PREDEFINIDAS EN MATLAB

FUNCIN INPUT

La funcin input permite imprimir un mensaje en la lnea de comandos de MATLAB y recuperar como valor de retorno un valor numrico o el resultado de una expresin tecleada por el usuario. >> n = input('Teclee el nmero de ecuaciones') Otra posible forma de esta funcin es la siguiente (obsrvese el parmetro 's'): >> nombre = input ('Cmo te llamas?','s') En este caso el texto tecleado como respuesta se lee y se devuelve sin evaluar, con lo que se almacena en la cadena nombre. As pues, en este caso, si se teclea una frmula, se almacena como texto sin evaluarse.

FUNCIN DISP

La funcin disp permite imprimir en pantalla un mensaje de texto o el valor de una matriz, pero sin imprimir su nombre. En realidad, disp siempre imprime vectores y/o matrices: las cadenas de caracteres son un caso particular de vectores. >> disp('El programa ha terminado') >> A = rand (4,4) >> disp (A)

FUNCIN FPRINTF ( SALIDA CON FORMATO)


La funcin fprintf dirige su salida formateada hacia el fichero indicado por el identificador fi. Si ese indicador de archivo se omite, la salida por defecto es la pantalla del PC. Su forma general es: fprintf(fi,'cadena de control',var1,var2,...)

La cadena de control contiene los formatos de escritura, que son similares a los de C, como muestran los ejemplos siguientes: fprintf('El nmero de ecuaciones es: %d \n',n) fprintf('El determinante es: %f \n',n)

donde: %s para cadenas de caracteres %d para variables enteras %f para variables de punto flotante %lf para variables de doble precisin

FUNCIONES DEFINIDAS POR EL USUARIO

Funciones definidas por el usuario.

PALABRA RESERVADA

PARMETROS DE SALIDA

NOMBRE DE LA FUNCIN

PARMETROS DE SALIDA

Funciones definidas por el usuario. Llamada a una funcin Podemos llamar a una funcin desde la lnea de comandos, como si fuera cualquier otra orden o funcin ya definida en MATLAB.

Observar que los parmetros de entrada y salida no tienen por qu tener el mismo nombre que en la definicin de la funcin.

Funciones definidas por el usuario.


Si la funcin tiene ms de un parmetro de entrada, estos se separan por comas y si tiene ms de un parmetro de salida se escribe la lista separada por comas y entre corchetes ([ ]). Este sera un ejemplo general:

Analizaremos otra funcin sencilla que tiene un argumento de entrada x y un argumento de salida y. Lo nico que se hace es calcular una expresin matemtica sencilla y asignar ese valor a y. El nombre de esta funcin que sea ud1_f1.m
% ud1_f1.m % Una funcin sencilla % un argumento function y=ud1_f1(x) y=x2-log(x);

El nombre de la funcin, para evitar confusiones, debe coincidir con el nombre del archivo .m donde esta funcin se encuentra. Por tanto, como en este ejemplo es la funcin ud1_f1, debemos guardarla en el archivo ud1_f1.m. La primera lnea comienza con la palabra reservada function, lo cual es comn a todas las funciones que veremos en el curso.

Lo mas interesante es entender como se pasan los argumentos desde la lnea de comandos hasta las funciones. Cuando invocamos esta funcin desde la lnea de comandos podemos hacerlo del siguiente modo, obteniendo la siguiente respuesta: >> ud1_f1(5) ans = 23.3906 Cuando se pulsa Enter, se carga en memoria RAM la funcin ud1_f1.m, y se crea espacio en memoria para la variable x. En ese espacio se coloca el valor 5. Se crea espacio tambin para y. Las variables x e y se llaman variables locales de la funcin; el adjetivo locales procede de que viven en el espacio de memoria de la funcin. Una vez hecho esto, el ordenador ejecuta las sentencias de la funcin (en este caso una sola) de arriba abajo. Durante esta ejecucin se define la variable de salida y, en la cual al final de la misma esta el resultado, 23.3906. Una vez terminada la ejecucin se devuelve el control a la lnea de comandos, se asigna en este caso el resultado a la variable por defecto ans y se borra de la memoria RAM la funcin ud1_f1.

Podemos invocar a la funcion ud1_f1.m ahora del siguiente modo:


>> t=5; >> z=ud1_f1(t) z= 23.3906

En ese caso, tendremos 4 variables x, y, z y t. Las variables x e y son locales de la funcin y las variables z y t viven en el espacio de memoria asignado a la ventana de comandos. Cuando se llama a la funcin, x copia el valor de t y cuando se termina la ejecucin de la funcin es z la que copia el valor de la calculada y antes de que esta desaparezca

De hecho, si cambiamos el valor de la x en el cdigo de la funcin, la variable t (anterior) y la variable x del espacio de memoria de la ventana de comandos no se ven afectadas. O sea que si cambiamos la funcin ud1_f1.m y la grabamos ahora como:

function y=ud1_f1(x) x=2; y=x2-log(x);

Si la invocamos desde la lnea de comandos del siguiente modo,


>> x=5; >> y=ud1_f1(x) y= 3.3069 >> x x= 5

el resultado no ser correcto, pero x tampoco habr cambiado valor. Ello es as porque la variable local x vive en la funcin. principio de la misma, copia el valor de la variable x del espacio comandos, y aunque cambiemos la variable local en la funcin, variable en el espacio de comandos no se ve afectada; estn mundos diferentes que solo se comunican a travs de la lnea argumentos.

su Al de la en de

Funciones con varios argumentos de entrada

Calcular el rea de un rectngulo. Si necesitamos mas argumentos de entrada, simplemente los colocamos uno tras otro separados por comas dentro de los parntesis a la derecha del nombre de la funcin.
% ud1_farea % primera funcin con ms de un argumento. % rea del rectngulo de lados a y b function area=ud1_farea(a,b) area=a*b;

>> ud1_farea(2,3) ans = 6 >> x=3; >> y=5; >> ud1_farea(x,y) ans = 15 >> ud1_farea(x,4) ans = 12

En la primera, pasamos directamente dos nmeros, los cuales son copiados por las variables locales a y b. En la segunda posibilidad pasamos dos variables correspondientes al espacio de memoria de la ventana de comandos, x e y, las cuales son copiadas igualmente por las variables locales de la rutina, a y b, a travs de la lista de argumentos. Finalmente en la tercera, tenemos una combinacin de las dos posibilidades anteriores

En el siguiente ejemplo los argumentos no conmutan entre si. Se trata de calcular el rea de un polgono regular sabiendo el numero de lados y el lado. En el calculo de la apotema los dos argumentos no conmutan entre si.

% ud1_fareapol.m % rea de un polgono regular de n lados % primeras variables propias de la rutina, P, a, % las variables no conmutan pues juegan distinto papel function area=ud1_fareapol(l, n) P=n*l; % permetro a=l/(2*tan(pi/n)); area=P*a/2;

Es la primera funcin en la que usamos variables locales de la funcin. Si invocamos esta funcin desde la ventana de comandos, y preguntamos despus lo que valen esas variables locales, las cuales no pertenecen al espacio de memoria de la ventana de comandos tendremos el siguiente resultado:
>> ud1_fareapol(3, 4) ans = 9.0000 >> ud1_fareapol(4,3) ans = 6.9282 >> P ??? Undefined function or variable P. >> a ??? Undefined function or variable a.

Ejercicio:

Consideramos la funcin
function d=ud1_fprueba(a,b,c) b=c; a=b; d=a+b+c;

Sin ejecutar la funcin, que valor devolver si invocamos desde MATLAB ud1 fprueba(1; 2; 3)? Conmutan entre si los argumentos de entrada?

Sentencias de control selectivas

if else

if elseif else

Ejemplos de la Sentencia IF
if x==0 disp('x es igual a cero') elseif x > 0 disp('x es mayor que cero') else disp('x es menor que cero') end

% ud1_fmayorab % Devuelve el mayor de dos nmeros a,b % a,b son diferentes function mayor=ud1_fmayorab(a,b) if a>b % ud1_fmayorab0 mayor=a; % Devuelve el mayor de dos nmeros a,b end % a, b son diferentes if b>a function mayor=ud1_fmayorab1(a,b) mayor=b; mayor=a; end if b>mayor mayor=b; end

% ud1_felseab % primer uso de la estructura if-else % Devuelve el mayor de dos nmeros a,b % a,b se supondrn diferentes function mayor=ud1_felseab(a,b) if a>b mayor=a; else mayor=b; end

Funcin que llama a otra funcin

% ud1_2 % primera funcin que llama a otra funcin % ud1_2(x). Devuelve el valor de la funcin: % f(x)=x si x<1 % f(x)=x2-ln(x) si x>=1 function y=ud1_2(x)
if x<1 y=x+1; else y=ud1_f1(x); end

Condicionales anidados.
% ud1_fsigno % funcin que devuelve el signo de un numero entero n % -1 si es negativo, 0 si es 0, 1 si es positivo. % primeros condicionales anidados. function signo=ud1_fsigno(n) if n<0 signo=-1; else % ud1_fnotas if n==0 % primera vez q usamos el elseif signo=0; function clave=ud1_fnotas(nota) else if nota<5 signo=1; clave=0; end end elseif nota<7

clave=1; elseif nota<9 clave=2; else clave=3; end

Operadores lgicos

Si queremos construir condiciones algo mas interesantes, necesitaremos combinar condiciones elementales mediante los operadores lgicos habituales Para el Y lgico se usa el smbolo reservado &. Otro operador interesante es el O lgico (inclusivo). Para este se usa el smbolo |, que se obtiene pulsando la tecla Alt Gr y la del 1.
%% operadores lgicos. function mayor=ud1_fmayor(a,b,c) if a>b & a>c mayor=a; end if b>a & b>c mayor=b; end if c>a & c>b mayor=c; end

Ejercicio:
Que devuelve la siguiente funcin? function y=ud1_prueba2(a,b,c) y=a+b+c; if a>b | c>b y=y-b; if a>c y=y-c; else y=y-a; end else y=b; end

Variables contador y sumador


%% ud1_fsumapos %% primera variable sumadora (x=x+algo) %% suma de los positivos entre 4 numeros. function suma=ud1_fsumapos(a,b,c,d) suma = 0; if a>0 suma=suma+a; end if b>0 suma=suma+b; end if c>0 suma=suma+c; end if d>0 suma=suma+d; end

switch case

%identifica un numero entre 0 y 3 n=input('ingrese un numero entero entre 0 y 3:'); switch n case 0, disp('El numero ingresado es el cero'); case 1, disp('El numero ingresado es el uno'); case 2, disp('El numero ingresado es el dos'); case 3, disp('El numero ingresado es el tres'); otherwise, disp('No conozco el numero'); end

Sentencias de control iterativas

Bucles o ciclos

En muchos problemas de matemticas se requiere repetir o iterar un mismo procedimiento. Es por ello que todos los lenguajes de programacin contienen la posibilidad de crear bucles. Un bucle en programacin es una sentencia que se realiza repetidas veces. Un bucle se utiliza para hacer un accin repetida sin tener que repetir varias veces el mismo cdigo, lo que ahorra tiempo, deja el cdigo mas claro y facilita su modificacin en el futuro.

while

for

El primer ejemplo ilustra uno de los usos mas tpicos de los bucles que sin lugar a dudas es la suma de un conjunto de elementos. El conjunto de elementos que se quieren sumar en este caso son los naturales de 1 a n. El ndice i se inicializa por tanto a 1 y n es un argumento de la funcin. La condicin de corte del proceso iterativo que requiere la estructura WHILE se ejecutara cuando el ndice i sea mayor que n, en cualquier otro caso i se ira incrementando en una unidad y la variable suma se vera incrementada en el valor del propio ndice i. De esta forma cuando el bucle se interrumpa la variable suma contendr el valor resultante de la suma de los n primeros nmeros naturales. %ud2_fsuma
% Suma de todos los naturales entre 1 y n % primer bucle function suma=ud2_fsuma(n) suma=0; % ud2_fsumapares i=1; % Suma todos los nmeros pares entre 1 y n while i<=n function suma=ud2_fsumapares(n) suma=suma+i; suma=0; i=i+1; i=2; end while i<=n suma=suma+i; i=i+2; end

Ejercicio
Que devuelve la siguiente funcin? function y=ud2_fprueba(m,n,k) y=1; i=m; while i<=n y=y*i i=i+k; end

Bucles y condicionales

A continuacin se nos plantea la necesidad de contar los divisores de un numero natural n. Para ello hay que combinar un bucle con un condicional, es decir hay que recorrer todos los potenciales candidatos a divisor que van desde 1 a n y entre ellos ver los que realmente son divisores de n. En caso de que verifiquen la condicin la variable de conteo de divisores se incrementa en una unidad y en el caso opuesto no se altera

% ud2_fcuentadiv % ud2_fcuentadiv(n) cuenta los divisores de n % primer uso de mod function num=ud2_fcuentadiv(n) num=0; i=1; while i<=n if mod(n,i)==0 num=num+1; end i=i+1; end

Ejercicio:
La siguiente funcin que recibe un numero n y deber devolver el numero de valores entre 1 y n para los que sin es mayor que 1/2 menos para los que es menor que -1/2. Corrige los errores que tiene. function c=ud2_fprueba2(n) i=1; while i<=n if sin(i)>1/2 c=c+1; else c=c-1; end i=1+1; end

Bucles anidados

En el ejemplo vamos a contar la cantidad de nmeros primos que hay menores o iguales que el argumento de entrada n sin contar con el 1, esto lo llevaremos a cabo mediante el ndice i. Para ello planteamos un primer bucle donde i vaya desde 2 hasta n, y en cada uno de los casos realizamos un bucle interno sobre los posibles divisores de i que vienen representados por el ndice j. porque se limita el crecimiento del ndice j hasta que sea menor o igual que la raz cuadrada de i?.

% ud2_fnprimos.m % ud2_fnprimos(n) devuelve el numero de primos % menores o iguales que n. No contamos el 1 como primo. % primer doble bucle (bucles anidados) function p=ud2_fnprimos(n) i=2; p=0; while i<=n j=2; primo=1; while j<=sqrt(i) if mod(i,j)==0 primo=0; %i no es primo break; end j=j+1; end if primo==1 p=p+1; end i=i+1; end

Sentencias especiales

Ejemplo de Sentencia BREAK


while r=input('Ingrese el radio o cero para terminar '); if r <= 0; break; end; sup=pi*r^2; fprintf('Superficie = %.2f\n',sup) end

SENTENCIAS TRY...CATCH...END La construccin try...catch...end permite gestionar los errores que se pueden producir en tiempo de ejecucin. Su forma es la siguiente:

try sentencias1 catch sentencias2 end

En el caso de que durante la ejecucin del bloque sentencias1 se produzca un error, el control de la ejecucin se transfiere al bloque sentencias2. Si la ejecucin transcurriera normalmente, sentencias2 no se ejecutara nunca. MATLAB dispone de una funcin lasterr que devuelve una cadena de caracteres con el mensaje correspondiente al ltimo error que se ha producido. En la forma lasterr('') pone a cero este contador de errores, y hace que la funcin lasterr devuelva la matriz vaca [] hasta que se produzca un nuevo error.

También podría gustarte