Procedimientos en MAPLE Prof. Carlos Conde LázaroL Prof. Arturo Hidalgo LópezL Prof. Alfredo LópezL Marzo, 2007 0
Plan de de exposición 1º. Qué es un Procedimiento en MAPLE? 2º. Cómo se ESCRIBE un Procedimiento en MAPLE? 3º. Cómo se GUARDA un Procedimiento en MAPLE? 4º. Cómo se UTILIZA un Procedimiento en MAPLE? 5º. Algunas normas sobre procedimientos que debes conocer 6º. Un ejemplo. 1
1. 1. Qué es es un un Procedimiento en en MAPLE? Un PROCEDIMIENTO es un subprograma que calcula el valor de una o varias variables de salida en función de los valores que se asignarán (cuando se llame al procedimiento) a una o varias variables de entrada. Se llaman ARGUMENTOS del procedimiento al conjunto de las variables, ya sean de entrada o salida, que se utilizan en el procedimiento. 2
2. 2. Cómo se se escribe un un Procedimiento en en MAPLE? (1/2) Nombre_procedimiento:= proc ( argumentos ) Sentencias de MAPLE (asignaciones, bloques IF, bucles,... ) end proc; (end proc puede remplazarse por end;) El resultado de la última operación que se realice, también es un argumento de salida (sale en Nombre_procedimiento ). 3
2. 2. Cómo se se escribe un un Procedimiento en en MAPLE? (2/2) Ejemplo: 3 5 7 9 x x x x sen( x) = x + +... 3! 5! 7! 9! 2 1 2 1 2 1 2 1 x 1 x x x x 3! 5! 7! 9! > seno9:=proc(x) x*(1.-x^2*(1/6.-x^2*(1/120.-x^2*(1/5040.-x^2*(1/362880))))) end proc; 4
3. 3. Cómo se se guarda un un Procedimiento? Un procedimiento debe guardarse, para poder ser llamado posteriormente, en un fichero con extensión.m > save Nombre_procedimiento, Dirección y nombre del fichero.m Recomendación: Asignar al nombre del fichero el mismo nombre del procedimiento. Y elegir nombres que faciliten la identificación del proceso programado. Ejemplo: Nombre procedimiento Directorio Nombre fichero > save seno9,"c:/profes/pmn/c02_03/seno9.m"; > save seno9,"a:/seno9.m"; 5
4. 4. Cómo se se usa un un Procedimiento? (1/2) Cuando desde un programa se desea usar un procedimiento almacenado en un fichero.m : 1º) Se lee el fichero > read Dirección y nombre del fichero.m Ej: > read "C:/Profes/PMN/C02_03/seno9.m"; 2º) (opcional)se dan valores a los argumentos de entrada Ej: > x:=0.27 3º) Se ejecuta el procedimiento Dan valor a las variables de entrada > resultado:= Nombre_procedimiento (expresiones + variables) Nombres de variables de salida 6
4. 4. Cómo se se usa un un Procedimiento? (2/2) Ejemplo: [> restart; [> read "A:/seno9.m"; [> alpha:=evalf(pi/2.37); α:= 1.325566521 [> v:=seno9(0.5*alpha-1.); v:= -.3308618720 7
5. 5. Algunas normas sobre procedimientos (1/8) (1/8) 1ª) Las variables de salida de un procedimiento pueden tener nombre diferente al ser usadas como parámetros del procedimiento y al ser utilizado el mismo. Ejemplo: [> int_simpson:= proc(a, b, f, vint)... end proc: [> int_simpson(linf, lsup,g,result): Pero cada parámetro del procedimiento y cada expresión o variable con las que se corresponda han de ser del mismo tipo (número, string, array, función,...). 8
5. 5. Algunas normas sobre procedimientos (2/8) (2/8) 2ª) Las variables que tengan asignado algún valor en el momento de llamar a un procedimiento son consideradas como variables de entrada. Las variables de salida deben ser pasadas al procedimiento sin tener ningún valor asignado. 3ª) El valor de las variables de entrada no puede ser modificado en el procedimiento. 4ª) Las variables que se utilicen en un procedimiento y no formen parte de sus argumentos son consideradas como variables locales y su valor no es transmitido al programa que llame al procedimiento. 9
5. 5. Algunas normas sobre procedimientos (3/8) (3/8) 5ª) Las variables locales pueden ser definidas, tras la primera línea del procedimiento, usando la sentencia local lista de variables locales: 10
5. 5. Algunas normas sobre procedimientos (4/8) (4/8) Ej: > int_simpson:=proc(a,b,f,valor) local pmed: pmed:=(a+b)/2.: valor:=(b-a)*(f(a)+4.*f(pmed)+f(b))/6.: end proc: > save int_simpson,"a:/int_simpson.m"; > restart; > read "A:/int_simpson.m"; > g:=x->4*x^2: > int_simpson(0.,1.,g,resultado): > resultado; 1.333333334 11
5. 5. Algunas normas sobre procedimientos (5/8) (5/8) 6ª) Variables usadas en un procedimiento y que no forman parte de sus argumentos pueden ser declaradas como variables globales. Su valor (y su nombre) se transmiten entonces al programa que llame al procedimiento 12
Ej: 5. 5. Algunas normas sobre procedimientos (6/8) (6/8) > int_simpson:=proc(a,b,f,valor) global pmed: pmed:=(a+b)/2.: valor:=(b-a)*(f(a)+4.*f(pmed)+f(b))/6.: end proc: > save int_simpson,"a:/int_simpson.m"; > restart; > read "A:/int_simpson.m"; > g:=x->4*x^2: > int_simpson(0.,1.,g,resultado): > resultado;pmed; 1.333333334.500000000 13
5. 5. Algunas normas sobre procedimientos (7/8) (7/8) 7ª) Cuando se lea un procedimiento en un programa, se puede visualizar el proceso programado usando: Ej: [> print (Nombre_procedimiento); > restart; > read "A:/int_simpson.m"; > print (int_simpson); proc ( a, b, f, valor) global pmed; description "calculo de una integral por el método de Simpson" ; pmed :=.5000000000 a +.5000000000 b; valor :=.1666666667 ( b a ) ( f( a ) + 4. f( pmed ) + f( b) ) end proc Nota: description sirve para escribir comentarios 14
5. 5. Algunas normas sobre procedimientos (8/8) (8/8) 8ª) Un procedimiento puede llamar a otros procedimientos (que se hayan leído previamente). 15
Dada la función f(x) Dados: x, maxiter y ε f y x - f ( x) ( x) 6. 6. Ejemplo: Algoritmo del método de de la la secante (1/3) (1/3) j 1 MIENTRAS ( ( j < maxiter) Y ( x y > ε ) ) HACER: x.f( y)- y.f( x) 1º) z 2º) x y f( y)- f(x) 3º) y z 4º) j j+1 FIN BUCLE CONDICIONAL 16
6. 6. Ejemplo: Procedimiento sobre el el método de de la la secante (2/3) (2/3) > secante:=proc(xinic,maxiter,eps,f,z,tol,iter) local aux,x,y,j: x:=xinic: y:= x-f(x)/d(f)(x): j:= 1: while ((j<maxiter) and (abs(x-y)<eps)) do aux := (x*f(y)-y*f(x))/(f(y)-f(x)): x := y: y := aux: j := j+1: od: z:=aux: tol:=abs(x-y): iter:=j: end: 17
6. 6. Ejemplo: Almacenamiento y uso del procedimiento del método de de la la secante (3/3) (3/3) Almacenamiento del procedimiento [> save secante,"a:/secante.m": Uso del procedimiento [> restart; [> read "A:/secante.m": [> maxiter:=20:eps:=10.^(-4): f:=x->x^3+4.*x^2+x-10.:x:=0.: [> secante(x,maxiter,eps,f,sol,tol,iter): [> evalf(sol);tol;iter; 1.284277548.000015211 13 18
7. 7. Ejercicio propuesto (1/2) Escribir (y salvar) un procedimiento, llamado soporte_ch, que calcule los (n+1) puntos de un soporte de Chebyshev dados por la fórmula: a+ b b a (2 i+ 1) xi = + cos π 2 2 (2 n + 2) (i = 0, 1,..., n) (Datos: a, b, n) (Resultados {x i } (i = 0,.., n) Escribir (y salvar) un procedimiento, llamado polbaslgr1, que calcule el i-ésimo polinomio de base de Lagrange en un soporte dado n ( x x j ) Li ( x) = ( x x ) j= 0 i j j i (Datos: n, {x k } (k = 0,..., n), i) (Resultado: función L i (x) ) 19
7. 7. Ejercicio propuesto (2/2) Escribir (y salvar) un procedimiento, llamado polbaslgr, que calcule TODOS los polinomios de base de Lagrange en un soporte dado. Para ello utilizará el procedimiento anterior polbaslgr1. (Datos: n,{x k }(k = 0,..., n)) (Resultado: funciones L i (x) (k = 0,..., n)) Escribir un programa que usando los procedimientos anteriores calcule el polinomio interpolador de Lagrange de la función de Runge f(x) = (1+x 2 ) -1 sobre un soporte de Chebyshev formado por 9 puntos del intervalo [-6, 6]. n p( x) = f ( xi) Li( x) i= 0 20
21