Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. UNIVERSIDAD POLITÉCNICA DE MADRID E.T.S.I. MINAS DEPARTAMENTO DE MATEMÁTICA APLICADA Y MÉTODOS INFORMÁTICOS Asignatura: PROGRAMACIÓN Y MÉTODOS NUMÉRICOS EXÁMEN DE LABORATORIO – GRUPO 3 Curso 2004-05 Fecha: 1 – VI – 2005 Hora: 18:00 a 20:00 INSTRUCCIONES Y RECOMENDACIONES 1ª. El presente examen debe realizarse individualmente. Para la resolución de los ejercicios que se proponen puede utilizarse toda la documentación (impresa o informática) que se desee. 2ª. Al finalizar el examen debe entregarse un disquette etiquetado en el que se graben los ejercicios resueltos. En la etiqueta debe figurar el nombre del alumno y el grupo de Laboratorio al que pertenece (Grupo 4º) y la fecha de hoy (1- VI – 2005). 3ª. Al fichero en el que se grabe la solución del examen debe asignársele un nombre formado de la siguiente manera: el primer carácter será la inicial del nombre del alumno (en el caso de tener un nombre compuesto utilícense los dos primeros caracteres para las iniciales de cada uno de ellos). El carácter siguiente será un guión bajo (_). Tras él se escribirá el primer apellido del alumno. Ejemplo: Una alumna que se llamase EVA MARÍA DE HEREDIA GÓMEZ-RICO debe asignar al fichero el nombre EM_DEHEREDIA 4ª. En el fichero debes escribir como primera línea tu nombre y apellidos completos. Además debes identificar claramente el comienzo y el final de cada uno de los ejercicios (se sugiere que cada ejercicio lo realices en una sección de MAPLE vinculada a un “botón”). 5ª. Se recomienda grabar periódicamente (cada 5 minutos) para evitar perder el trabajo realizado por bloqueos del ordenador. Asimismo se recomienda no abrir simultáneamente muchas hojas de MAPLE pues ello puede ralentizar el funcionamiento del ordenador llegando incluso a bloquearlo. 6ª. Se recomienda grabar eliminando las respuestas que proporciona MAPLE a las instrucciones. Ello hará que la grabación sea más rápida al ocuparse menos memoria. Recuerda que para eliminar las respuestas de MAPLE puedes seleccionar en la barra de menús de MAPLE la opción “Edit” y en la ventana que se despliegue elegir la opción “Remove_Output” seleccionando en la nueva ventana que se despliegue la opción “FromWorksheet”. Si tienes problemas para realizar esta operación pide ayuda al profesor. 7ª. Lee con atención los enunciados de los ejercicios. Si tienes dudas en la comprensión de los mismos no dudes en solicitar las aclaraciones oportunas al profesor. Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Primer ejercicio (2.5 puntos) El método de Müller permite obtener soluciones de ecuaciones no lineales de la forma f(x)=0. Consiste en, partiendo de tres aproximaciones p0, p1, p2, generar una nueva aproximación p3 mediante: p3 = p2 − 2c b+ b b 2 − 4ac abs ( b ) donde: c = f ( p2 ) b= ( p0 − p2 ) 2 ⎡⎣ f ( p1 ) − f ( p2 ) ⎤⎦ − ( p1 − p2 ) ⎡⎣ f ( p0 ) − f ( p2 ) ⎤⎦ ( p0 − p2 )( p1 − p2 )( p0 − p1 ) 2 ( p1 − p2 ) ⎡⎣ f ( p0 ) − f ( p2 ) ⎤⎦ − ( p0 − p2 ) ⎡⎣ f ( p1 ) − f ( p2 )⎤⎦ a= ( p0 − p2 )( p1 − p2 )( p0 − p1 ) 2 A continuación se comprueba el valor de f(p3). Si este no es lo suficientemente pequeño aún estaremos lejos de la solución, por lo que se sustituyen p0, p1 y p2 respectivamente por p1, p2 y p3 y se realiza una nueva iteración. Se pide construir un programa MAPLE que permita calcular una raíz de una función utilizando el método de Müller descrito y aplicarlo al siguiente ejemplo: f ( x ) = 16 x 4 − 40 x 3 + 5 x 2 + 20 x + 6 utilizando como valores iniciales p0 = 0.5, p1 = -0.5, p2 = 0. El programa parará cuando abs(f(p3))≤ 10-5 o cuando haya realizado más de 100 iteraciones. Solución: > restart: > f:=x->16*x^4-40*x^3+5*x^2+20*x+6; f := x → 16 x4 − 40 x3 + 5 x2 + 20 x + 6 > p0:=0.5; p1:=-0.5;p2:=0; eps:= 1e-5; maxiter:=100; p0 := 0.5 p1 := -0.5 p2 := 0 eps := 0.00001 1 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. maxiter := 100 > tol:=2*eps; iter:=0; tol := 0.00002 iter := 0 > while iter <= maxiter and tol>= eps do iter; f0:=f(p0); f1:=f(p1); f2:=f(p2); c:=f2; b:=((p0-p2)^2*(f1-f2)-(p1-p2)^2*(f0-f2))/((p0-p2)*(p1p2)*(p0-p1)); a:=((p1-p2)*(f0-f2)-(p0-p2)*(f1-f2))/((p0-p2)*(p1p2)*(p0-p1)); p3:=p2-2*c/(b+(b/abs(b))*sqrt(b^2-4*a*c)); tol:=abs(f(p3)); iter:=iter+1; p0:=p1; p1:=p2; p2:=p3; od: > print(`iteraciones = `, iter, `resultado =` , p3); > iteraciones = , 69, resultado =, -0.3560621852 + 0.1627582207 I > fin_del_primer_ejercicio; fin_del_primer_ejercicio 2 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Segundo ejercicio (2.5 puntos) La determinación del mínimo de una función f(x) en un intervalo [a,b] puede realizarse mediante el método de Fibonacci que responde al siguiente algoritmo: Dados f(x), a, b, ε, n F[0] ← 1, F[1] ← 1 Para i desde 2 hasta n con paso 1 hacer F[i] ← F[i-1] + F[i-2] Terminar para i L2 ← (F[n-1]*(b-a) + (-1)n ε)/F[n] x ← a + L2 y ← b – L2 Para i desde 2 hasta n con paso 1 hacer vx ← f(x) vy ← f(y) Si vx > vy entonces Si y < x entonces b←x en caso contrario a←x fin de la condición x←a–y+b en caso contrario Si x < y entonces b←y en caso contrario a←y fin de la condición y←a–x+b fin de la condición Terminar para i Se pide: a) b) Implementar un programa MAPLE que responda al algoritmo anterior Aplicarlo a la determinación del mínimo de la función f(x) = 2x2 – ex en [0,1] con un parámetro ε = 10-5 y n = 100. Solución: 3 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. > restart: > eps:=0.00001; n:= 10; a:=0.; b:=1;f:=x->2*x^2-exp(x); eps := 0.00001 n := 10 a := 0. b := 1 f := x → 2 x2 − e x > F[0]:=1; F[1]:=1; F0 := 1 F1 := 1 > for i from 2 to n do F[i]:= F[i-1]+F[i-2]: od: > L2:=(F[n-1]*(b-a) + (-1)^n*eps)/F[n]: x:=a + L2: y:=b - L2: > for i from 2 to n do vx:=f(x): vy:=f(y): if vx > vy then if y < x then b:=x: else a:=x: fi: x:=a - y + b: else if x < y then b:=y: else a:=y: fi: y := a - x + b: fi: od: > print((a+b)/2); 0.3539329212 > fin_del_segundo_ejercicio; fin_del_segundo_ejercicio 4 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Tercer ejercicio (5 puntos) Las fórmulas de integración numérica de Gauss son de la forma: 1 ∫ −1 n f ( x ) dx ≈ ∑ ci f ( xi ) i =1 donde x1 , x2 ,…, xn son las n raíces del polinomio pn+1(x) de Legendre de grado n y los coeficientes c1 , c2 ,…, cn vienen dados por: 1 ci = n x − xj ∫∏ x −1 j =1 j ≠i i − xj i = 1, 2,..., n dx (*) Se pide: a) Elaborar un procedimiento MAPLE, llamado pLegendre, que calcule el polinomio de Legendre de grado n sabiendo que: p1 ( x ) = 1 p2 ( x ) = x pi ( x ) = i−2 2i − 3 x pi −1 ( x ) − pi − 2 ( x ) i −1 i −1 i = 3, 4, … , n + 1 Variable de entrada: n (grado del polinomio) Variable de salida: pl (n+1-ésimo polinomio de Legendre) b) Si x1 , x2 ,…, xn son las raíces del polinomio calculado anteriormente, elaborar un procedimiento MAPLE, llamado coefGauss, que determine los coeficientes c1 , c2 ,…, cn utilizando la expresión (*) Variable de entrada: n, x (vector que contiene las n raíces de pl) Variable de salida: c (vector que contiene los n coeficientes ci) c) Elaborar un procedimiento MAPLE, llamado intGauss, que permita 1 aproximar, utilizando la fórmula de Gauss, ∫ f ( x ) dx −1 Variable de entrada: n, f Variable de salida: resultado 1 d) Aproximar el valor de ∫ cos (π x ) dx −1 gaussiana de 5 puntos. 5 mediante una fórmula de cuadratura Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Notas: 1. Una vez determinado el n+1-ésimo polinomio de Legendre, pueden ser halladas utilizando el comando solve de MAPLE: pl, sus raíces x = {evalf(solve(pl = 0))} 2. Nótese que, dentro del procedimiento intGauss, se deberá llamar a los procedimientos pLegendre y coefGauss. 3. La función MAPLE int(f, x=a..b), evalúa la integral de la función f en el intervalo [a,b] . Solución: > restart: > with(linalg): with(plots): Warning, the protected names norm and trace have been redefined and unprotected Warning, the name changecoords has been redefined > pLegendre:=proc(n,pl) local i, p: p:=vector(n+1): p[1]:=1: p[2]:=x: for i from 3 to n+1 do p[i]:=expand(((2*i-3)/(i-1))*x*p[i-1]-((i-2)/(i1))*p[i-2]); od: pl:=p[n+1]: end: > > coefGauss:=proc(n,x,c) local i,j: for i from 1 to n do c[i]:=1: for j from 1 to n do if i<> j then c[i]:=c[i]*(y-x[j])/(x[i]-x[j]): fi: od: c[i]:=evalf(int(c[i],y=-1..1)): od: end: > > intGauss:=proc(n,f,resultado) local i,x: pLegendre(n,pl): 6 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. x:={fsolve(pl=0)}: coefGauss(n,x,c): resultado:=evalf(sum(c[i]*f(x[i]),i=1..n)): end: > > n:=5; f:=x->cos(Pi*x); n := 5 f := x → cos( π x ) > > intGauss(n,f,resultado): > resultado; 0.0000616066 > fin_del_tercer_ejercicio; fin_del_tercer_ejercicio 7 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Examen de Laboratorio (Grupo 4º) Fecha: 1 – VI – 2005 Primer ejercicio (2.5 puntos) Se quiere calcular y representar las n primeras sumas parciales de las tres series numéricas siguientes: S1i = 1 + 1 1 1 i 1 + + ... + = ∑ 2 3 i k =1 k S2i = 1 + i 1 1 1 1 + + ... + = 1+ ∑ 2 4 2·(i − 1) k = 2 2·(k − 1) S3i = 1 + i 1 1 1 1 + + ... + = 1+ ∑ 3 6 3·(i − 1) k = 2 3·(k − 1) y: La forma elegida para el cálculo de cada una de estas n primeras sumas parciales consiste en realizar el proceso iterativo siguiente: 1 S11 = 1; (i = 2, 3, ……….n) S1i = S1i−1 + i 1 S2i = S2i−1 + S21 = 1; (i = 2, 3, ……….n) 2·(i − 1) 1 S3i = S3i−1 + S31 = 1; (i = 2, 3, ……….n) 3·(i − 1) Se pide que calcules las n = 5000 primeras sumas parciales de las tres series anteriores, que escribas los valores de S1n, S2n y S3n y que representes en una misma figura los valores de (i, S1i), (i, S2i) y de (i, S3i) ( i = 1, 2, …., n). Los puntos (i, S1i) los debes representar con círculos de color rojo, los puntos (i, S2i) con rectángulos de color azul y los puntos (i, S3i) con rombos de color verde. NOTAS: 1ª. Aunque se pide representar los 5000 valores de las primeras sumas parciales se recomienda que realices el programa con un valor de n bastante inferior (por ejemplo 20) y que cuando estés seguro de que todo funciona ya asignes a n el valor 5000 que se indica en el enunciado. 8 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. 2ª. No es necesario (ni aconsejable) que escribas los 5000 valores de las sumas parciales. Sólo se pide escribir los últimos calculados, es decir, S15000, S25000, y S35000. Solución: > restart; > with(plots): Warning, the name changecoords has been redefined > n:=5000; s1:=vector(n); s2:=vector(n); s3:=vector(n); n := 5000 s1 := array ( 1 .. 5000, [ ] ) s2 := array ( 1 .. 5000, [ ] ) s3 := array ( 1 .. 5000 , [ ] ) > s1[1]:=1;s2[1]:=1;s3[1]:=1; s11 := 1 s21 := 1 s31 := 1 > for i from 2 to n by 1 do s1[i]:=s1[i-1]+(1./i): s2[i]:=s2[i-1]+(1./(2*(i-1))): s3[i]:=s3[i-1]+(1./(3*(i-1))): od: > s1[n];s2[n];s3[n]; 9.094508864 5.547154405 4.031436267 > p1:=[seq([i,s1[i]],i=1..n)]: p2:=[seq([i,s2[i]],i=1..n)]: p3:=[seq([i,s3[i]],i=1..n)]: > dib1:=pointplot(p1,color=red,symbol=CIRCLE): dib2:=pointplot(p2,color=blue,symbol=BOX): dib3:=pointplot(p3,color=green,symbol=DIAMOND): > display(dib1,dib2,dib3); 9 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. > fin_del_primer_ejercicio; fin_del_primer_ejercicio Segundo ejercicio (2.5 puntos) El siguiente algoritmo recoge el método de aproximación de Padé para hallar una función racional R(x) (es decir el cociente de dos polinomios P(x) y Q(x)) que aproxime a una cierta función dada f(x) en el entorno del origen de abscisas. En dicho algoritmo se utiliza la siguiente notación: f … función que se quiere aproximar en un entorno de 0 n … grado del polinomio P(x) usado como numerador de la función racional R(x) m … grado del polinomio Q(x) usado como denominador de la función racional R(x) p0, p1, …, pn coeficientes del polinomio P(x) = p0+ p1.x+ p2.x2 + …+ pn.xn q0, q1, …, qm coeficientes del polinomio Q(x) = q0+ q1.x+ q2.x2+ …+ qm.xm N … entero obtenido como (n+m) a … array auxiliar de elementos a0, a1, …, aN aux … vector auxiliar de N elementos 10 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. c … vector auxiliar de N elementos B … matriz auxiliar de dimensiones (N, N) y de elementos Bi,j [0] … matriz nula de dimensiones (N,N). Con esta notación el algoritmo que se pide que programes en MAPLE es el siguiente: Datos: función f, enteros positivos n y m. N Å n+m Para i desde 0 hasta N con paso 1 hacer ai Å f(i(0.) / i! (véase la nota al final del enunciado) Si (i > 0) entonces auxi Å ai Fin condición. Fin bucle. q0 Å 1 p0 Å a0 B Å [0] Para i desde 1 hasta N con paso 1 hacer Si (i < n) entonces Bi,i Å 1 Fin condición Para j desde 1 hasta i con paso 1 hacer Si (j < m) entonces Bi,n+j Å -ai-j Fin condición Fin bucle Fin bucle. c Å B-1.aux Para i desde 1 hasta n con paso 1 hacer pi Å ci Fin bucle. Para i desde 1 hasta m con paso 1 hacer qi Å cn+i Fin bucle. 11 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. PÅ xÆp0 + p1.x + p2.x2 + …. + pn.xn QÅ xÆq0 + q1.x + q2.x2 + …. + qm.xm RÅ x Æ P(x) / R(x) Dibujar en un mismo gráfico la función f (color azul, trazo continuo y fino)y la función R (color rojo, trazo continuo y grueso) en el intervalo de abscisas [-2, 2] FIN Aplicar el programa anterior al caso en que f = x Æ e-x, n = 5 y m = 3. NOTA: Para un valor entero no negativo “i”, el valor de la i-ésima derivada de una función f en el punto 0 puede calcularse en MAPLE mediante la instrucción: [> (D@@i)(f)(0.) Asimismo se recuerda que el valor de i! en MAPLE se calcula escribiendo i!. Solución: > restart; > with(linalg):with(plots): Warning, the protected names norm and trace have been redefined and unprotected Warning, the name changecoords has been redefined > f:=x->exp(-x); n:=5;m:=3; f := x → e ( −x ) n := 5 m := 3 > N:=n+m; N := 8 > a:=array(0..N);q:=array(0..m);p:=array(0..n); aux:=vector(N);c:=vector(N);B:=matrix(N,N); a := array ( 0 .. 8, [ ] ) q := array ( 0 .. 3, [ ] ) p := array ( 0 .. 5, [ ] ) aux := array ( 1 .. 8, [ ] ) c := array ( 1 .. 8, [ ] ) B := array ( 1 .. 8, 1 .. 8, [ ] ) > for i from 0 to N by 1 do 12 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. a[i]:=(D@@i)(f)(0.)/i!: if (i > 0) then aux[i]:=a[i]: fi: od: > q[0]:=1.;p[0]:=a[0]; q0 := 1. p0 := 1. > for i from 1 to N by 1 do for j from 1 to N by 1 do B[i,j]:=0.: od: od: > for i from 1 to N by 1 do if (i <= n) then B[i,i]:=1.: fi: for j from 1 to i by 1 do if (j <=m) then B[i,n+j]:=-a[i-j]: fi: od: od: > c:=evalm(inverse(B)&*aux); c := [ -0.624999996 , 0.178571427 , -0.0297619037 , 0.00297619029 , -0.000148809503 , 0.375000004 , 0.0535714301 , 0.00297619059 ] > for i from 1 to n by 1 do p[i]:=c[i]: od; p1 := -0.624999996 p2 := 0.178571427 p3 := -0.0297619037 p4 := 0.00297619029 p5 := -0.000148809503 > for i from 1 to m by 1 do q[i]:=c[n+i]: od; q1 := 0.375000004 q2 := 0.0535714301 q3 := 0.00297619059 > P:=0.: 13 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. for i from 0 to n by 1 do P:=P+p[i]*(x^i): od: P:=unapply(P,x); P := x → 1. − 0.624999996 x + 0.178571427 x 2 − 0.0297619037 x 3 + 0.00297619029 x 4 − 0.000148809503 x 5 > Q:=0.: for i from 0 to m by 1 do Q:=Q+q[i]*(x^i): od: Q:=unapply(Q,x); Q := x → 1. + 0.375000004 x + 0.0535714301 x 2 + 0.00297619059 x 3 > R:=x->P(x)/Q(x); R := x → P( x ) Q( x ) > dibf:=plot(f,-2..2,color=blue): > dibr:=plot(R,-2..2,color=red,thickness=2): > display(dibf,dibr); > fin_del_segundo_ejercicio; fin_del_segundo_ejercicio 14 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Tercer ejercicio (5 puntos) A) Escribir un procedimiento llamado aitken en el que tomando como datos dos números reales (llamados a y ε) y una función (llamada g) se calculen como parámetros de salida dos números reales (llamados z y δ) de la forma siguiente: Se calcularán los números: b = g(a) y c = g(b) y tras ello, si (c – 2b + a) es distinto de 0 se tomará z = a – [(b-a)2/ (c – 2b + a)] y δ = |z – a| mientras que si (c – 2b + a) es nulo se tomará z = a y δ = ε/2. El procedimiento debe guardarse en el disquete de trabajo en un fichero llamado aitken.m. B) Escribir un programa MAPLE que leyendo y utilizando el procedimiento anterior realice lo siguiente: • Dada una función f, un valor ε , dos números reales α y β tales que α < β, un valor entero (maxit) y un valor real x1, • se iniciará la variable iter con valor 1 y se asignará a otra variable, llamada tol, el valor tol Å (2.ε) y a la variable δ1 el valor de tol. • a continuación mientras iter sea inferior a maxit y tol sea superior a ε se realizarán las siguientes operaciones: o Usando el procedimiento aitken con parámetros de entrada xiter (en el papel de “a”), ε y f (en el papel de función “g”), respectivamente se calculará el valor xiter+1 (en el papel de “z”) y el valor de δiter+1 (en el papel de δ). o Se asignará a tol el valor de δiter+1, y o Se actualizará el valor de iter incrementándolo en una unidad. • Se escribirán todos los valores de xi y δi calculados. • Si el último valor calculado para tol es inferior a ε entonces se procederá a dibujar en una misma figura y en el intervalo [α, β] el grafo de la función f (en trazo continuo de color azul), el grafo de la bisectriz del primer cuadrante (también en trazo continuo y en color verde) y la secuencia de puntos [xi, f(xi)] calculados (con rombos de color rojo). 15 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Aplíquese este programa con los datos siguientes: f(x) = 0.5 − 0.3 (x − 0.4)2 ex 2 + x − 0.3 ε = 10-6, maxit = 100, x1 = -1, α = -1 y β = 1. NOTAS: 1ª. El procedimiento se valorará sobre 2 puntos y el programa sobre 3 puntos. 2ª. El programa que se pide realizar recoge el método de Steffensen para resolver una ecuación de la forma x = f(x). Solución: a) > restart; > aitken:=proc(a,eps,g,z,delta) local b,c: b:=g(a): c:=g(b): if ((c-2*b+a) <> 0.) then z:= a-((b-a)^2)/(c-2*b+a): delta:=abs(z-a): else z:=a: delta:=eps/2.: fi: end proc: > save aitken,"aitken.m": > fin_procedimiento-del_tercer_ejercicio; fin_procedimiento − del_tercer_ejercicio b) > restart; > with(linalg):with(plots): Warning, the protected names norm and trace have been redefined and unprotected Warning, the name changecoords has been redefined 16 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. > read "aitken.m": > f:=x-> 0.5 - 0.3*(x*x-0.4)/exp(x*x+x-0.3); 0.3 ( x x − 0.4 ) f := x → 0.5 − ( x x + x − 0.3 ) e > alpha:=-1.;beta:=1.; α := -1. β := 1. > eps:=10**(-6.);maxiter:=100; eps := 0.1000000000 10 -5 maxiter := 100 > x:=vector(maxiter);delta:=vector(maxiter): x := array ( 1 .. 100, [ ] ) > x[1]:=-1; x1 := -1 > iter:=1; tol:=2*eps;delta[iter]:=tol; iter := 1 tol := 0.2000000000 10 -5 δ1 := 0.2000000000 10 -5 > while((iter<maxiter) and (tol>eps)) do aitken(x[iter],eps,f,x[iter+1],delta[iter+1]): tol:=delta[iter+1]: iter:=iter+1: od: > for i from 1 to iter by 1 do print(i,x[i],delta[i]); od; 1, -1, 0.2000000000 10 -5 2, 0.724720557 , 1.724720557 3, 0.5246708056 , 0.2000497514 4, 0.5230748803 , 0.0015959253 5, 0.5230747662 , 0.1141 10 -6 > if (tol < eps) then bisec:=x->x: dibf:=plot(f,alpha..beta, color=blue): dibx:=plot(bisec,alpha..beta, color=green): ptos:=[seq([x[i],f(x[i])],i=1..iter)]: dibp:=pointplot(ptos,color=red,symbol=DIAMOND): fi: if (tol < eps) then display(dibf,dibx,dibp); 17 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. fi; > fin_del_programa_del_tercer_ejercicio; fin_del_programa_del_tercer_ejercicio 18 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Examen de Laboratorio (Grupo 6º) Fecha: 2 – VI – 2005 Primer ejercicio (2’5 Puntos) Para analizar la estabilidad de la solución de determinados métodos numéricos es útil emplear la técnica de von Neumann. En ella se define el denominado “factor de amplificación”, que es un número complejo que se expresa con frecuencia en función de un parámetro denominado “número de Courant”. El objetivo de este ejercicio es representar gráficamente, en el plano complejo, el valor del módulo del factor de amplificación para diferentes valores de un ángulo “theta”, correspondiente a un método numérico específico (de expresión conocida) y para diversos valores del número de Courant: c1, c2, ..., cn. Tal y como se observa en la figura siguiente, para cada número de Courant, el módulo del factor de amplificación describirá una curva en función del ángulo theta. cn c2 c1 theta En la práctica, el ejercicio se resolverá mediante el siguiente proceso: Datos de partida: • • • • n : número de valores que daremos al número de Courant. nt: número de valores del ángulo theta. th1, th2: valores mínimo y máximo que tomará el ángulo theta. cj (j=1,2,…,n): Valores que toma el número de Courant. 19 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Proceso de cálculo: Para j = 1, 2, 3, …, n iÅ1 g ← 1 − c j + c j ⋅ eI⋅theta donde I es la unidad imaginaria (en Maple se representa como I) y el parámetro theta va tomando valores entre th1 y th2, con un incremento de 0.01(th2-th1). modgi ← g xg j, i ← modgi ⋅ cos(theta) yg j, i ← modgi ⋅ sen(theta) Se incrementa i Siguiente valor de j Para j = 1,2,...,n Creación de la secuencia: seqg j ← ( xg j, k ,yg j, k ) (k = 1,2,...,i-1) Siguiente valor de j Representar gráficamente los puntos almacenados en la secuencia: seqg j Para resolver el ejercicio se emplearán los siguientes datos: n = 4, nt = 500 c1 = 0.5 c 2 = 0.75 c 3 = 1 c 4 = 1.25 th1 = 0 ; th2 = 2. π Solución: > restart:with(linalg):with(plots): > n:=4:nt:=500: > xg:=array(1..n,1..nt):yg:=array(1..n,1..nt): Números de Courant que se analizan > c[1]:=0.5:c[2]:=0.75:c[3]:=1.:c[4]:=1.25: Rango de valores del ángulo > th1:=evalf(0.):th2:=evalf(2.*Pi): > for j from 1 by 1 to n do i:=1: for theta from th1 by 0.01*(th2-th1) to th2 do g:=1-c[j]+c[j]*exp(I*theta): modg[i] := abs(g): xg[j,i]:=modg[i]*cos(theta): yg[j,i]:=modg[i]*sin(theta): 20 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. i:=i+1: od: > od: > for j from 1 by 1 to n do seqG[j]:=[seq([xg[j,k],yg[j,k]],k=1..i-1)]: od: > colores[1]:=green:colores[2]:=gold:colores[3]:=blue:colores [4]:=navy: > simbolo[1]:=box:simbolo[2]:=cross:simbolo[3]:=circle:simbol o[4]:=diamond: > for i from 1 by 1 to n do dibG[i]:=pointplot(seqG[i],color=colores[i],symbol=simbolo[ i]): od: > display(dibG[1],dibG[2],dibG[3],dibG[4],scaling=CONSTRAINED ; > Fin_del_Ejercicio_1; Fin_del_Ejercicio_1 21 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Segundo ejercicio (2’5 Puntos) Programar en Maple el siguiente algoritmo para calcular los polinomios n de base de Lagrange construido sobre el soporte: {xi }i=0 Dados: n, x0, h (aparecen al final de este enunciado) Definir el soporte equidistante: x i ← x 0 + i ⋅ h (i = 1,2,...,n) Para i desde 0 hasta n con paso 1 HACER: p0 ← 1 k←0 Para j desde 0 hasta n con paso 1 HACER: Si i ≠ j entonces k ← k +1 E0 ← −p0 ⋅ x j Ek ← pk−1 Si k > 1 entonces M ← k −1 Para ind desde 1 hasta M con paso 1 HACER: Eind ← pind−1 − pind ⋅ x j Fin del bucle en ind Fin condición Para m desde 0 hasta k con paso 1 HACER: p m ← Em Fin del bucle en m Fin condición Fin del bucle en j Para m desde 0 hasta k con paso 1 HACER: Li,m ← pm Fin del bucle en m Fin del bucle en i Para i desde 0 hasta n con paso 1 HACER: di ← 1 Fin del bucle en i 22 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Para i desde 0 hasta n con paso 1 HACER: Para j desde 0 hasta n con paso 1 HACER: Si i ≠ j entonces di ← di ⋅ ( xi − x j ) Fin de la condición Fin del bucle en j Fin del bucle en i Para i desde 0 hasta n con paso 1 HACER: Para j desde 0 hasta n con paso 1 HACER: Li,j ← Li,j di Fin del bucle en j Fin del bucle en i n Calcular y escribir: pbasi ← ∑ Li, r ⋅ x r (i = 0,1, ,n) r =0 Aplicar el programa anterior al caso en que n = 5, x0 = 0 y h = 1. Solución: > restart:with(linalg):with(plots): > n := 5:x[0]:=0:h:=1: > for i from 1 by 1 to n do x[i] := x[0]+i*h: od: > for i from 0 by 1 to n do p[0]:=1: k := 0: for j from 0 by 1 to n do if (i<>j) then k := k + 1: E[0] := -p[0]*x[j]: E[k] := p[k-1]: if (k>1) then 23 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. M := k - 1: for ind from 1 by 1 to M do E[ind] := p[ind-1] - p[ind]*x[j]: od: fi: for m from 0 by 1 to k do p[m] := E[m]: od: fi: od: for m from 0 by 1 to k do L[i,m] := p[m]: od: od: > for i from 0 by 1 to n do d[i]:=1.0: od: > for i from 0 by 1 to n do for j from 0 by 1 to n do if (i<>j) then d[i] := d[i]*(x[i]-x[j]): fi: od: od: > for i from 0 by 1 to n do for j from 0 by 1 to n do L[i,j] := L[i,j]/d[i]: od: od: > for i from 0 by 1 to n do pbas[i]:=sum(L[i,jj]*x^jj,jj=0..n): od; pbas 0 := 1.000000000 − 2.283333333 x + 1.875000000 x2 − 0.7083333333 x3 + 0.1250000000 x4 − 0.008333333333 x5 pbas 1 := 5.000000000 x − 6.416666667 x2 + 2.958333333 x3 − 0.5833333333 x4 + 0.04166666667 x5 pbas 2 := −5.000000000 x + 8.916666667 x2 − 4.916666667 x3 + 1.083333333 x4 − 0.08333333333 x5 pbas 3 := 3.333333333 x − 6.500000000 x2 + 4.083333333 x3 − 1.000000000 x4 + 0.08333333333 x5 pbas 4 := −1.250000000 x + 2.541666667 x2 − 1.708333333 x3 + 0.4583333333 x4 − 0.04166666667 x5 24 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. pbas 5 := 0.2000000000 x − 0.4166666667 x2 + 0.2916666667 x3 − 0.08333333333 x4 + 0.008333333333 x5 Aunque no se pedía en el enunciado, se representan a continuación los polinomios de base obtenidos > colore[0]:=blue:colore[1]:=red:colore[2]:=green:colore[3]:= magenta:colore[4]:=brown:colore[5]:=navy: > for i from 0 by 1 to n do dibbas[i]:=plot(pbas[i],x=x[0]..x[n],color=colore[i],thickn ess=3): od: > seqdib:=seq(dibbas[ii],ii=0..n): > display(seqdib); > Fin_del_Ejercicio_2; Fin_del_Ejercicio_2 25 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Tercer ejercicio (5 Puntos) Se desea resolver, mediante un método iterativo, los n sistemas de ecuaciones lineales: [ A ]k ⋅ {x}k = {b}k (k = 1,2, ,n) donde [ A ]k es la matriz de coeficientes, {x}k el vector de incógnitas y {b}k el vector del segundo miembro del k-ésimo sistema. Para resolver los sistemas se partirá, en el proceso iterativo, de un mismo vector solución inicial: {x01,x02 , ,x0m } . Los pasos que se deben seguir son los siguientes: A) Escribir un procedimiento llamado sistemas en el que tomando como datos dos números enteros (llamados k y m) se calculen como parámetros de salida las matrices [R], [S], [T], todas ellas de dimensiones (m,m), de la forma siguiente: 1) Se definen los elementos de la matriz cuadrada [A], que dependerá del valor de k (k se introduce entre los parámetros de entrada) de dimensiones (m,m) (los elementos de la matriz se escriben dentro del propio procedimiento y figuran al final de este enunciado) 2) Ri,j = 0, Si,j = 0, Ti,j = 0 3) Ri,i = A i,i (i, j = 1,2,...,m) (i = 1,2,...,m) Ti,j = −A i,j (si i < j) (i, j = 1,2,...,m) Si,j = −A i,j (si i > j) (i, j = 1,2,...,m) El procedimiento debe guardarse en el disquete de trabajo en un fichero llamado sistemas.m. 26 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. B) Escribir un procedimiento llamado resol en el que tomando como datos tres matrices de dimensiones (m,m) (que, al llamarlo, se identificarán con [R], [S], [T]), el número real eps, el número entero maxiter y el vector {x0} de m componentes se calcule como parámetro de salida un vector, {soluc}, de m componentes, de acuerdo con el siguiente proceso: 1) Se define un vector {b} de m componentes (los elementos del vector se escriben dentro del propio procedimiento y figuran al final de este enunciado) 2) iter Å 0 ; tol Å 2. eps 3) Realizar, mientras iter<maxiter y tol>eps el proceso: x ← ⎡⎢⎣R−1 ⎤⎥⎦ i([S ] + [ T ]) ⋅ {x0} + ⎡⎢⎣R−1 ⎤⎥⎦ ⋅ {b} tol ← {x − x0} 2 {x0} ← {x} se incrementa la iteración 4) {soluc} ← {x} El procedimiento debe guardarse en el disquete de trabajo en un fichero llamado resoluc.m. C) Escribir un programa MAPLE que leyendo y utilizando los procedimientos anteriores realice lo siguiente: Dadas las variables eps, maxiter y el vector {x0} Para k desde 1 hasta n con paso 1 HACER: Llamar al procedimiento sistemas Llamar al procedimiento resol {sol}k ← {soluc} Fin del bucle Escribir {sol}k (k = 1,2, ,n) 27 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Aplíquese este programa con los datos siguientes: m=4 , n = 4, eps = 10-4, maxit = 500 ⎛ ⎞⎟ 1 ⎜⎜2 0.5 0 ⎟⎟ ⎜⎜ k3 ⎟⎟ ⎜⎜ ⎟⎟ ⎜⎜ 1 2 0 0.5⎟⎟⎟ ⎜⎜ k 3 ⎧ ⎟⎟ 1 ⎪ [A] = ⎜⎜ {b} = ⎨1 3 − 3 ⎟⎟ ⎪ ⎜⎜ 1 k ⎟ ⎪ ⎩ 2 0 ⎟⎟⎟ ⎜⎜0.5 3 k ⎟⎟ ⎜⎜ ⎟⎟ ⎜⎜ 1 ⎜ 3 0.5 0.5 2 ⎟⎟⎟ ⎜⎝ k ⎠ 1 k3 ⎫ ⎪ 1⎬ ⎪ ⎪ ⎭ {x0} = {0 0 0 0} Solución: A) > restart:with(linalg): > sistemas := proc(k,m,R,S,T) local A, h, i, j: h:=1/(k*k*k): A:=matrix(m,m,[[2.,h,0.5,0.],[h,2.,0.,0.5],[0.5,h,2.,0.],[h ,0.5,0.5,2.]]): for i from 1 by 1 to m do for j from 1 by 1 to m do R[i,j]:=0.: S[i,j]:=0.: T[i,j]:=0.: od: od: for i from 1 by 1 to m do for j from 1 by 1 to m do if (i=j) then R[i,j]:=A[i,j]: elif (i < j) then T[i,j]:=-A[i,j]: else S[i,j]:=-A[i,j]: fi: od: od: end: > save sistemas, "A:/sistemas.m": B) 28 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. > resol:=proc(R,S,T,eps,maxiter,m,x0,soluc,itmax) local iter,tol,x,b,h: h:=1/(k*k*k): b:=vector(m,[1.,3.-h,h,1.]): iter:=0: tol:=2.*eps: while (iter<maxiter) and (tol>eps) do x:=evalm(inverse(R)&*(S+T)&*x0+inverse(R)&*b): tol:=norm(x-x0,2): x0:=evalm(x): iter := iter + 1: od: itmax:=iter-1: soluc := evalm(x): end: > save resol, "A:/resol.m": C) > restart:with(linalg): > read "A:/sistemas.m": > read "A:/resol.m": > n:=4:m:=4: > eps:=10.^(-6):maxiter:=500: > x0:=vector(m,[0,0,0,0]): > for k from 1 by 1 to n do R := matrix(m,m): S := matrix(m,m): T := matrix(m,m): sistemas(k,m,R,S,T): soluc := vector(m): resol(R,S,T,eps,maxiter,m,x0,soluc,itmax[k]): sol[k]:=evalm(soluc): od: > > evalm(R);evalm(S);evalm(T); ⎡2. 0. 0. 0.⎤ ⎢ ⎥ ⎢0. 2. 0. 0.⎥ ⎢ ⎥ ⎢0. 0. 2. 0.⎥ ⎢ ⎥ ⎢ ⎥ ⎢0. 0. 0. 2.⎥ ⎦ ⎣ ⎡ 0. ⎢ ⎢ -1 ⎢ ⎢ 64 ⎢ ⎢ ⎢ ⎢ -0.5 ⎢ ⎢ ⎢ ⎢ -1 ⎢ ⎢⎢ ⎣ 64 0. 0. 0. 0. -1 64 0. -0.5 -0.5 29 0. ⎤ ⎥ ⎥ 0. ⎥⎥ ⎥ ⎥ ⎥ 0. ⎥⎥ ⎥ ⎥ ⎥ ⎥ 0. ⎥⎥ ⎦ Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. ⎡0. ⎢ ⎢ ⎢ ⎢0. ⎢ ⎢ ⎢0. ⎢ ⎢⎢ ⎣0. -1 64 0. 0. 0. -0.5 -0. 0. 0. -0. ⎤⎥ ⎥ ⎥ -0.5⎥⎥ ⎥ -0. ⎥⎥ ⎥ 0. ⎥⎦ > for i from 1 by 1 to n do print('sistema',i); print('iteraciones',itmax[i]); print('solucion_aprox',evalm(sol[i])); od; sistema, 1 iteraciones, 57 solucion_aprox , [ 0.0307690378, 0.9230767188, 0.0307690378, 0.2461535950] sistema , 2 iteraciones, 13 solucion_aprox , [ 0.4482375245, 1.368581655, -0.1350958067, 0.1636135408] sistema, 3 iteraciones, 10 solucion_aprox , [ 0.5072037596, 1.430414798, -0.1347715350, 0.1666966390] sistema , 4 iteraciones, 9 solucion_aprox , [ 0.5222116423, 1.446133589, -0.1340383441, 0.1678963106] > Fin_del_Ejercicio_3; Fin_del_Ejercicio_3 > 30 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Examen de Laboratorio (Convocatoria Septiembre) Fecha: 22 – IX – 2005 Primer ejercicio (2.5 puntos) La curva plana conocida bajo el nombre de conchoide (ver figura) tiene por ecuación cartesiana: y=± a2 x2 ( x − b) 2 − x2 donde a y b son parámetros reales. Obviamente, esta curva tiene la asíntota x=b Se pide: a) Obtener 100 puntos, 50 a cada lado de la asíntota, de una conchoide con valores a = 3 y b = 1 (solo de la parte que está por encima del eje x) en el intervalo -2 ≤ x ≤ 4, teniendo en cuenta que, para salvar la asíntota, no deben tomarse puntos del intervalo ] b-0.2, b+0.2[. b) Dibujar la curva obtenida Nota: Para salvar el problema de la asíntota, la parte que queda a la izquierda de ella y la que queda a la derecha deberán ser consideradas como dos dibujos independientes. Solución: > restart: > with(plots): Warning, the name changecoords has been redefined > n:= 50: > x:=vector(2*n); y:=vector(2*n): x := array( 1 .. 100, [ ] ) > a:=3.: b:=1.: > x[1]:=-2.: x[n]:= b-0.2: x[n+1]:=b+0.2: x[2*n]:=4.: > h1:=(x[n]-x[1])/n: h2:=(x[2*n]-x[n+1])/n: 31 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. > for i from 2 to n-1 do x[i]:=x[i-1]+h1; x[n+i]:=x[n+i-1]+h2; od: > for i from 1 to 2*n do y[i]:=sqrt(a^2*x[i]^2/(x[i]-b)^2-x[i]^2); od: > d1:=[seq([x[i],y[i]],i=1..n)]: > d2:=[seq([x[i],y[i]],i=n+1..2*n)]: > dibu1:=plot(d1): > dibu2:=plot(d2): > display(dibu1,dibu2); > fin; fin 32 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Segundo ejercicio (2.5 puntos) El siguiente algoritmo, basado en la denominada “ordenación Shell”, ordena los elementos del vector x = ( 9, 3, 2, 8, 14, 12, 7, 5, 15, 10, 1, 13, 6, 11, 4): a[1] = 9; a[2] = 5; a[3] = 3; a[4] = 2; a[5] = 1; desde j=1 hasta 5, con paso 1, hacer: k ← a[j] desde i=1 hasta 15, con paso 1, hacer: si i+k ≤ n entonces: si x[i+k] < x[i] entonces: xx ← x[i] x[i] ← x[i+k] x[i+k] ← xx fin condición fin condición fin bucle en i fin bucle en j Escribir x Se pide escribir un programa MAPLE que responda al algoritmo dado. Solución: > restart: > with(plots): with(linalg): Warning, the name changecoords has been redefined Warning, the protected names norm and trace have been redefined and unprotected > n:=15: > x:=vector(15,[9,3,2,8,14,12,7,5,15,10,1,13,6,11,4]): > a:=vector(5,[9,5,3,2,1]): > for w from 1 to 5 by 1 do k:=a[w]; for i from 1 to n by 1 do if((i+k) <= n) then if(x[i+k] < x[i]) then xx:=x[i]; x[i]:=x[i+k]; x[i+k]:=xx; 33 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. fi; fi; od; print(x); od; k := 9 [ 9, 1, 2, 6, 11, 4, 7, 5, 15, 10, 3, 13, 8, 14, 12 ] k := 5 [ 4, 1, 2, 6, 10, 3, 7, 5, 14, 11, 9, 13, 8, 15, 12 ] k := 3 [ 4, 1, 2, 6, 5, 3, 7, 9, 13, 8, 10, 12, 11, 15, 14 ] k := 2 [ 2, 1, 4, 3, 5, 6, 7, 8, 10, 9, 11, 12, 13, 15, 14 ] k := 1 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] > fin; fin Tercer ejercicio (5 Puntos) Se considera el sistema de ecuaciones lineales: [A].{x} = {b} en el que la matriz [A] es simétrica y definida positiva. El método de Lanczos se puede emplear para descomponer la matriz [A] como: [A] = [Q].[ T ].[Q]T donde la matriz [ T ] es tridiagonal y [Q] es una matriz de paso. Se pide que desarrolles el método de Lanczos, siguiendo los siguientes pasos: A) Escribe un procedimiento, llamado Matsim, que con los parámetros de entrada (datos en el momento de utilizarlo) n (número entero estrictamente positivo) y [A] (matriz de dimensiones (n,n) (de la que sólo se conocerá el triángulo superior) genere, por simetría, los elementos del triángulo inferior de la matriz. Así pues, este procedimiento lo que hará es generar una matriz simétrica. Este procedimiento deberá ser grabado en el disquete de trabajo como el fichero Matsim.m B) Escribe un procedimiento, llamado Matelem, que tomando como parámetros de entrada una matriz [A] de dimensiones (n,n), un vector {b} de dimensión n, el 34 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. entero no negativo K, calcule los vectores {alpha}, {beta}de dimensión K y K+1 vectores {qi} de dimensión n. Dichos vectores se generarán mediante el algoritmo siguiente: beta0 = 0, {q0 } = {0}, {q1} = {b} b Para j desde 1 hasta K con paso 1 hacer {v} ← [ A ].{qj } − betan−1. {qj−1} {αn } ← {qj } .{v} T {v} ← {v} − alpha j .{qj } beta j ← v 2 {v } {qj+1} ← beta j Fin del bucle Este procedimiento deberá ser grabado en el disquete de trabajo como el fichero Matelem.m C) Escribe un procedimiento llamado Descomp que, tomando como parámetros de entrada un número entero K, un vector {alpha} de dimensión K, un vector {beta} de dimensión K y los K+1 vectores {qi} (i = 0,...,K) (cada uno de dimensión n), calcule las matrices [ T ] y [Q], cada una de dimensiones (n x K). Dichas matrices se definen como: Matriz [ T ]: Sus elementos son: Ti,i = alphai (i = 1,...,K) Ti,i−1 = betai−1 Ti,i+1 = betai (i = 2,...,K) (i = 1,...,K − 1) Los restantes elementos son nulos. Matriz [Q]: Sus elementos son: Qi,j = {q j }i (j = 1,2,...K; i = 1,2,...,n) Este procedimiento deberá ser grabado en el disquete de trabajo como el fichero Descomp.m 35 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. D) Escribe un programa MAPLE en el que dados un número entero n, una matriz triangular superior [A] de dimensiones (nxn), un vector {b} de n componentes, un número entero positivo K y leyendo del disquete y utilizando los procedimientos anteriores se realice el siguiente proceso: D-1º) Se calcule la parte simétrica de la matriz A, empleando el procedimiento Matsim. D-2º) Se calcule los vectores {alpha}, {beta} y {qi} mediante el procedimiento Matelem. D-3º) Se descomponga la matriz A en las matrices Q y T descritas en el procedimiento Descomp. Como datos a emplear en el apartado D) se considerarán: n = 4, K = 4 A1,1 = 4, A1,2 = 3, A1,3 = 2, A1,4 = 1 A2,2 = 3, A2,3 = 1, A2,4 = -1 A3,3 = 2, A3,4 = 2 A4,4 = 5 ⎧ 1⎫ ⎪2⎪ ⎪ ⎪ b=⎨ ⎬ ⎪3 ⎪ ⎪⎩ 4 ⎪⎭ NOTAS: Los K+1 vectores q, de n componentes cada uno, se envían como parámetro del procedimiento sin más que identificarlos mediante la letra q. Puedes comprobar que, efectivamente, se verifica: [A] = [Q].[ T ].[Q]T Solución: > restart: > with(linalg): Warning, the protected names norm and trace have been redefined and unprotected Procedimiento MATSIM > matsim:=proc(A,n) local i,j; for i from 1 to n do for j from 1 to i do A[i,j]:=A[j,i]; od; od; end: 36 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. Procedimiento MATELEM > matelem:=proc(A,b,n,k,alpha,beta,q) local i, v; beta[0]:=0.; for i from 1 to n do q[0][i]:=0. od; q[1]:=evalm(b/norm(b,2)); for i from 1 to k do v:=evalm(A&*q[i]-beta[i-1]*q[i-1]); alpha[i]:=dotprod(q[i],v); v:=evalm(v-alpha[i]*q[i]); beta[i]:=norm(v,2); q[i+1]:=evalm(v/beta[i]); od; end: Procedimiento DESCOMP > descomp:=proc(k,n,alpha, beta, q, T, Q) local i, j: for i from 1 to k by 1 do for j from 1 to k by 1 do T[i,j]:=0.: if (i=j) then T[i,j]:=alpha[i]: elif (j=i+1) then T[i,j]:=beta[i]: elif (j=i-1) then T[i,j]:=beta[i-1]: fi: od: od: for j from 1 to k by 1 do for i from 1 to n by 1 do Q[i,j]:=q[j][i]: od: od: end: Programa > n:=4: k:=4: > A:=matrix(n,n):T:=matrix(k,k):Q:=matrix(n,k): > A[1,1]:=4.: A[1,2]:=3.: A[1,3]:=2.: A[1,4]:= 1.: A[2,2]:=3.: A[2,3]:=1.: A[2,4]:=-1.: A[3,3]:=2.: A[3,4]:= 2.: A[4,4]:= 5.: > b:=vector(n,[1.,2.,3.,4.]): > alpha:=array(1..k): beta:=array(0..k): 37 Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2004- 2005 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. > for i from 0 to k+1 by 1 do q[i]:=vector(n): od: > matsim(A,n): > matelem(A,b,n,k,alpha,beta,q): > descomp(k,n,alpha, beta, q, > evalm(T); evalm(Q); ⎡6.333333330 2.643650674 ⎢ ⎢2.643650674 1.793852680 ⎢ ⎢ ⎢ 0. 1.744364133 ⎢ ⎢ 0. 0. ⎣ T, Q): 0. 0. ⎤ ⎥ ⎥ 1.744364133 0. ⎥ ⎥ 5.484296121 0.4353970560⎥ ⎥ 0.4353970560 0.3885178704⎥⎦ 0.2703465257 -0.05241575635⎤ ⎡0.1825741858 0.9438389742 ⎢ ⎥ ⎢0.3651483716 -0.3222864785 0.8206006183 -0.2990196149 ⎥ ⎢ ⎥ ⎢ ⎥ ⎢0.5477225574 -0.06906138765 0.03274925127 0.8331614578 ⎥ ⎢ ⎥ ⎢0.7302967432 -0.02302046167 -0.5024488715 -0.4622573355 ⎥ ⎣ ⎦ > > AA:=evalm(Q&*T&*transpose(Q)); evalm(A); 3.000000019 ⎡ 4.000000018 ⎢ ⎢ 3.000000018 3.000000012 AA := ⎢⎢ ⎢ 2.000000022 1.000000009 ⎢ ⎢0.9999999959 -0.9999999847 ⎣ ⎡4. 3. ⎢ ⎢3. 3. ⎢ ⎢ ⎢2. 1. ⎢ ⎢1. -1. ⎣ 2.000000022 0.9999999970 ⎤ ⎥ 1.000000010 -0.9999999856⎥⎥ ⎥ 2.000000002 1.999999996 ⎥ ⎥ 1.999999996 4.999999970 ⎥⎦ 2. 1. ⎤ ⎥ 1. -1.⎥⎥ ⎥ 2. 2. ⎥ ⎥ 2. 5. ⎥⎦ > fin; fin 38