Universidad Politécnica de Madrid – ETSI Minas –...

99
Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003 Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. DEPARTAMENTO DE MATEMÁTICA APLICADA Y MÉTODOS INFORMÁTICOS E.T.S.I. MINAS – UNIVERSIDAD POLITÉCNICA DE MADRID Asignatura: PROGRAMACIÓN Y MÉTODOS NUMÉRICOS Examen de Laboratorio (Grupo 1º - Martes de 16h a 18h) Fecha: 3 – VI – 2003 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 3º) y la fecha de hoy. 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 escribe como primera línea tu nombre y apellidos completos. Además identifica claramente el comienzo y el final de cada uno de los ejercicios. 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 “FromW orksheet”. Si tienes problemas para realizar esta opción pide ayuda al profesor. 7ª. Lee con atención los enunciados de los ejercicios. Si tienes dudas en la comprensiónde los mismos no dudes en solicitar las aclaraciones oportunas al profesor.

Transcript of Universidad Politécnica de Madrid – ETSI Minas –...

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát. DEPARTAMENTO DE MATEMÁTICA APLICADA

Y MÉTODOS INFORMÁTICOS

E.T.S.I. MINAS – UNIVERSIDAD POLITÉCNICA DE MADRID

Asignatura: PROGRAMACIÓN Y MÉTODOS NUMÉRICOS

Examen de Laboratorio (Grupo 1º - Martes de 16h a 18h)

Fecha: 3 – VI – 2003 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 3º) y la fecha de hoy. 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 escribe como primera línea tu nombre y apellidos completos. Además identifica claramente el comienzo y el final de cada uno de los ejercicios. 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 opción pide ayuda al profesor. 7ª. Lee con atención los enunciados de los ejercicios. Si tienes dudas en la comprensiónde 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 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

1

Primer ejercicio (2’5 Puntos) Se considera el sistema de ecuaciones diferenciales en derivadas

parciales:

( )A 0t x

∂ ∂+ =

∂ ∂U UU

siendo 1 2 n(u ,u ,...,u )U un vector de n componentes, y:

1 1 1

1 2 n

2 2 2

1 2 n

n n n

1 2 n

f f f...u u uf f f...u u uA( )... ... ... ...f f f...u u u

⎛ ⎞∂ ∂ ∂ ⎟⎜ ⎟⎜ ⎟⎜∂ ∂ ∂ ⎟⎜ ⎟⎜ ⎟⎜ ⎟⎜ ⎟∂ ∂ ∂ ⎟⎜ ⎟⎜ ⎟⎜ ⎟∂ ∂ ∂= ⎜ ⎟⎜ ⎟⎜ ⎟⎜ ⎟⎟⎜ ⎟⎜ ⎟⎜ ⎟⎜ ∂ ∂ ∂ ⎟⎜ ⎟⎜ ⎟⎜ ⎟⎟⎜∂ ∂ ∂⎝ ⎠⎜ ⎟⎟⎜

U

la matriz jacobiana de una función f respecto de 1 2 n(u ,u ,...,u ) . El sistema se

denomina estrictamente hiperbólico si todos los valores propios de la matriz jacobiana son reales y verifican: 1 2 n...λ λ λ< < < .

En el caso de que haya dos o más valores propios iguales (siendo también reales), el sistema es simplemente hiperbólico. Si alguno de los valores propios es un número complejo, el sistema se denomina elíptico. Se quiere realizar un programa MAPLE para determinar si un sistema es hiperbólico (estricto o no) o elíptico. Para ello, se seguirán los siguientes pasos: Calcula los valores propios de la matriz A(U) y almacenarlos en el vector VP Define el índice ind e inicializarlo a 0.

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

2

Si la parte imaginaria de alguno de los valores propios es no nula1 (sistema elíptico), asignar al índice ind el valor 1. En el caso de que ninguno de los vectores propios tenga parte imaginaria no nula (sistema hiperbólico) se compararán todos los valores propios entre sí. En caso de que haya al menos dos iguales se asignará al índice ind el valor 2 mientras que en caso contrario seguirá valiendo 0. Finalmente, el resultado del programa será: Si ind = 0 escribir: Sistema estrictamente hiperbólico Si ind = 2 escribir: Sistema hiperbólico no estricto Si ind = 1 escribir: Sistema elíptico Datos: Resuelve el ejercicio con las siguientes matrices jacobianas:

2 2 4A 5 3 7

7 4 2

⎛ ⎞⎟⎜ ⎟⎜ ⎟⎜ ⎟= −⎜ ⎟⎜ ⎟⎜ ⎟⎟⎜⎜ ⎟⎝ ⎠

2 2 4

B 5 3 77 4 2

⎛ ⎞⎟⎜ ⎟⎜ ⎟⎜ ⎟= −⎜ ⎟⎜ ⎟⎜ ⎟⎟⎜⎜ ⎟−⎝ ⎠

2 2 2

C 1 1 14 4 4

⎛ ⎞⎟⎜ ⎟⎜ ⎟⎜ ⎟= ⎜ ⎟⎜ ⎟⎜ ⎟⎟⎜⎜ ⎟⎝ ⎠

Solución: > restart:with(linalg): Warning, the protected names norm and trace have been redefined and unprotected > A:=matrix(3,3,[2,2,4,-5,3,7.,7,4,2]);B:=matrix(3,3,[2,2,4,-5,3,7.,-7,4,2]);C:=matrix(3,3,[2,2,2,1,1,1,4,4,4]);

:= A⎡

⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥

2 2 4-5 3 7.7 4 2

:= B⎡

⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥

2 2 4-5 3 7.-7 4 2

1 La parte imaginaria del número z se denota en MAPLE mediante Im(z)

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

3

:= C⎡

⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥

2 2 21 1 14 4 4

Aquí se hace con la matriz A. Para hacerlo con las matrices B y C bastaría con especificarlo en la instrucción que figura a continuación. > VP:=eigenvals(A);

:= VP , ,2.216592361 -4.414404613 9.197812252

> ind := 0: > if (ind=0) then for i from 1 by 1 to 3 do if(Im(VP[i])<>0) then ind := 1: fi: od: fi: > if(ind = 0) then for i from 1 by 1 to 3 do aux := VP[i]: for j from 1 by 1 to 3 do if (i<>j) and (aux=VP[j]) then ind := 2: fi: od: od: fi: > if(ind=1) then print("SISTEMA ELÍPTICO"); elif (ind=2) then print("SISTEMA HIPERBÓLICO NO ESTRICTO"); else print("SISTEMA HIPERBÓLICO ESTRICTO"); fi:

"SISTEMA HIPERBÓLICO ESTRICTO"

> Fin_del_primer_ejercicio; Fin_del_primer_ejercicio

Segundo ejercicio (2’5 Puntos) Se considera el problema de valor inicial definido por:

y (t) f(t,y(t))y(0) α

⎧ ⎫′ =⎪ ⎪⎪ ⎪⎨ ⎬⎪ ⎪=⎪ ⎪⎩ ⎭

Para resolver el problema se va a aplicar un método de predictor-corrector. Un algoritmo de dicho método puede ser el siguiente:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

4

Datos de entrada: a, b, N, alpha, f(t,y)

Calcular: b ahN−

0

0

t aw α

Para i de 1 a 3 con paso 1 HACER:

( )

( )

1 i 1 i 1

12 i 1 i 1

23 i 1 i 1

4 i 1 i 1 3

K h.f t ,w

h KK h.f t ,w2 2h KK h.f t ,w2 2

K h.f t h,w K

− −

− −

− −

− −

⎛ ⎞⎟⎜← + + ⎟⎜ ⎟⎟⎜⎝ ⎠⎛ ⎞⎟⎜← + + ⎟⎜ ⎟⎟⎜⎝ ⎠

← + +

( )i i 1 1 2 3 41w w K 2.K 2.K K6−= + + + +

ti a + i.h Fin del bucle en i Para i de 4 a N con paso 1 HACER: ti a + i.h

( ) ( ) ( ) ( )( )i 1 i 1 i 1 i 2 i 2 i 3 i 3 i 4 i 4hwpred w . 55.f t ,w 59.f t ,w 37.f t ,w 9.f t ,w24− − − − − − − − −← + − + −

( ) ( ) ( ) ( )( )i 1 i i 1 i 1 i 2 i 2 i 3 i 3

i

hwcorr w . 9.f t ,wpred 19.f t ,w 5.f t ,w f t ,w24

w wcorr

− − − − − − −← + + − +

Fin del bucle en i Se pide:

a) Programa en MAPLE el algoritmo anterior aplicándolo al problema:

2y (t) y t 1y(0) 0.5

⎧ ⎫′⎪ ⎪= − +⎪ ⎪⎨ ⎬⎪ ⎪=⎪ ⎪⎩ ⎭

siendo a = 0, b = 2, N = 10. b) Sabiendo que la solución exacta del problema dado en el apartado a)

es:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

5

2 ty(t) (t 1) 0.5e= + −

almacena en un vector de N+1 componentes denominado yexacta el valor que toma dicha función en los puntos ti.

c) Genera dos secuencias en las que se almacenen los valores que toman los vectores w e yexacta y representa ambas secuencias en un mismo gráfico. La secuencia correspondiente a w llevará como símbolos diamantes azules y la correspondiente a yexacta llevará como símbolos cruces rojas.

Solución: > restart:with(linalg):with(plots): > a:=0.:b:=2.:N:=10:alpha:=0.5: > f:= (t,y)-> y-t^2+1: Solución exacta > yex:=t->(t+1)^2-0.5*exp(t): > h:=(b-a)/N: > t[0]:=a:w[0]:=alpha: > for i from 1 by 1 to 3 do K[1]:=h*f(t[i-1],w[i-1]): K[2]:=h*f(t[i-1]+(h/2),w[i-1]+(K[1]/2)): K[3]:=h*f(t[i-1]+(h/2),w[i-1]+(K[2]/2)): K[4]:=h*f(t[i-1]+h,w[i-1]+K[3]): w[i]:=w[i-1]+(K[1]+2*K[2]+2*K[3]+K[4])/6.: t[i]:=a+i*h: od: > for i from 4 by 1 to N do t[i]:=a+i*h: wpred:=w[i-1]+h*(55*f(t[i-1],w[i-1])-59*f(t[i-2],w[i-2])+37*f(t[i-3],w[i-3])-9*f(t[i-4],w[i-4]))/24.: wcorr:=w[i-1]+h*(9*f(t[i],wpred)+19*f(t[i-1],w[i-1])-5*f(t[i-2],w[i-2])+f(t[i-3],w[i-3]))/24.: w[i]:=wcorr: od: El error que se calcula a continuación no se pide en el examen > for i from 0 by 1 to N do yexacta[i]:=yex(t[i]): err[i]:=abs(w[i]-yexacta[i]): od: > for i from 0 by 1 to N do print(t[i],w[i],yexacta[i],err[i]): od;

, , ,0. 0.5 0.5 0.

, , ,0.2000000000 0.8292933334 0.8292986210 0.52876 10-5

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

6

, , ,0.4000000000 1.214076211 1.214087651 0.000011440

, , ,0.6000000000 1.648922018 1.648940600 0.000018582

, , ,0.8000000000 2.127205634 2.127229536 0.000023902

, , ,1.000000000 2.640828598 2.640859086 0.000030488

, , ,1.200000000 3.179902638 3.179941538 0.000038900

, , ,1.400000000 3.732350485 3.732400016 0.000049531

, , ,1.600000000 4.283420828 4.283483788 0.000062960

, , ,1.800000000 4.815096361 4.815176268 0.000079907

, , ,2.000000000 5.305370678 5.305471950 0.000101272

> seqsolapr:=[seq([t[i],w[i]],i=0..N)]: > seqsolex:=[seq([t[i],yexacta[i]],i=0..N)]: > seqerror:=[seq([t[i],log(err[i])],i=0..N)]: > dibapr:=pointplot(seqsolapr,color=blue,symbol=diamond): > dibex:=pointplot(seqsolex,color=red,symbol=cross): > diberr:=pointplot(seqerror,color=brown,symbol=circle): > display(dibapr,dibex);display(diberr);

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

7

> Fin_del_segundo_ejercicio;

Fin_del_segundo_ejercicio

Tercer ejercicio (5 Puntos)

Se quieren obtener los pesos y los puntos del soporte de una fórmula de integración numérica de tipo interpolatorio. Si el intervalo de integración es [a,b] y se denota por pmed al punto medio, se colocarán n puntos equidistantes en el intervalo ]a,pmed[, y otros n puntos equidistantes en el intervalo ]pmed, b[. De esta forma, los puntos de integración serán los extremos a, b, el punto medio (pmed) y los 2.n puntos dispuestos en cada subintervalo. a) Realiza un procedimiento llamado soport que, teniendo como datos de entrada: número de puntos en cada subintervalo (n), extremos izquierdo (a) y derecho (b) del intervalo, permita obtener un vector s en el que se almacenarán los puntos del soporte, tal y como se describieron en el párrafo anterior.

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

8

Este procedimiento se salvará en el diskette de trabajo con el nombre soport.m b) Programa un procedimiento form_integr que, tomando como datos de entrada el número de puntos en cada subintervalo (n), extremos izquierdo (a) y derecho (b) del intervalo y un vector sop en el que están almacenados los puntos del soporte, calcule un vector c en el que se almacenarán los pesos de la fórmula de integración numérica que se obtendrán mediante:

b

i ia

c L (x)dx= ∫

siendo

n

jj 0i j

i n

i jj 0i j

(x x )

L (x)(x x )

=≠

=≠

=−

∏ los polinomios de base de Lagrange que se obtienen

sobre el soporte sop. Este procedimiento se salvará en el diskette de trabajo con el nombre form_integr.m c) Ejecuta los procedimientos anteriores empleando los siguientes datos: a = 1; b = 5; n = 2. d) A partir de los puntos del soporte y los pesos obtenidos en los procedimientos anteriores, aproxima el valor de la integral:

52 x

1

x .e dx∫

para ello, aplica la fórmula: (nºpuntos soporte) 1

i ii 0

valint c .f(s )−

=

= ∑ .

Para evaluar el sumatorio puedes aplicar la instrucción sum( ). Solución: A) > restart:with(linalg):with(plots):

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

9

> soport:=proc(n,a,b,s) local h,pmed,i: pmed:=(a+b)/2.: h := (pmed-a)/(n+1): for i from 0 by 1 to n do s[i]:=a+i*h: od: s[n+1]:=pmed: for i from 1 by 1 to n+1 do s[n+1+i]:=pmed+i*h: od: end: > save soport, "A:/soport.m": > n:=2:a:=1.:b:=5.: > s := array(0..2*n+2): > soport(n,a,b,s): > form_integr(n,a,b,s,c): > fin;

fin

B) > restart; > form_integr:=proc(n,a,b,sop,c) local i,pbas: pbas:= array(0..2*n+2): for i from 0 by 1 to 2*n+2 do pbas[i]:=mul((x-sop[j])/(sop[i]-sop[j]),j=0..i-1)*mul((x-sop[j])/(sop[i]-sop[j]),j=i+1..2*n+2): c[i]:=int(pbas[i],x=a..b): od: end: > save form_integr, "A:/form_integr.m": > fin;

fin

C) > restart: > n:=2:a:=1.:b:=5.: > s := array(0..2*n+2): > soport(n,a,b,s): > print(s);

.. 0 6array( , [ = ( )0 1. = ( )1 1.666666667 = ( )2 2.333333333

= ( )3 3.000000000 = ( )4 3.666666667 = ( )5 4.333333333 = ( )6 5.000000000

])

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

10

> form_integr(n,a,b,s,c): > print(c);

= 0 0.1952380953 = 1 1.028571430 = 2 0.1285714250 = 3 1.295238097table([ , , , , = 5 1.028571430 = 4 0.1285714264, , = 6 0.1952380953

]) Aplicación al cálculo de la integral

> f:=x-> x^2 * exp(x); := f → x x2 ex

> valint := evalf(sum('c[i]*f(s[i])',i=0..2*n+2)); := valint 2520.745051

Aunque no se pide en el examen, comparamos el resultado obtenido con el valor exacto de la integral > valexac:=evalf(int(f(x),x=1..5));

:= valexac 2520.305423

> Fin_del_tercer_ejercicio; Fin_del_tercer_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

11

Examen de Laboratorio (Grupo 2º) Fecha: 3 – VI – 2003

Primer ejercicio (2’5 Puntos) Se desea obtener la solución de la ecuación diferencial:

2

2

u uG 0t x

∂ ∂− =

∂ ∂

mediante un método en diferencias finitas. Para ello, se aproximará la ecuación anterior por medio del esquema explícito en tiempo:

i,n 1 i,n i 1,n i,n i 1,n2

u u u 2u uG 0

k h+ + −− − +

− =

siendo l,mu el valor de la solución en el nodo l y en el instante m.

Operando la expresión anterior, resulta:

( )i,n 1 i,n i 1,n i,n i 1,nu u r u 2u u+ + −= + − + (i=2, 3,..., nnode-1) (1)

siendo: 2

G.krh

= (2)

Se pide: a) Realiza un programa MAPLE que permita obtener el valor de i,n 1u + a partir de

i 1,nu+ , i,nu , i 1,nu− de acuerdo con la expresión (1). Dicha solución quedará

almacenada en un array u de dimensiones (número de nodos, número de instantes de tiempo). Para ello se seguirán los siguientes pasos: 1º Definir un instante inicial (TINIC), un instante final (TMAX), el paso de cálculo k, el intervalo [a,b] en el que se resolverá la ecuación, el número de nodos sobre el intervalo [a,b] y el coeficiente G. 2º Calcular el valor de la distancia entre dos nodos consecutivos h, teniendo en cuenta que el primer nodo se hará coincidir con el extremo a y el último con el extremo b.

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

12

3º Calcular el número de instantes de tiempo: TMAX TINICNTk−

= .

4º Obtener el valor r que aparece en la fórmula (2). 5º Imponer la solución inicial en cada nodo: i,0u 1 (i 1,2,...,nnode)= =

6º Imponer las condiciones siguientes en los extremos del dominio:

1,j

nnode,j

u 0 ( j 1,2,...,NT)

u 0 ( j 1,2,...,NT)

= =

= =

7º Evaluar la fórmula (1) mientras j NT≤ y para cada uno de los nodos i (i =

2,3,...,nnode-1). b) Almacena en sendas secuencias los puntos ui,2 y ui,3 (i=1,2,...,nnode) y represéntalas gráficamente (con el número de nodo en abscisas y el valor de la solución en ordenadas). Solución: > restart:with(linalg):with(plots): El ejercicio lo resolvemos, a modo de ejemplo, con los siguientes datos. Algunos de ellos se dejaban abiertos en el examen. > a:=0: b:=10:nnode:=10:h:=(b-a)/(nnode-1): > TINIC:=0:TMAX:=5:G:=1.:k:=1:NT := (TMAX-TINIC)/k;

:= NT 5

> r:=G*k/(h*h): > u:=array(1..nnode,1..NT): > for i from 1 by 1 to nnode do u[i,1]:=1.: od: for j from 1 by 1 to NT do u[1,j]:=0.:u[nnode,j]:=0.: od: j:=2: while (j<= NT) do for i from 2 by 1 to nnode-1 do sol:=u[i,j-1]+r*(u[i+1,j-1]-2*u[i,j-1]+u[i-1,j-1]): u[i,j]:=sol: od: j := j+1:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

13

od: > evalm(u);

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

0. 0. 0. 0. 0.1. 0.1900000000 0.6922000000 -0.1506050000 1.0309209401. 1. 0.3439000000 1.157464000 -0.4600849401. 1. 1. 0.4685590000 1.4570392601. 1. 1. 1. 0.56953279001. 1. 1. 1. 0.56953279001. 1. 1. 0.4685590000 1.4570392601. 1. 0.3439000000 1.157464000 -0.4600849401. 0.1900000000 0.6922000000 -0.1506050000 1.0309209400. 0. 0. 0. 0.

>seqdibu1:=[seq([i,u[i,2]],i=1..nnode)]:seqdibu2:=[seq([i,u[i,3]],i=1..nnode)]: > dibu1:=pointplot(seqdibu1,symbol=diamond,color=blue): dibu2:=pointplot(seqdibu2,symbol=cross,color=red): > display(dibu1,dibu2);

> Fin_del_primer_ejercicio;

Fin_del_primer_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

14

Segundo ejercicio (2’5 Puntos)

Uno de los diversos métodos numérico que permiten aproximar una

integral doble: d(x)b

a c(x)

f(x,y)dxdy∫ ∫ es la fórmula de Simpson.

Un algoritmo de dicho método es el siguiente: Datos: a, b, m, n, c(x), d(x), f(x,y)

b ah2.n−

J1 0 J2 0 J3 0 Para i desde 0 hasta 2.n con paso 1 HACER: x a + i.h

d(x) c(x)HX2.m

K1 f(x,c(x)) f(x,d(x))K2 0K3 0

−←

← +←

Para j desde 1 hasta 2.m-1 con paso 1 HACER: y c(x) + j.HX Q f(x,y) Si (j es par)2 entonces K2 K2 + Q Si no K3 K3 + Q Fin condición

Fin del bucle en j

( )HXL K1 2.K2 4.K33

← + +

2Para analizar en Maple si un número “j” es par se puede emplear la instrucción: resp type(j,even) si (resp = 'true') entonces Instrucciones Maple Fin condición

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

15

Si (i=0) O (i = 2.n) entonces J1 J1 + L

Si no Si (i es par) 1 entonces J2 J2 + L Si no J3 J3 + L Fin condición Fin condición Fin del bucle en i

( )hJ J1 2.J2 4.J33

← + +

Salida: Escribir J Se pide: Realizar un programa MAPLE a partir del algoritmo anterior y aplicarlo a la resolución de la integral:

2

3

0.5 xy / x

0.1 x

e dxdy∫ ∫

con m = n = 5. Solución: > restart:with(linalg):with(plots): > a:=0.1:b:=0.5:m:=5:n:=5:c:=x->x^3:d:=x->x^2: > f:=(x,y)->exp(y/x): > > h:=(b-a)/(2*n): > J1:=0.:J2:=0.:J3:=0.: > for i from 0 by 1 to 2*n do x[i]:=a+i*h: HX:=(d(x[i])-c(x[i]))/(2*m): K1:=f(x[i],c(x[i]))+f(x[i],d(x[i])): K2:=0: K3:=0: for j from 1 by 1 to 2*m-1 do

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

16

y[i]:=c(x[i])+j*HX: Q:=f(x[i],y[i]): resp:=type(j,even): if (resp = 'true') then K2:=K2+Q: else K3:=K3+Q: fi: od: L:=(K1+2*K2+4*K3)*HX/3.: if (i=0) or (i=2*n) then J1:=J1+L: else resp1:=type(i,even): if (resp1 = 'true') then J2:=J2+L: else J3:=J3+L: fi: fi: od: J:=h*(J1+2*J2+4*J3)/3.: > evalf(J);

0.03330546128

Aunque no se pide en el examen, comprobamos la solución obtenida con la exacta > int(int(exp(yy/xx),yy=xx^3..xx^2),xx=0.1..0.5);

0.03330556612

> Fin_del_segundo_ejercicio; Fin_del_segundo_ejercicio

Tercer ejercicio (5 Puntos) A) Realiza un procedimiento llamado valprop que teniendo como datos de entrada el entero na, dos matrices mat1 y mat2 de dimensiones (1,na) permita obtener una matriz matinv ((inversa de mat1).mat2) una variable ind (que valdrá 1 si los valores propios de matinv son todos reales y 0 en caso contrario). En este procedimiento se seguirán los siguientes pasos:

• Cálculo de la matriz matinv • Cálculo de los valores propios de matinv • A la variable ind se le asigna el valor 0

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

17

• Si la parte imaginaria3 de algún valor propio es < 10-7 a ind se le asigna el valor 1

Este procedimiento se salvará en el diskette de trabajo con el nombre valprop.m B) Realiza un procedimiento llamado potencia que teniendo como datos de entrada una matriz mataux permita obtener una variable r (valor propio de mayor valor absoluto) y un vector q (vector propio asociado a al valor propio r). Para ello deberás seguir el siguiente algoritmo: q (1, -1, 0) Para i desde 1 hasta 15 HACER:

← •

2

2

2

xrq

x mataux q

xqx

Fin bucle en i Este procedimiento se salvará en el diskette de trabajo con el nombre potencia.m C) Ejecutar los procedimientos anteriores. Para ello, se generarán dos matrices simétricas A y B de dimensiones (1,na) a partir de los elementos: A1,1 1, A1,2 3, A1,3 2 , A2,2 4, A2,3 -3 , A3,3 5 y: B1,1 2, B1,2 1, B1,3 5 , B2,2 3, B2,3 1 , B3,3 14 Las matrices A y B serán las que se introduzcan como mat1 y mat2 en el procedimiento valprop. El resultado del programa será:

• Si ind=0 se escribirá: “valores propios imaginarios Si ind=1 se escribirá: “valores propios reales”

• El valor propio de mayor valor absoluto: r

3 La parte imaginaria del número z se denota en MAPLE mediante Im(z)

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

18

• El vector propio asociado: q Solución: A) > restart:with(linalg):with(plots): > valprop:=proc(na,nb,mat1,mat2,ind,matinv) local i,VP: matinv:=array(1..na,1..na): matinv:=evalm(inverse(mat1)&*mat2): VP:=eigenvals(matinv): ind := 0: for i from 1 by 1 to na do if (abs(evalf(Im(VP[i]))) <1.*10^(-7)) then ind:=1: fi: od: end: > save valprop, "A:/valprop.m": > Fin_del_procedimiento_valprop;

Fin_del_procedimiento_valprop

B) > restart; > potencia:=proc(mataux,r,q) local i, x: q:=vector(3,[1,-1,0]): for i from 1 by 1 to 15 do x:=evalm(mataux&*q): r:=(x[2])/(q[2]): q:=evalm(x/norm(x,2)): od: end: > save potencia, "A:/potencia.m": > Fin_del_procedimiento_potencia;

Fin_del_procedimiento_potencia

C) > restart:with(linalg): > read "A:/valprop.m": > read "A:/potencia.m": > na:=3: > A:=array(1..na,1..na):B:=array(1..na,1..na): > A[1,1]:=1:A[1,2]:=3:A[1,3]:=2:A[2,2]:=4:A[2,3]:=-3:A[3,3]:=5:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

19

> B[1,1]:=2:B[1,2]:=1:B[1,3]:=5:B[2,2]:=3:B[2,3]:=1:B[3,3]:=14: > for i from 1 by 1 to na do for j from 1 by 1 to na do A[j,i]:=A[i,j]: od: od: > evalm(A);

⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥

1 3 23 4 -32 -3 5

> for i from 1 by 1 to na do for j from 1 by 1 to na do B[j,i]:=B[i,j]: od: od: > evalm(B);definite(B, 'positive_def');det(B);

⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥

2 1 51 3 15 1 14

true

3

> valprop(na,nb,A,B,ind,matinv): > ind;evalm(matinv);

1

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

4243

6986

10243

-243

986

-1143

2543

-586

7343

> potencia(matinv,r,q): > > evalf(r);evalf(evalm(q));

2.545262573

[ ], ,0.8199012018 -0.07511384616 0.5675561024

> evalf(eigenvals(matinv));

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

20

− 2.545262572 0.11 10-9 I − -0.0485406640 0.8160254040 10-9 I, , + 0.2823478584 0.916025404010-9 I

> if(ind=0) then print("valores propios imaginarios"); else print("valores propios reales"); fi;

"valores propios reales"

> Fin_del_tercer_ejercicio; Fin_del_tercer_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

21

Examen de Laboratorio (Grupo 3º) Fecha: 3 – VI – 2003

Primer ejercicio (2’5 puntos) Una familia de curvas sobre las que trabajó el matemático francés Pierre de Fermat (1601 – 1665) es la formada por las llamadas espirales de Fermat. Dichas curva, en coordenadas polares responden a la expresión 2 2k ·ρ = θ ,

donde k es una constante real. Se pide que obtengas (2·n+1)) puntos de una espiral de Fermat. Para ello selecciona n valores { }0 1 n, ,.....,θ θ θ uniformemente

repartidos en el intervalo [0, b] y, para cada uno de ellos, calcula los puntos Pi ≡ (xi, yi) y Mi ≡ (-xi, -yi), donde

xi = i ik· ·cos( )θ θ , yi = i ik· ·sen( )θ θ (i = 0, 1, ..., n)

Una vez calculados, representa en una misma figura los puntos Pi (en color rojo) y los puntos Mi (en color azul). Asimismo, obtén una aproximación de la longitud del tramo de espiral de Fermat dibujado mediante la expresión:

n2 2

i i 1 i i 1i 1

Long 2· (x x ) (y y )− −=

≈ − + −∑

Utiliza el programa que escribas para la espiral de Fermat correspondiente al valor k = 1 , dibujando el tramo correspondiente a valores de θ∈[0, 6·π] y calculando un número de puntos correspondiente a n = 500. Solución: > restart; > with(plots): Warning, the name changecoords has been redefined > n:=500:k:=1: > xp:=array(0..n): yp:=array(0..n): xm:=array(0..n): ym:=array(0..n): > xp[0]:=0:yp[0]:=0: xm[0]:=0:ym[0]:=0: > h:=evalf(6*Pi/n): for i from 1 to n by 1 do theta:=i*h: r:=k*sqrt(theta): xp[i]:=r*cos(theta): yp[i]:=r*sin(theta): xm[i]:=-xp[i]: ym[i]:=-yp[i]: od: > pp:=[seq([xp[j],yp[j]],j=0..n)]:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

22

pm:=[seq([xm[j],ym[j]],j=0..n)]: > dp:=pointplot(pp,connect=true,color=red): dm:=pointplot(pm,connect=true,color=blue): > display(dp,dm,scaling=constrained);

> sumap:=0:sumam:=0: for i from 1 to n by 1 do sumap:=sumap+sqrt((xp[i]-xp[i-1])^2+(yp[i]-yp[i-1])^2): sumam:=sumam+sqrt((xm[i]-xm[i-1])^2+(ym[i]-ym[i-1])^2): od: > Longitud:=sumap+sumam;

:= Longitud 110.7419270

> fin_del_primer_ejercicio: Segundo ejercicio (2.5 puntos) Programa en MAPLE el siguiente algoritmo que permite obtener la función spline cúbica que interpola a una cierta función f(x) de la que se conoce su valor en los (n+1) puntos de un soporte {s1, s2, ..., sn, sn+1 } y además se conoce

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

23

el valor f’(sn+1). En dicho algoritmo el polinomio de grado menor o igual que 3 p(i)(x) = ai + bi·(x-xi)+ ci·(x-xi)+ di·(x-xi)3 es el tramo de función spline cúbica sobre el intervalo Ii = [xi, xi+1] (i = 1, .., n). En el algoritmo se denotan por {f1, f2, ..., fn, fn+1 } los valores conocidos de la función y por fp el valor f’(sn+1) y se calculan los coeficientes {ai, bi, ci, di} (i = 1, ..., n). ALGORITMO Datos: n, {s1, s2, ..., sn, sn+1 }, {f1, f2, ..., fn, fn+1 } y fp bn+1 fp Para i desde 1 hasta n con paso 1 hacer: hi si+1 - si ∆i (fi+1 – fi) / hi Fin bucle en i. b1 ∆1 Para i desde 2 hasta n con paso 1 hacer: Si (∆i·∆i-1 < 0) entonces: bi 0 si no:

( )

+←

+i 1 i

i 1 i

h 2·hr3· h h

∆ ∆←

∆ + − ∆i 1 i

ii i 1

·br· (1 r)·

fin condición. Fin bucle en i. Para i desde 1 hasta n con paso 1 hacer: ai fi

+∆ − −← i i i 1

ii

3· 2·b bch

−+ − ∆← i i 1 i

i 2i

b b 2·dh

→ + − + − + −(i) 2 3i i i i i i ip : x a b ·(x s ) c ·(x s ) d ·(x s )

dibui dibujo de pi(x) en el intervalo [si , si+1] Fin bucle en i. dibuf dibujo de f(x) en el intervalo [s1 , sn+1] Representar en un mismo gráfico los dibujos dibui (i = 1..., n) todos ellos en rojo

y el dibujo dibuf en color azul.

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

24

FIN ALGORITMO Utlícese el algoritmo anterior para la función de Runge f(x) = (1+x2)-1 con el soporte {s1= -1, s2 = 0, s3 = 1, s4 = 1.5, s5 = 2.3, s6 = 3, s7 = 4, s8 = 5} . Solución: > restart; > with(plots): Warning, the name changecoords has been redefined > n:=7: s:=vector((n+1),[-1.,0.,1.,1.5,2.3,3.,4.,5.]); ff:=x->(1+x^2)^(-1);

:= s [ ], , , , , , ,-1. 0. 1. 1.5 2.3 3. 4. 5.

:= ff → x 1 + 1 x2

> f:=vector(n+1): for i from 1 to n+1 by 1 do f[i]:=ff(s[i]): od: > fp:=D(ff)(s[n+1]);

:= fp -0.01479289941

> a:=vector(n): b:=vector(n+1): c:=vector(n): d:=vector(n): h:=vector(n): delta:=vector(n): > for i from 1 to n by 1 do h[i]:=s[i+1]-s[i]: delta[i]:=(f[i+1]-f[i])/h[i]: od: > b[n+1]:=fp: b[1]:=delta[1]: > for i from 2 to n by 1 do if (delta[i]*delta[i-1] < 0) then b[i]:=0: else r:=(h[i]+2*h[i-1])/(3*(h[i]+h[i-1])): b[i]:=delta[i]*delta[i-1]/(r*delta[i]+(1-r)*delta[i-1]): fi: od: > for i from 1 to n by 1 do a[i]:=f[i]:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

25

c[i]:=(3*delta[i]-2*b[i]-b[i+1])/h[i]: d[i]:=(b[i]+b[i+1]-2*delta[i])/h[i]^2: p[i]:=x->a[i]+b[i]*(x-s[i])+c[i]*(x-s[i])^2+d[i]*(x-s[i])^3: dibu[i]:=plot(p[i](x),x=s[i]..s[i+1],color=red): od: > dibuf:=plot(ff(x),x=s[1]..s[n+1],color=blue,thickness=3): > display(seq(dibu[i],i=1..n),dibuf);

> fin_del_segundo_ejercicio;

fin_del_segundo_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

26

Tercer ejercicio (5 puntos) Sea [A] una matriz cuadrada a cuyos elementos los denotaremos por Ai,j (1 < i,j < n). Se pide:

a) Escribir un procedimiento MAPLE en el que dados el valor de n, un valor del índice de columna r y la matriz [A], se determine el valor del índice de fila ifil en el que se encuentra el elemento de mayor valor absoluto entre {Ar, r, Ar+1,r, ...., Ar,r}. A dicho procedimiento se le denominará mayor y se salvará en el disquete de trabajo con el nombre mayor.m.

b) Escribir un procedimiento MAPLE en el que dados el valor de n, la matriz

identidad de dimensiones (n, n), [Id], un índice de fila ifil y un índice de columna icol, se evalúe una matriz [P] que si ifil < icol deberá coincidir con la matriz identidad [Id] mientras que en el caso contrario será la matriz resultante de intercambiar las filas ifil e icol en la matriz [Id]. Este procedimiento se nombrará como procedimiento matrizP y se salvará en el disquete de trabajo con el nombre matrizP.m.

c) Escribir un procedimiento MAPLE en el que dados el valor de n, el valor

del índice icol, la matriz identidad [Id], de dimensiones (n, n) y la matriz [A] se construya una matriz [G] en la que sus elementos coinciden con los de la matriz [Id] salvo aquellos que están por debajo de la diagonal en la columna (icol+1) que en lugar de ser nulos toman el valor:

d)

i ,icolicol 1,icol

icol 1,icoli ,icol 1

icol 1,icol

Asi A 0

AG0 si A 0

+++

+

⎧≠⎪= ⎨

⎪ =⎩

A este procedimiento se le asignará el nombre matrizG y se salvará en el disquete de trabajo con el nombre matrizG.m.

e) Escribir un programa MAPLE en el que dado el valor de n (mayor que 3)

y una matriz [A] de dimensiones (n, n) se utilicen los procedimientos anteriores para realizar el proceso siguiente:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

27

Para i =1, 2, ..., (n-2)

Buscar la fila ifili en la que se encuentra el elemento de mayor valor absoluto de la i-ésima columna de [A]. Construir la matriz [P] resultante de ejecutar el procedimiento matrizP para el índice de fila ifili y el índice de columna i. Evaluar una nueva matriz, también llamada [A] mediante la operación: [A] [P]-1·[A]·[P]. Construir la matriz [G] resultante de ejecutar el procedimiento matrizG para el índice de columna i. Evaluar una nueva matriz, también llamada [A] mediante la operación: [A] [G]-1·[A]·[G].

Fin del bucle en i. Una vez realizado el bucle anterior deberá escribirse la matriz [A] resultante, que deberá tener todas sus subdiagonales menos la primera con todos sus elementos nulos (o muy próximos a 0). Aplíquese este programa a la matriz:

:= A

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1. 2. 3. 4. 5.7. -6. 2. -1. 4.-1. 2.1 3.2 -4.3 5.41.7 2.6 -3.2 4.1 5.61. 1. 1. 1. 1.

Solución: a) > restart;

> mayor:=proc(n,r,A,ifil) local aux, iaux,i: aux:=abs(A[r,r+1]): iaux:=r+1: for i from (r+2) to n by 1 do

if (abs(A[i,r])>aux) then aux:=abs(A[i,r]): iaux:=i: fi:

od:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

28

ifil:=iaux: end proc: > save mayor,"mayor.m": > fin_del_primer_procedimiento;

fin_del_primer_procedimiento

b)

> restart; > matrizP:=proc(n,Id, ifil, icol, P)

P:=evalm(Id): if (icol+1 < ifil) then P[ifil, icol+1]:=1: P[icol+1, ifil]:=1: P[icol+1, icol+1]:=0: P[ifil, ifil]:=0: fi:

end proc: > save matrizP, "matrizP.m": > fin_del_segundo_procedimiento;

fin_del_segundo_procedimiento

c)

> restart; > matrizG:=proc(n, icol, Id, A, G)

local i: G:=evalm(Id): for i from (icol+2) to n by 1 do if (A[icol+1,icol] = 0) then G[i, icol+1]:=0: else G[i, icol+1]:=A[i,icol]/A[icol+1, icol]: fi: od:

end proc: > save matrizG, "matrizG.m": > fin_del_tercer_procedimiento;

fin_del_tercer_procedimiento

d) > restart; > with(linalg): Warning, the protected names norm and trace have been redefined and unprotected

> read "mayor.m": read "matrizP.m": read "matrizG.m":

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

29

> n:=5: A:=matrix(5,5,[[1.,2.,3.,4.,5.],[7.,-6.,2.,-1.,4.], [-1.,2.1,3.2,-4.3,5.4],[1.7, 2.6, -3.2, 4.1,5.6],[1.,1.,1.,1.,1.]]);

:= A

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1. 2. 3. 4. 5.7. -6. 2. -1. 4.-1. 2.1 3.2 -4.3 5.41.7 2.6 -3.2 4.1 5.61. 1. 1. 1. 1.

> Id:=matrix(n,n): for i from 1 to n by 1 do

for j from 1 to n by 1 do if (i = j) then Id[i,j]:=1: else Id[i,j]:=0: fi: od:

od: > for i from 1 to (n-2) by 1 do

mayor(n,i,A,ifil[i]): P:=matrix(n,n): matrizP(n,Id, ifil[i], i, P): ifil[i]; evalm(P); A:=evalm(P&*A&*P): G:=matrix(n,n): matrizG(n, i, Id, A, G): evalm(G); A:=evalm(inverse(G)&*A&*G);

od; 2

:= P ( )array , ,.. 1 5 .. 1 5 [ ] 2

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1 0 0 0 00 1 0 0 00 0 1 0 00 0 0 1 00 0 0 0 1

:= A

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1. 2. 3. 4. 5.7. -6. 2. -1. 4.-1. 2.1 3.2 -4.3 5.41.7 2.6 -3.2 4.1 5.61. 1. 1. 1. 1.

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

30

:= G ( )array , ,.. 1 5 .. 1 5 [ ] 0.1428571429

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1 0 0 0 00 1 0 0 00 -0.1428571429 1 0 00 0.2428571429 0 1 00 0.1428571429 0 0 1

:= A

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1. 3.257142858 3. 4. 5.7. -5.957142857 2. -1. 4.0. 0.5189795919 3.485714286 -4.442857143 5.9714285720. 6.299591837 -3.685714286 4.342857143 4.6285714280. 2.093877552 0.7142857142 1.142857143 0.4285714284

4 := P ( )array , ,.. 1 5 .. 1 5 [ ]

0 4

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1 0 0 0 00 1 0 0 00 0 0 1 00 0 1 0 00 0 0 0 1

:= A

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1. 3.257142858 4. 3. 5.7. -5.957142857 -1. 2. 4.0. 6.299591837 4.342857143 -3.685714286 4.6285714280. 0.5189795919 -4.442857143 3.485714286 5.9714285720. 2.093877552 1.142857143 0.7142857142 0.4285714284

:= G ( )array , ,.. 1 5 .. 1 5 [ ] 0.3323830505

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1 0 0 0 00 1 0 0 00 0 1 0 00 0 0.08238305041 1 00 0 0.3323830505 0 1

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

31

:= A

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1. 3.257142858 5.909064403 3. 5.7. -5.957142857 0.4942983028 2. 4.0. 6.299591837 5.577675448 -3.685714286 4.6285714280. 0. -2.630397640 3.789354672 5.5901127390. 0. -0.5097727225 1.939354672 -1.109887263

4 := P ( )array , ,.. 1 5 .. 1 5 [ ]

4

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1 0 0 0 00 1 0 0 00 0 1 0 00 0 0 1 00 0 0 0 1

:= A

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1. 3.257142858 5.909064403 3. 5.7. -5.957142857 0.4942983028 2. 4.0. 6.299591837 5.577675448 -3.685714286 4.6285714280. 0. -2.630397640 3.789354672 5.5901127390. 0. -0.5097727225 1.939354672 -1.109887263

:= G ( )array , ,.. 1 5 .. 1 5 [ ] 0.1938006310

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1 0 0 0 00 1 0 0 00 0 1 0 00 0 0 1 00 0 0 0.1938006310 1

:= A

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1. 3.257142858 5.909064403 3.969003155 5.7. -5.957142857 0.4942983028 2.775202524 4.0. 6.299591837 5.577675448 -2.788694223 4.6285714280. 0. -2.630397640 4.872722048 5.5901127390. 0. -0.1 10-9 0.7799212130 -2.193254639

> evalm(A); ⎡

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

1. 3.257142858 5.909064403 3.969003155 5.7. -5.957142857 0.4942983028 2.775202524 4.0. 6.299591837 5.577675448 -2.788694223 4.6285714280. 0. -2.630397640 4.872722048 5.5901127390. 0. -0.1 10-9 0.7799212130 -2.193254639

> fin_del_ejercicio; fin_del_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

32

Examen de Laboratorio (Grupo 4º) Fecha: 3 – VI – 2003

Primer ejercicio (2’5 puntos) Los polinomios de Bernoulli, llamados así en honor del matemático suizo Jacob Bernoulli (1654-1705), pueden obtenerse mediante la fórmula de recurrencia:

Bk(x) = k·x

k 10

B (t)·dt−∫ + bk (k = 1, 2, 3…) (I)

donde el primer polinomio de Bernoulli es: B0(x)=b0 = 1

y las constantes bk (k = 1, 2, 3....) son llamadas los números de Bernoulli y pueden ser obtenidos, a su vez, por la fórmula de recurrencia:

bk = k 1

ii 0

1 (k 1)!· ·b(k 1) i!·(k 1 i)!

=

⎛ ⎞− +⎜ ⎟+ + −⎝ ⎠

∑ (k = 1, 2, ..) (II)

El conocimiento de los polinomios de Bernoulli le dio enorme fama a Jacob Bernoulli pues le permitía presumir de poder calcular en menos de 15 minutos la suma de las potencias décimas de todos los enteros comprendidos entre 0 y cualquier valor m < 1000. Para poder lograr esta proeza Jacob Bernoulli utilizaba el hecho (hasta entonces sólo conocido por él) de que;

+ +

=

+ −=

+∑m

k k 1 k 1

j 0

B (m 1) B (0)j(k 1)

(III)

Se pide que escribas un programa en MAPLE que, a) Utilizando la fórmula (II) calcule, a partir del número de Bernoulli b0 = 1,

los valores de b1, b2, ..., b20. b) Calcule los polinomios de Bernoulli B1(x), B2(x), ..., B20(x), a partir de

B0(x) y utilizando la expresión (I), y sabiendo que en MAPLE el valor de

la integral x

0

f(t)·dt∫ se calcula mediante la instrucción:

> int(f(t), t = 0..x):

c) Dibuje los grafos de polinomios de Bernoulli B3(x), B4(x), B5(x) y B6(x) en el segmento [0, 1]. Todos los grafos se representarán en un mismo dibujo en los colores rojo, azul, verde y negro respectivamente.

d) Calcule, utilizando la expresión (III) el valor de 1000

10

j 0j

=∑

En el desarrollo de este ejercicio deberá hacerse que MAPLE trabaje con, al menos, 40 dígitos significativos. Solución:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

33

a) > restart; > with(plots): Warning, the name changecoords has been redefined > Digits:=40: > n:=20;

:= n 20 > b:=array(0..n): > b[0]:=1: > for k from 1 to n by 1 do

suma:=0: for i from 0 to k-1 by 1 do suma:=suma + ((k+1)!/(i!*(k+1-i)!))*b[i]: od: b[k]:=-suma/(k+1):

od: b) > pb[0]:=x->1:

> for k from 1 to n by 1 do aux:=k*int(pb[k-1](t),t=0..x)+b[k]: pb[k]:=unapply(aux,x):

od: c) > dib3:=plot(pb[3](x),x=0..1,color=red):

dib4:=plot(pb[4](x),x=0..1,color=blue): dib5:=plot(pb[5](x),x=0..1,color=green): dib6:=plot(pb[6](x),x=0..1,color=black): > display(dib3,dib4,dib5,dib6);

d) > pb[11](x);

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

34

− + − + − + x11 112 x10 55

6 x9 11 x7 11 x5 112 x3 5

6 x

> suma:=(pb[11](10001)-pb[11](0))/(11); := suma 9095909924242414242424342424241924242425000

> fin_del_primer_ejercicio; fin_del_primer_ejercicio

Segundo ejercicio (2’5 puntos) Escribe un programa MAPLE que permite integrar en el intervalo [a, b]una función f(x) dada mediante la fórmula de Simpson compuesta adaptando el número de puntos del soporte utilizado. Dicho programa debe seguir el siguiente algoritmo: ALGORITMO Datos: n, eps, maxiter, a, b y la función f(x) h (b-a) / n Para i desde 1 hasta (n+1) con paso 1 hacer: si a + (i-1)·h Fin bucle en i. V1 f(s1) + f(sn+1) V2 0 V3 0 Para i desde 2 hasta (n-1) con paso 2 hacer: V2 V2 + f(si) V3 V3 + f(si+1) Fin bucle en i. VA h·(V1 + 4·V2 + 2·V3) / 3 iter 1 tol 2·eps

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

35

Mientras ((iter < maxiter) Y (tol > eps)) hacer n 2·n

h (b-a) / n Para i desde 1 hasta (n+1) con paso 1 hacer:

si a + (i-1)·h Fin bucle en i. V1 f(s1) + f(sn+1) V2 0 V3 0 Para i desde 2 hasta (n-1) con paso 2 hacer:

V2 V2 + f(si) V3 V3 + f(si+1) Fin bucle en i. VN h·(V1 + 4·V2 + 2·V3) / 3 tol | VA – VN| Si (tol > eps) entonces: VA VN Fin condición. iter iter + 1

Fin bucle condicional. Escribir (iter-1), VN. FIN ALGORITMO Verificar el funcionamiento del programa escrito con la función f(x) = (1+x2)-1, con n = 4, maxiter = 10 , eps = 10-6 , a = -5 y b = 5. Solución: > restart; > n:=4:maxiter:=10:eps:=1.*10^(-6):a:=-5.:b:=5.:f:=x->(1+x^2)^(-1);

:= f → x 1 + 1 x2

> H:=(b-a)/n: > for i from 1 to (n+1) by 1 do s[i]:=a+(i-1)*H: od: > V1:=f(s[1])+f(s[n+1]): V2:=0:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

36

V3:=0: for i from 2 to (n-1) by 2 do V2:=V2+f(s[i]): V3:=V3+f(s[i+1]): od: VA:=H*(V1+4*V2+2*V3)/3.;

:= VA 2.190539346

> iter:=1: tol:=2*eps: while ((iter<maxiter) and (tol > eps)) do n:=2*n: H:=(b-a)/n: for i from 1 to (n+1) by 1 do s[i]:=a+(i-1)*H: od: V1:=f(s[1])+f(s[n+1]): V2:=0: V3:=0: for i from 2 to (n-1) by 2 do V2:=V2+f(s[i]): V3:=V3+f(s[i+1]): od: VN:=H*(V1+4*V2+2*V3)/3.; tol:= abs(VA - VN): if (tol > eps) then VA:=VN: fi: iter:=iter+1: od: > (iter-1);VN;

9 2.746550660

Comprobación > int(f(x),x=-5..5.);

2.746801534

> fin_del_segundo_ejercicio; fin_del_segundo_ejercicio

Tercer ejercicio (5 puntos)

a) Escribir un procedimiento, llamado prepara, en el que dados un valor de n, un vector de puntos de soporte s = {s1, s2, ..., sn, sn+1} y un vector de valores de una cierta función f = {f1, f2, ..., fn, fn+1} calcule un vector

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

37

h = {h1, h2, ..., hn} y otro vector ∆ = {∆1, ∆2, ..., ∆n} en los que cada uno de sus elementos reponda a las expresiones:

hi = si+1 - si + −∆ = i 1 i

ii

f fh

Este procedimiento se salvará en el disquete de trabajo en un fichero llamado prepara.m.

b) Escribir un procedimiento MAPLE en el que dados un valor de n, un

vector de puntos de soporte s = {s1, s2, ..., sn, sn+1}, un vector de valores de una cierta función f = {f1, f2, ..., fn, fn+1}, un vector h = {h1, h2, ..., hn}, un vector ∆ = {∆1, ∆2, ..., ∆n} y un valor fp se calculen los vectores a = {a1, a2, ..., an} , b = {b1, b2, ..., bn, bn+1} , c = {c1, c2, ..., cn} y d = {d1, d2, ..., dn} mediante las expresiones siguientes:

b1 = ∆1 bn+1 = fp y para los demás elementos de b:

−−

∆ ∆⎧ ∆ ∆ >⎪ ∆ + − ∆= ⎨⎪ ∆ ∆ ≤⎩

i 1 ii 1 i

i i i i 1i

i 1 i

· si · 0r· (1 r )·b

0 si · 0 (i = 2, ..., n)

donde:

( )

+←

+i 1 i

ii 1 i

h 2·hr3· h h

(i = 2, ..., n)

Para los otros tres vectores:

ai = fi , +∆ − −← i i i 1

ii

3· 2·b bch

, ++ − ∆← i i 1 i

i 2i

b b 2·dh

(i = 1, ..., n)

Este procedimiento se llamará coeficientes y se salvará en el disquete de trabajo en un fichero llamado coeficientes.m.

c) Escribir un procedimiento MAPLE en el que dados un valor n y los

vectores los vectores s = {s1, s2, ..., sn, sn+1} , a = {a1, a2, ..., an} , b = {b1, b2, ..., bn, bn+1} , c = {c1, c2, ..., cn} y d = {d1, d2, ..., dn} se calculen (como funciones) los polinomios:

p(i)(x) = ai + bi·(x-si) + ci·(x-si)2 + di·(x-si)3 (i = 1, ..., n)

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

38

A este procedimiento se le llamará spline3 y se salvará en el disquete de trabajo con el nombre spline3.m.

d) Los procedimientos anteriores permiten encontrar la función spline

cúbica g(x) que interpola a una función f(x) sobre el soporte {s1< s2 < ... < sn < sn+1} si se conocen los valores {f1 = f(s1) , f2 = f(s2) , ..., fn = f(sn) , fn+1 = f(sn+1)} y además el valor fp = f’(sn+1). La función interpoladora g(x) queda entonces definida en cada tramo Ii = [xi , xi+1] por el polinomio p(i)(x). Se pide que escribas un programa MAPLE que, utilizando los procedimientos anteriores calcule la spline cúbica que interpola a la función de Runge f(x) = (1+x2)-1 sobre el soporte de ocho puntos:

{s1= -1, s2 = 0, s3 = 1, s4 = 1.5, s5 = 2.3, s6 = 3, s7 = 4, s8 = 5}

Solución: a) > prepara:=proc(n,s,f,h,delta) local i: for i from 1 to n by 1 do h[i]:=s[i+1]-s[i]: delta[i]:=(f[i+1]-f[i])/h[i]: od: end proc: > save prepara,"prepara.m": > fin_del_primer_procedimiento;

fin_del_primer_procedimiento

b) > restart; > coeficientes:=proc(n, s, f, h, delta, fp, a, b, c, d) local i,r: a:=vector(n): b:=vector(n+1): c:=vector(n): d:=vector(n): b[1]:=delta[1]: b[n+1]:=fp: for i from 2 to n by 1 do if (delta[i-1]*delta[i] > 0) then r:= (h[i-1]+2*h[i])/(3*(h[i-1]+h[i])): b[i]:=delta[i-1]*delta[i]/(r*delta[i]+

(1-r)*delta[i-1]): else

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

39

b[i]:=0: fi: od: for i from 1 to n by 1 do a[i]:=f[i]: c[i]:=(3*delta[i]-2*b[i]-b[i+1])/h[i]: d[i]:=(b[i]+b[i+1]-2*delta[i])/h[i]^2: od: end proc: > save coeficientes, "coeficientes.m": > fin_del_segundo_procedimiento;

fin_del_segundo_procedimiento

c) > restart; > spline3:=proc(n,s,a,b,c,d,p) local i,expr: p:=vector(n): for i from 1 to n by 1 do expr:=a[i]+b[i]*(x-s[i])+c[i]*(x-s[i])^2+d[i]*(x-s[i])^3: p[i]:=unapply(expr,x): od: end proc: > save spline3, "spline3.m": > fin_del_tercer_procedimiento;

fin_del_tercer_procedimiento

d) > restart; > with(plots): Warning, the name changecoords has been redefined > read "prepara.m": read "coeficientes.m": read "spline3.m": > n:=7: s:=vector(n+1,[-1.,0.,1.,1.5,2.3,3.,4.,5.]): > ff:=x->1/(1+x^2): > f:=vector(n+1): for i from 1 to n+1 do f[i]:=ff(s[i]): od: > fp:=D(ff)(s[n+1]): > prepara(n,s,f,h,delta): > coeficientes(n, s, f, h, delta, fp, a, b, c, d):

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

40

> spline3(n,s,a,b,c,d,p): > g:=x->piecewise(s[1]<x and x<=s[2],p[1](x),s[2]<x and x<=s[3],p[2](x),s[3]<x and x<=s[4],p[3](x),s[4]<x and x<=s[5],p[4](x),s[5]<x and x<=s[6],p[5](x),s[6]<x and x<=s[7],p[6](x),s[7]<x and x<=s[8],p[7](x)): > dibspline:=plot(g(x),x=s[1]..s[8],color=red,thickness=3, linestyle=3): dibf:=plot(ff(x),x=s[1]..s[8],color=blue, thickness=3): > display(dibspline,dibf);

> fin_del_programa;

fin_del_programa

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

41

Examen de Laboratorio (Grupo 5º ) Fecha: 5 – VI – 2003

Primer ejercicio (2’5 puntos) El problema de encontrar una función y(x), de la que se conoce el valor a que toma en el punto x=0, tal que, dada una función f(x) real y continua sobre el intervalo [0,L], se verifique:

( ) ] ]' , 0,

(0)

dy y f x y x Ldx

y a

= = ∈

= (1)

recibe el nombre de problema de Cauchy. Para resolverlo numéricamente, se consideran n+1 puntos sobre el intervalo [0,L], { x0, x1, ..., xn } de tal forma que 0 = x0 < x1 < ... < xn = L. Estos n+1 puntos definen n subintervalos [xi, xi+1] (i = 0, 1, ..., n-1) de tamaño:

1 0,1, , 1i i ih x x i n+= − = −… aunque, por comodidad, supondremos que los puntos xi (i = 0, 1, ..., n) son equidistantes y, por tanto:

0 1 1nLh h h hn−= = = = =…

El método de Runge-Kutta clásico permite aproximar el valor de yi = y(xi) (i = 0, 1, ..., n) de la siguiente manera:

( )

( )

( )

0

1

12

23

4 1 3

1 1 2 3 4

desde 1 hasta :,

,2 2

,2 2

,1 2 26

i i

i i

i i

i i

i i

y ai i n

K h f x yh KK h f x y

h KK h f x y

K h f x y K

y y K K K K

+

+

== =

= ⋅

⎛ ⎞= ⋅ + +⎜ ⎟⎝ ⎠⎛ ⎞= ⋅ + +⎜ ⎟⎝ ⎠

= ⋅ +

= + + + +

Se pide: a) Construir un programa MAPLE que resuelva el problema (1)

mediante el método de Runge-Kutta expuesto. b) Aplicar este método al caso:

f(x,y) = y - x2 - 1, x∈[0,2], y(0) = 0.5 con n = 2, n = 5 y n = 10.

c) Dibujar en diferentes colores las soluciones obtenidas en el apartado b)

Solución:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

42

> restart:with(plots): Warning, the name changecoords has been redefined > f:=(x,y)->y-x**2-1.;

:= f → ( ),x y − − y x2 1.

> n:=vector(3,[2,5,10]); := n [ ], ,2 5 10

> L:=2.; := L 2.

> y:=array(0..100); := y ( )array ,.. 0 100 [ ]

> x:=array(0..100); := x ( )array ,.. 0 100 [ ]

> y[0]:=0.5; := y0 0.5

> x[0]:=0.; := x0 0.

> dibu:=vector(3): col:=vector(3,[red,blue,green]): > for j from 1 to 3 do: h:=L/n[j]: x[n[j]]:= L; for i from 0 to n[j]-1 do: x[i]:=x[0]+i*h; k1:= h*f(x[i],y[i]): k2:= h*f(x[i]+h/2,y[i]+k1/2): k3:= h*f(x[i]+h/2,y[i]+k2/2): k4:= h*f(x[i]+h,y[i]+k3): y[i+1]:=y[i]+(k1+2*k2+2*k3+k4)/6.: od: datos:=[seq([x[i],y[i]],i=0..n[j])]: dibu[j]:=plot(datos,color=col[j]): od: > display(dibu[1],dibu[2],dibu[3]);

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

43

> fin_del_primer_ejercicio;

fin_del_primer_ejercicio

Segundo ejercicio (2’5 puntos)

Una matriz A, simétrica y de dimensión (n,n) se puede expresar de la forma A = LTLT, donde L es una matriz triangular inferior con lii = 1 y T es una matriz tridiagonal de la forma:

1 1

1 2 2

2 3

1 1

1

0 00 0

00 0

0 0 0n n

n n

T

α ββ α β

β α

α ββ α

− −

⎛ ⎞⎜ ⎟⎜ ⎟⎜ ⎟

= ⎜ ⎟⎜ ⎟⎜ ⎟⎜ ⎟⎜ ⎟⎝ ⎠

… ……

Esta forma de proceder, denominada factorización LTLT puede llevarse a cabo mediante el algoritmo de Aasen:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

44

Dados: A, n Definir L como una matriz unidad (n,n) Desde j = 1 hasta n hacer: Si j = 1 H(1) = A(1, 1) Si no, si j = 2 H(1) = β(1) H(2) = A(2, 2) Si no, si j > 2 L1(0) = 0 L1(1) = 0 Desde i = 2 hasta j-1 hacer L1(i) = L(j, i) Terminar para i L1(j) = 1 H(j) = A(j,j) H(1) = β(1)*L1(2) Desde k = 2 hasta j-1 hacer H(k) = β(k-1)*L1(k-1) + α(k)*L1(k)+ β(k)*L1(k+1) H(j) = H(j) – L1(k)*H(k) Terminar para k Fin de la condición Si j = 1 ó j = 2 α(j) = H(j) Si no, si j > 2 α(j) = H(j) - β(j-1)*L(j, j-1) Fin de la condición Si j ≤ n-1 Desde i = j + 1 hasta n hacer: V(i) = 0

Desde k = 1 hasta j hacer: V(i) = V(i) + L(i, k)*H(k) Terminar para k V(i) = A(i,j) – V(i) Terminar para i β(j) = V(j+1) Fin de la condición Si j ≤ n-2 Desde i = j + 2 hasta n hacer: L(i, j+1) = V(i) / V(j + 1) Terminar para i Fin de la condición

Terminar para j FIN

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

45

Se pide escribir un programa MAPLE que responda al algoritmo anterior y aplicarlo a la matriz:

1 10 2010 1 3020 30 1

⎛ ⎞⎜ ⎟= ⎜ ⎟⎜ ⎟⎝ ⎠

A

Solución: > restart: with(linalg): Warning, the protected names norm and trace have been redefined and unprotected > n:=3: > A:=matrix(n,n,[[1.,10.,20.],[10.,1.,30.],[20.,30.,1.]]);

:= A⎡

⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥

1. 10. 20.10. 1. 30.20. 30. 1.

> H:= array(1..n): L1:=array(0..n): V:=array(1..n): > L:= matrix(n,n): > alpha:=array(1..n): beta:=array(1..n): > for i from 1 to n do for j from i+1 to n do L[i,j]:=0.: od: L[i,1]:=0.: L[i,i]:=1.: od: > for j from 1 to n do if(j = 1) then H[1]:=A[1,1]: elif(j = 2) then H[1]:=beta[1]: H[2]:=A[2,2]: else L1[0]:= 0.: L1[1]:= 0.: for k from 2 to j-1 do L1[k]:= L[j,k]: od: L1[j]:=1.: H[j]:=A[j,j]: H[1]:=beta[1]*L1[2]: for k from 2 to j-1 do H[k]:= beta[k-1]*L1[k-1] + alpha[k]*L1[k]+ beta[k]*L1[k+1]: H[j]:= H[j] - L1[k]*H[k]: od:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

46

fi: if((j=1) or (j=2)) then alpha[j]:= H[j]: else alpha[j]:= H[j] - beta[j-1]*L[j,j-1]: fi: if(j <= n-1) then for i from j+1 to n do V[i]:= 0.: for k from 1 to j do V[i]:= V[i] - L[i,k]*H[k]: od: V[i]:= A[i,j] + V[i]: od: beta[j]:=V[j+1]: fi: if(j <= n-2) then for i from j+2 to n do L[i,j+1]:= V[i]/V[j+1]: od: fi: od: > print(L,alpha,beta); print(V,H,L1);

, ,⎡

⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥

1. 0. 0.0. 1. 0.0. 2.000000000 1.

[ ], ,1. 1. -115.0000000 [ ], ,10. 28.00000000 β3

[ ], ,V1 10. 28.00000000 [ ], ,20.00000000 30.00000000 -59.00000000 .. 0 3array( , [, ,

= ( )0 0. = ( )1 0. = ( )2 2.000000000 = ( )3 1.

])

> evalm(L); ⎡

⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥

1. 0. 0.0. 1. 0.0. 2.000000000 1.

> T:=matrix(3,3,[[1.,10.,0.],[10.,1.,28.],[0.,28.,-115]]);

:= T⎡

⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥

1. 10. 0.10. 1. 28.0. 28. -115

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

47

> evalm(L&*T&*transpose(L)); ⎡

⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥

1. 10. 20.0000000010. 1. 30.00000000

20.00000000 30.00000000 1.00000000

> fin_del_segundo_ejercicio; fin_del_segundo_ejercicio

Tercer ejercicio (5 puntos) Un gas real que circula por una tubería de diámetro D (m) y longitud L (m) sufre una caída de presión. La presión en el extremo final puede calcularse mediante la fórmula:

2 2 22 1 2

40.0075 mLp p Q T

D Dλ

π⎛ ⎞= − ⋅ ⋅ ⋅ ⋅⎜ ⎟⋅⎝ ⎠

en donde p1 (bar) es la presión en el extremo inicial de la tubería, p2 (bar) la presión en el extremo final de la tubería, Q (m3.s-1) el caudal de gas, Tm la temperatura media del gas (º K) (T ºK = T ºC +273.15) y λ el coeficiente de fricción, que se puede calcular mediante la fórmula (Colebrook-White):

101 / 2.512 log

3.71 e

k DRλ λ

⎛ ⎞= − ⋅ +⎜ ⎟⎜ ⎟

⎝ ⎠

Donde k es la rugosidad (m) y Re el número de Reynolds, dado por:

93000eQRD

=

Por otra parte, la temperatura al final de la tubería, T2, puede calcularse mediante:

0.0058

2 1

D LQb bT T e

a a

⋅−⎛ ⎞= − + −⎜ ⎟

⎝ ⎠

con:

1 2

0.0058

0.5 gr

DaQ

p pb a TL

=

−= − ⋅

donde Tgr es la temperatura del terreno.

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

48

Se pide: a) Escribir un procedimiento en MAPLE que calcule el coeficiente de

fricción λ. Nótese que la fórmula que nos permite calcular este coeficiente es implícita, por lo que será necesario aplicar un método de punto fijo (aproximaciones sucesivas). Se recomienda trabajar con 1/ λ como variable y tomar como valor inicial

101 /2 log

3.71k D

λ⎛ ⎞= − ⋅ ⎜ ⎟⎝ ⎠

b) Escribir un procedimiento MAPLE que calcule la presión en el extremo final de la tubería.

c) Escribir un procedimiento en MAPLE que calcule la temperatura en el extremo final de la tubería.

d) Escribir un programa MAPLE que, utilizando los procedimientos anteriores, proporcione la presión y la temperatura del gas en el extremo final de la tubería a partir de los datos de Q, p1, T1, Tm, Tgr, L, D, k.

e) Aplicar el programa anterior al caso:

Q = 100 m3 s-1 p1 = 60 bar T1 = 20 ºC Tm = 18 ºC Tgr = 17,5 ºC L = 100 m D = 1 m k = 12.10-6 m

Solución: a) > restart: > friccion:=proc(Q,DD,k)

local i, lambda,lambda1, norma, eps, maxiter, Rey, friccion:

eps:=0.00000001: maxiter:=50: lambda1:=-2.*log10(k/DD/3.71): i:=0: norma:=2.*eps: Rey:= 93000.*Q/DD: while((i<=maxiter) and (norma >= eps)) do i:=i+1: lambda:=-2.*log10(k/DD/3.71 + 2.51*lambda1/Rey): norma:=abs(lambda1-lambda): lambda1:=lambda: od: friccion:=1/sqrt(lambda1): end proc: > save friccion, "fricción.m":

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

49

b) > presion:=proc(p1,Q,Tm,L,DD,lambda) local presion, p2:

p2:=p1*p1 - 0.00075* (4./(evalf(Pi*(DD**2))**2)*lambda*(L/DD)* (Q**2)*Tm):

presion:=sqrt(p2): end proc: > save presion, "presión.m": c) > temperatura:=proc(p1,p2,Q,T1,Tgr,L,DD) local a,b,temperatura: a:= 0.0058*Q/DD: b:= 0.5*(p1-p2)/L - a*Tgr: temperatura:= -(b/a) + (T1-b/a)*exp(-0.0058*DD*L/Q): end proc: > save temperatura, "temperatura.m": d) > restart; > read "fricción.m": read "presion.m": read "temperatura.m": > Q:=100.; p1:=60.; T1:=20.; Tm:=18.; Tgr:= 17.5;

:= Q 100. := p1 60. := T1 20. := Tm 18. := Tgr 17.5

> L:=100.; DD:=1.; k:=0.000012; := L 100.

:= DD 1. := k 0.000012

> lambda:=friccion(Q,DD,k); := λ 0.3095468047

> p2:=presion(p1,Q,Tm,L,DD,lambda); > T2:=temperatura(p1,p2,Q,T1,Tgr,L,DD);

:= p2 43.66191675 := T2 54.50225297

> fin_del_ejercicio; fin_del_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

50

Examen de Laboratorio (Grupo 6º ) Fecha: 5 – VI – 2003

Primer ejercicio (2’5 puntos) El problema de encontrar una función y(x), de la que se conoce el valor a que toma en el punto x=0, tal que, dada una función f(x) real y continua sobre el intervalo [0,L], se verifique:

( ) ] ]' , 0,

(0)

dy y f x y x Ldx

y a

= = ∈

= (1)

recibe el nombre de problema de Cauchy. Para resolverlo numéricamente, se consideran n+1 puntos sobre el intervalo [0,L], { x0, x1, ..., xn } de tal forma que 0 = x0 < x1 < ... < xn = L. Estos n+1 puntos definen n subintervalos [xi, xi+1] (i = 0, 1, ..., n-1) de tamaño:

1 0,1, , 1i i ih x x i n+= − = −… aunque, por comodidad, supondremos que los puntos xi (i = 0, 1, ..., n) son equidistantes y, por tanto:

0 1 1nLh h h hn−= = = = =…

El método de Adams-Bashforth con r+1 pasos permite aproximar el valor de yi = y(xi) (i = 0, 1, ..., n) de la siguiente manera:

( )

0

10

desde hasta :

,r

i i j i j i jj

y ai r i n

y y h b f x y+ − −=

== =

= + ⋅ ⋅∑

(2)

donde r es un entero positivo o nulo. Los valores de bj para diferentes valores de r son los siguientes:

b0 b1 b2 r = 0 1 --- --- r = 1 3/2 -1/2 --- r = 2 23/12 -4/3 5/12

Se pide: a) Construir un programa MAPLE que resuelva el problema (1)

mediante el método de Adams-Bashforth expuesto con r = 2. Es importante tener en cuenta que para valores de i menores que r el método no se puede aplicar (ver (2)), por lo que en el primer paso (i=0) será preciso aplicar el método con r = 0, en el segundo (i=1), con r = 1 y será a partir del tercero (i = 2) cuando se pueda aplicar el método con r = 2.

b) Aplicar este método al caso: f(x,y) = y - x2 - 1, x∈[0,2], y(0) = 0.5

con n = 5, n = 10 y n = 100. c) Dibujar en diferentes colores las soluciones obtenidas en el apartado b).

Solución:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

51

> restart:with(plots): Warning, the name changecoords has been redefined > f:=(x,y)->y-x**2-1.;

:= f → ( ),x y − − y x2 1.

> n:=vector(3,[5,10,100]); := n [ ], ,5 10 100

> L:=2.; := L 2.

> y:=array(0..100); := y ( )array ,.. 0 100 [ ]

> x:=array(0..100); := x ( )array ,.. 0 100 [ ]

> y[0]:=0.5; := y0 0.5

> x[0]:=0.; := x0 0.

> dibu:=vector(3): col:=vector(3,[red,blue,green]): > for j from 1 to 3 do: h:=L/n[j]: x[n[j]]:= L: y[1]:=y[0]+h*f(x[0],y[0]): x[1]:=x[0]+h: y[2]:=y[1]+h*(1.5*f(x[1],y[1])-0.5*f(x[0],y[0])): for i from 2 to n[j]-1 do: x[i]:=x[0]+i*h; y[i+1]:=y[i]+h*((23./12)*f(x[i],y[i])-(4./3)*f(x[i-1],y[i-1])+(5./12)*f(x[i-2],y[i-2])): od: datos:=[seq([x[i],y[i]],i=0..n[j])]: dibu[j]:=plot(datos,color=col[j]): od: > display(dibu[1],dibu[2],dibu[3]);

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

52

> fin_del_primer_ejercicio;

fin_del_primer_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

53

Segundo ejercicio (2’5 puntos) Para un sistema de ecuaciones Ax = b en el cual la matriz A es de

dimensión (m,n), con m>n, siempre es posible encontrar un vector x que minimice Ax - b . Este vector x recibe el nombre de pseudosolución. Una forma de hallar la pseudosolución del sistema Ax = b consiste en transformarlo en otro, Rx = b’, de tal forma que la matriz R sea triangular superior, y que se resuelve por remonte, cuya solución es la psudosolución del sistema dado. Un método que sirve para este propósito es el denominado método de transformaciones de Givens, cuyo algoritmo se expresa a continuación. Dados A, b, m, n Desde i = 1 hasta n hacer: Desde k = i + 1 hasta m hacer: Si A(k, i) <> 0 hacer: Si |A(k, i)| ≥ |A(i, i)| hacer: t = A(i, i) / A(k, i) s = (1 + t2)-1/2 c = s t en caso contrario: t = A(k, i) / A(i, i) c = (1 + t2)-1/2 s = c t Fin de la condición A(i, i) = c A(i, i) + s A(k, i) Desde j = i +1 hasta n aux = c A(i, j) + s A(k, j) A(k, j) = -s A(i, j) + c A(k, j) A(i, j) = aux Terminar para j aux = c b(i) + s b(k) b(k) = - s b(i) + c b(k) b(i) = aux Fin de la condición Terminar para k Terminar para i Desde j = 1 hasta n hacer

( ) ( )

1

1x( ) b( ) A , x( )A ,

n

k j

j j j k kj j = +

= − ∑

Terminar para j FIN

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

54

Se pide escribir un programa MAPLE que responda al algoritmo anterior y aplicarlo al sistema:

1

2

3

1 1 1 21 2 4 31 3 9 51 4 16 6

xxx

⎛ ⎞ ⎛ ⎞⎛ ⎞⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ ⎟=⎜ ⎟⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ ⎟⎝ ⎠⎜ ⎟ ⎜ ⎟

⎝ ⎠ ⎝ ⎠

.

Solución: > restart: with(linalg): Warning, the protected names norm and trace have been redefined and unprotected > m:= 4: > n:= 3: > A:=matrix(m,n,[[1.,1.,1.],[1.,2.,4.],[1.,3.,9.],[1.,4.,16.]]);

:= A

⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥

1. 1. 1.1. 2. 4.1. 3. 9.1. 4. 16.

> b:=vector(m,[2.,3.,5.,6]); := b [ ], , ,2. 3. 5. 6

> x:=vector(n): > for i from 1 to n do for k from i+1 to m do if(A[k,i] <> 0.) then if(abs(A[k,i]) >= abs(A[i,i])) then t:= A[i,i]/A[k,i]: s:= 1./sqrt(1.+t**2): c:= s*t: else t:= A[k,i]/A[i,i]: c:= 1./sqrt(1.+t**2): s:= c*t: fi: A[i,i]:= c*A[i,i] + s*A[k,i]: for j from i+1 to n do aux:= c*A[i,j] + s*A[k,j]: A[k,j]:= -s*A[i,j] + c*A[k,j]: A[i,j]:=aux: od: aux:=c*b[i] + s*b[k]: b[k]:= -s*b[i] + c*b[k]: b[i]:= aux: fi: od:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

55

od: > > print(A,b):

⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥

2.000000001 5.000000002 15.000000001. 2.236067979 11.180339891. 1.224744873 2.0000000081. 1.732050808 1.825741869

,

[ ], , ,8.000000004 3.130495169 0.11 10-8 -0.4472135938

> > x[n]:=b[n]/A[n,n]: > for i from n-1 to 1 by -1 do suma:=0: for k from i+1 to n do suma:=suma+A[i,k]*x[k]: od: x[i]:=(b[i]-suma)/A[i,i]: od: > print(x);

[ ], ,0.5000000037 1.399999997 0.5499999978 10-9

> fin_del_segundo_ejercicio; fin_del_segundo_ejercicio

Tercer ejercicio (5 puntos) La ecuación de estado de los gases reales de Beattie-Bridgeman es:

2 3 4

R TPV V V V

β γ δ⋅= + + +

en donde P es la presión, V el volumen, T la temperatura, R la constante de los gases y β, γ y δ unos parámetros definidos mediante:

0 0 2

00 0 2

02

R cR T B AT

R c BR T B b A aT

R B b cT

β

γ

δ

⋅= ⋅ ⋅ − −

⋅ ⋅= − ⋅ ⋅ ⋅ + ⋅ −

⋅ ⋅ ⋅=

y A0, B0, a, b y c son constantes específicas para cada gas.

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

56

Se pide:

a) Escribir un procedimiento en MAPLE que determine los parámetros β, γ y δ de un gas real a partir de A0, B0, a, b y c.

b) Escribir un procedimiento MAPLE que determine el volumen V que

ocupa el gas a una temperatura y presión dadas. Dado que lo ecuación de Beattie-Bridgeman es no lineal en V, será necesario resolverla mediante un método apropiado, por ejemplo Newton. Para ello, considérese:

2 3 4( ) 0R Tf V PV V V V

β γ δ⋅= + + + − =

Para la P en atm., T en ºK (T ºK = T ºC+273.15) y V en litros,

R=0.08205. Como valor inicial de V se utilizará:

R TVP⋅

=

c) Escribir un programa MAPLE que, utilizando los procedimientos

anteriores, calcule el factor de compresibilidad, Z, del gas:

P VZR T

⋅=

d) Aplicar el programa anterior al caso de metano a 20 atm y 60 ºC. Las

constantes A0, B0, a, b y c del metano son:

A0 = 2.2769 B0 = 0.0587 a = 0.01855 b = -0.01587 c = 12.83 .104

P = 20 atm. T = 60 ºC Solución: > restart: > parametros:=proc(A0,B0,a,b,c,T,R,beta,gama,delta) beta:= R*T*B0-A0-R*c/(T**2): gama:= -R*T*B0*b+A0*a-R*c*B0/(T**2): delta:= R*B0*b*c/(T**2): end proc: > volumen:=proc(R,T,P,beta,gama,delta,f,df) local V, V1, eps, maxiter, iter, norma:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

57

maxiter:=100: eps:= 0.000001: norma:= 2*eps: V:= R*T/P: iter:= 0: while((norma > eps) and (iter <=maxiter)) do iter:=iter+1: V1:= V - f(V)/df(V): norma:=abs(V1 - V): V:=V1: od: end proc: > A0:=2.2769: B0:=0.0587: a:=0.01855: b:=-0.01587: c:=12.83e+4: P:=20.: T:=60.: R:=0.08205: > T:=T+273.15: > parametros(A0,B0,a,b,c,T,R,beta,gama,delta): > f:= V->R*T/V + beta/(V**2) + gama/(V**3) + delta/(V**4) - P: > df:=V->-R*T/(V**2) - 2*beta/(V**3) - 3*gama/(V**4) - 4*delta/(V**5): > V:=volumen(R,T,P,beta,gama,delta,f,df): > Z:=P*V/(R*T);

:= Z 0.9803176011

> fin_del_ejercicio; fin_del_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

58

Examen de Laboratorio (Convocatoria de septiembre) Fecha: 18 – IX – 2003 (Grupos 1º y 2º)

Primer ejercicio (2’5 Puntos) Consideramos la sucesión x1, x2, ..., xn obtenida aplicando el método de aproximaciones sucesivas: “Dado x1 se genera la sucesión: xk+1 = g(xk) (k=1,2,…..n)” A partir de dicha sucesión definimos los valores:

k 1 kk

k 1 k k 1

x xxx x x

+

− −

−∆= =

∆ −Razón de prueba de convergencia lineal (CLk).

( ) ( )k 1 kk

2 2k 1 k k 1

x xxx x x

+

− −

−∆= =

∆ −Razón de prueba de convergencia cuadrática (CQk).

Se quiere diseñar un método de aproximaciones sucesivas para obtener una raíz de la función no lineal f(x) = x2 – 78’8. Para ello, se transforma la ecuación f(x)=0 en la ecuación equivalente x=g(x), donde:

( ) 2p 1 x 78'8g(x)

p x− ⋅ +

=⋅

siendo p una constante real. Realiza un programa MAPLE en el que se sigan los siguientes pasos: 1º) Define la función g(x) para p = 3/2 y una variable maxiter que representa el número de iteraciones que se realizarán del método de aproximaciones sucesivas. 2º) Aplica el método de aproximaciones sucesivas a la resolución de la ecuación x = g(x). Realiza maxiter iteraciones del método de aproximaciones sucesivas, inicializado con el valor x0 = 9. 3º) Construye los vectores {dif}, {CL}, {CQ} cuyas componentes respectivas vienen dadas por:

difk+1 = xk+1 - xk (k=0,2,...,maxiter)

( )

k 1K 1

k

k 1K 1 2

k

difCL

difdif

CQdif

++

++

=

= (k=1,2,...,maxiter)

4º) Escribe los resultados en la forma siguiente:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

59

Iteración(k) xk=g(xk-1) dif CL CQ 1 x1 dif1 2 x2 dif2 CL2 CQ2 3 x3 dif3 CL3 CQ3 4 x4 dif4 CL4 CQ4 ……… ……. .......................... .................. ........... maxiter+1 xmaxiter+1 difmaxiter+1 CLmaxiter+1 CQmaxiter+1 5º) Representa en dos gráficos los puntos: (i, CLi) y (i, CQi) (i = 2,3, ..., maxiter+1) Datos: Como número de iteraciones a realizar se tomará maxiter = 5. 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 Definición de la función g(x) > g:=x-> ((p-1)*x^2+78.8)/(p*x);

:= g → x + ( ) − p 1 x2 78.8

p x

Número máximo de iteraciones y declaración de dimensiones > maxiter:=5: sol:=array(0..maxiter+1): dif:=array(0..maxiter+1): CL:=array(0..maxiter+1): CQ:=array(0..maxiter+1): Solución inicial. > sol[0]:=9.: > h:=subs(p=3./2.,g(x));hh:=unapply(h,x);

:= h0.6666666667 ( ) + 0.500000000 x2 78.8

x

:= hh → x0.6666666667 ( ) + 0.500000000 x2 78.8

x

> iter:=0: while (iter <= maxiter) do iter:=iter+1: sol[iter] := hh(sol[iter-1]): od;

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

60

:= iter 1

:= sol1 8.837037040

:= iter 2

:= sol2 8.890356294

:= iter 3

:= sol3 8.872476620

:= iter 4

:= sol4 8.878424500

:= iter 5

:= sol5 8.876440547

:= iter 6

:= sol6 8.877101714

> dif[1]:=sol[1]-sol[0]; := dif1 -0.162962960

> for i from 1 by 1 to maxiter do dif[i+1]:=sol[i+1]-sol[i]: od;

:= dif2 0.053319254

:= dif3 -0.017879674

:= dif4 0.005947880

:= dif5 -0.001983953

:= dif6 0.000661167

Determinación de la constante de convergencia lineal > for i from 1 by 1 to maxiter do CL[i+1]:=dif[i+1]/dif[i]: od;

:= CL2 -0.3271863373

:= CL3 -0.3353324111

:= CL4 -0.3326615463

:= CL5 -0.3335563260

:= CL6 -0.3332573907

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

61

Determinación de la constante de convergencia cuadrática > for i from 1 by 1 to maxiter do CQ[i+1]:=dif[i]/(dif[i]*dif[i]): od;

:= CQ2 -6.136363748

:= CQ3 18.75495107

:= CQ4 -55.92943138

:= CQ5 168.1271310

:= CQ6 -504.0441986

> for i from 1 by 1 to maxiter+1 do print(i,sol[i],dif[i],CL[i],CQ[i]); od;

, , , ,1 8.837037040 -0.162962960 CL1 −0.162962960

dif02

, , , ,2 8.890356294 0.053319254 -0.3271863373 -6.136363748

, , , ,3 8.872476620 -0.017879674 -0.3353324111 18.75495107

, , , ,4 8.878424500 0.005947880 -0.3326615463 -55.92943138

, , , ,5 8.876440547 -0.001983953 -0.3335563260 168.1271310

, , , ,6 8.877101714 0.000661167 -0.3332573907 -504.0441986

> seqlin:=[seq([k,CL[k]],k=2..maxiter+1)]: > seqcua:=[seq([k,CQ[k]],k=2..maxiter+1)]; seqcua [ ],2 -6.136363748 [ ],3 18.75495107 [ ],4 -55.92943138 [ ],5 168.1271310, , , ,[ :=

[ ],6 -504.0441986 ]

> dibulin := pointplot(seqlin,color=blue,symbol=cross): > dibucua := pointplot(seqcua): > display(dibucua);

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

62

> display(dibulin);

> Fin_del_primer_ejercicio;

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

63

Fin_del_primer_ejercicio

Segundo ejercicio (2’5 Puntos) Realizar un programa en MAPLE que responda al algoritmo siguiente:

Datos: nx, ny

← ⋅

←+

←← ⋅ =

← + =←

i

1

i i 1

nnodes nx ny1deltax

nx 11deltay

ny[A] [0]x i deltax (i 1,2,...,nx)

deltayy2

y y deltay (i 2,3,...,ny)k 0

Para i desde 1 hasta nx con paso 1 hacer: Para j desde 1 hasta ny con paso 1 hacer:

← +

←k i

k j

k k 1xn xyn y

Fin del bucle en j Fin del bucle en i

−←

⋅−

←⋅

← − ⋅ +

1dx2deltax deltax

1dy2deltay deltay

1dydeltay

dxy 2 (dx2 dy2)

Para i desde 1 hasta nx con paso 1 hacer: Si (i = 1) entonces:

+

← +

← +

1,2

1,1

1,1 ny

1

A dy2A dxy dy2A dx2b 1 dy

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

64

Para j desde 2 hasta ny-1 con paso 1 hacer:

+

+

j,j 1

j,j

j,j ny

j,j 1

j

A dy2A dxyA dx2A dy2b 1

Fin del bucle en j

← +

← +

ny,ny

ny,ny 1

ny,2ny

ny

A dxy dy2A dy2A dx2b 1 dy

si no, si (i < nx) entonces

+

+

← − ⋅ +←

← +

← +

node,node 1

node,node ny

node,node

node,node ny

node

node (i 1) ny 1A dy2A dx2A dxy dy2A dx2b 1 dy

Para j desde 2 hasta ny-1 con paso 1 hacer:

+

+

← +←

node,node 1

node,node ny

node,node

node,node ny

node,node 1

node

node node 1A dy2A dx2A dxyA dx2A dy2b 1

Fin del bucle en j si no

+

← +←

← +

← +

node,node 1

node,node ny

node,node

node

node node 1A dy2A dx2A dxy dy2b 1 dy

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

65

Para j desde 2 hasta ny-1 con paso 1 hacer:

+

← +←

node,node 1

node,node ny

node,node

node,node 1

node

node node 1A dy2A dx2A dxyA dy2b 1

Fin del bucle en j

← +←

← +

← +

node,node ny

node,node

node,node 1

node

node node 1A dx2A dxy dy2A dy2b 1 dy

Fin condición Fin bucle en i Resolver en {u}: [A].{u} = {b} Datos a emplear: nx = 10, ny = 11 Solución: > restart:with(linalg):with(plots): > a:=0.:b:=2.:N:=10:alpha:=0.5: > f:= (t,y)-> y-t^2+1: Solución exacta > yex:=t->(t+1)^2-0.5*exp(t): > h:=(b-a)/N: > t[0]:=a:w[0]:=alpha: > for i from 1 by 1 to 3 do K[1]:=h*f(t[i-1],w[i-1]): K[2]:=h*f(t[i-1]+(h/2),w[i-1]+(K[1]/2)): K[3]:=h*f(t[i-1]+(h/2),w[i-1]+(K[2]/2)): K[4]:=h*f(t[i-1]+h,w[i-1]+K[3]): w[i]:=w[i-1]+(K[1]+2*K[2]+2*K[3]+K[4])/6.: t[i]:=a+i*h: od: > for i from 4 by 1 to N do t[i]:=a+i*h:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

66

wpred:=w[i-1]+h*(55*f(t[i-1],w[i-1])-59*f(t[i-2],w[i-2])+37*f(t[i-3],w[i-3])-9*f(t[i-4],w[i-4]))/24.: wcorr:=w[i-1]+h*(9*f(t[i],wpred)+19*f(t[i-1],w[i-1])-5*f(t[i-2],w[i-2])+f(t[i-3],w[i-3]))/24.: w[i]:=wcorr: od: El error que se calcula a continuación no se pide en el examen > for i from 0 by 1 to N do yexacta[i]:=yex(t[i]): err[i]:=abs(w[i]-yexacta[i]): od: > for i from 0 by 1 to N do print(t[i],w[i],yexacta[i],err[i]): od;

, , ,0. 0.5 0.5 0.

, , ,0.2000000000 0.8292933334 0.8292986210 0.52876 10-5 , , ,0.4000000000 1.214076211 1.214087651 0.000011440

, , ,0.6000000000 1.648922018 1.648940600 0.000018582

, , ,0.8000000000 2.127205634 2.127229536 0.000023902

, , ,1.000000000 2.640828598 2.640859086 0.000030488

, , ,1.200000000 3.179902638 3.179941538 0.000038900

, , ,1.400000000 3.732350485 3.732400016 0.000049531

, , ,1.600000000 4.283420828 4.283483788 0.000062960

, , ,1.800000000 4.815096361 4.815176268 0.000079907

, , ,2.000000000 5.305370678 5.305471950 0.000101272

> seqsolapr:=[seq([t[i],w[i]],i=0..N)]: > seqsolex:=[seq([t[i],yexacta[i]],i=0..N)]: > seqerror:=[seq([t[i],log(err[i])],i=0..N)]: > dibapr:=pointplot(seqsolapr,color=blue,symbol=diamond): > dibex:=pointplot(seqsolex,color=red,symbol=cross): > diberr:=pointplot(seqerror,color=brown,symbol=circle): > display(dibapr,dibex);display(diberr);

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

67

> Fin_del_segundo_ejercicio;

Fin_del_segundo_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

68

Tercer ejercicio (5 Puntos)

Se quieren obtener los pesos y los puntos del soporte de una fórmula de integración numérica de tipo interpolatorio. Si el intervalo de integración es [a,b] y se denota por pmed al punto medio, se colocarán n puntos equidistantes en el intervalo ]a,pmed[, y otros n puntos equidistantes en el intervalo ]pmed, b[. De esta forma, los puntos de integración serán los extremos a, b, el punto medio (pmed) y los 2.n puntos dispuestos en cada subintervalo. a) Realiza un procedimiento llamado soport que, teniendo como datos de entrada: número de puntos en cada subintervalo (n), extremos izquierdo (a) y derecho (b) del intervalo, permita obtener un vector s en el que se almacenarán los puntos del soporte, tal y como se describieron en el párrafo anterior. Este procedimiento se salvará en el diskette de trabajo con el nombre soport.m b) Programa un procedimiento form_integr que, tomando como datos de entrada el número de puntos en cada subintervalo (n), extremos izquierdo (a) y derecho (b) del intervalo y un vector sop en el que están almacenados los puntos del soporte, calcule un vector c en el que se almacenarán los pesos de la fórmula de integración numérica que se obtendrán mediante:

b

i ia

c L (x)dx= ∫

siendo

n

jj 0i j

i n

i jj 0i j

(x x )

L (x)(x x )

=≠

=≠

=−

∏ los polinomios de base de Lagrange que se obtienen

sobre el soporte sop. Este procedimiento se salvará en el diskette de trabajo con el nombre form_integr.m c) Ejecuta los procedimientos anteriores empleando los siguientes datos: a = 1; b = 5; n = 2.

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

69

d) A partir de los puntos del soporte y los pesos obtenidos en los procedimientos anteriores, aproxima el valor de la integral:

52 x

1

x .e dx∫

para ello, aplica la fórmula: (nºpuntos soporte) 1

i ii 0

valint c .f(s )−

=

= ∑ .

Para evaluar el sumatorio puedes aplicar la instrucción sum( ). Solución: A) > restart:with(linalg):with(plots): > soport:=proc(n,a,b,s) local h,pmed,i: pmed:=(a+b)/2.: h := (pmed-a)/(n+1): for i from 0 by 1 to n do s[i]:=a+i*h: od: s[n+1]:=pmed: for i from 1 by 1 to n+1 do s[n+1+i]:=pmed+i*h: od: end: > save soport, "A:/soport.m": > n:=2:a:=1.:b:=5.: > s := array(0..2*n+2): > soport(n,a,b,s): > form_integr(n,a,b,s,c): > fin;

fin

B) > restart; > form_integr:=proc(n,a,b,sop,c) local i,pbas: pbas:= array(0..2*n+2): for i from 0 by 1 to 2*n+2 do pbas[i]:=mul((x-sop[j])/(sop[i]-sop[j]),j=0..i-1)*mul((x-sop[j])/(sop[i]-sop[j]),j=i+1..2*n+2): c[i]:=int(pbas[i],x=a..b): od:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

70

end: > save form_integr, "A:/form_integr.m": > fin;

fin

C) > restart: > n:=2:a:=1.:b:=5.: > s := array(0..2*n+2): > soport(n,a,b,s): > print(s);

.. 0 6array( , [ = ( )0 1. = ( )1 1.666666667 = ( )2 2.333333333

= ( )3 3.000000000 = ( )4 3.666666667 = ( )5 4.333333333 = ( )6 5.000000000

])

> form_integr(n,a,b,s,c): > print(c);

= 0 0.1952380953 = 1 1.028571430 = 2 0.1285714250 = 3 1.295238097table([ , , , , = 5 1.028571430 = 4 0.1285714264, , = 6 0.1952380953

]) Aplicación al cálculo de la integral

> f:=x-> x^2 * exp(x); := f → x x2 ex

> valint := evalf(sum('c[i]*f(s[i])',i=0..2*n+2)); := valint 2520.745051

Aunque no se pide en el examen, comparamos el resultado obtenido con el valor exacto de la integral > valexac:=evalf(int(f(x),x=1..5));

:= valexac 2520.305423

> Fin_del_tercer_ejercicio; Fin_del_tercer_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

71

Examen de Laboratorio (Convocatoria de septiembre) Fecha: 18 – IX – 2003 Hora: 11h 30m. (Grupos 3 y 4)

Ejercicio 1º (2.5 puntos) Se quiere representar y calcular la longitud de la curva definida por las ecuaciones paramétricas:

1 1x cos(t) ·cos(7·t) ·sen(17·t)2 3 0 t 2·1 1y sen(t) ·sen(7·t) ·cos(17·t)2 3

⎧ ⎫= + +⎪ ⎪⎪ ⎪ ≤ ≤ π⎨ ⎬⎪ ⎪= + +⎪ ⎪⎩ ⎭

Para ello se pide que escribas un programa en MAPLE en el que:

a) Se evalúen las coordenadas (xi, yi) (i = 0, ..., n) de un total de (n+1) puntos de dicha curva correspondientes a (n+1) valores ti del parámetro t, repartidos uniformemente en el intervalo [0, 2·π].

b) Se represente la secuencia de los puntos (xi, yi) (i = 0, ..., n).

c) Se aproxime la longitud de la curva mediante la expresión:

( ) ( )n

2 2i i 1 i i 1

i 1long x x y y− −

=

⎛ ⎞≈ − + −⎜ ⎟⎝ ⎠∑

Utilícese el programa escrito con el valor n = 2000.

(Valoración de cada partado: a) 1 punto, b) 0.75 puntos, c) 0.75 puntos) Solución: > restart; > with(plots): Warning, the name changecoords has been redefined > n:=2000: > x:=array(0..n): y:=array(0..n): > h:=evalf(2.*Pi/n);

:= h 0.003141592654

> f1:=t->cos(t)+cos(7*t)/2+sin(17*t)/3; f2:=t->sin(t)+sin(7*t)/2+cos(17*t)/3;

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

72

:= f1 → t + + ( )cos t12 ( )cos 7 t

13 ( )sin 17 t

:= f2 → t + + ( )sin t12 ( )sin 7 t

13 ( )cos 17 t

> x[0]:=f1(0.);y[0]:=f2(0.); := x0 1.500000000

:= y0 0.3333333333

> long:=0.: for i from 1 to n by 1 do: t:=i*h: x[i]:=f1(t): y[i]:=f2(t): long:=long+sqrt(((x[i]-x[i-1])^2)+((y[i]-y[i-1])^2)): od: > ptos:=[seq([x[k],y[k]],k=0..n)]: > pointplot(ptos,symbol=point, color=red);

> long;

39.39968790

> fin_primer_ejercicio; fin_primer_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

73

Ejercicio 2º (2.5 puntos) 2º El algoritmo que se proporciona en este ejercicio recoge el método de Heun para resolver el sistema de dos ecuaciones diferenciales ordinarias de primer orden de la forma :

1

1

22

dy (t) y (t)f11(t) f12(t) g1(t)dt ·y (t)dy f21(t) f22(t) g2(t)(t)

dt

⎧ ⎫⎪ ⎪ ⎧ ⎫⎡ ⎤ ⎧ ⎫⎪ ⎪ = +⎨ ⎬ ⎨ ⎬ ⎨ ⎬⎢ ⎥

⎣ ⎦ ⎩ ⎭⎩ ⎭⎪ ⎪⎪ ⎪⎩ ⎭

(0< t < TFIN)

y1(0) = α, y2(0) = β. Se pide que escribas un programa MAPLE que se adapte al algoritmo del método de Heun que se detalla a continuación. INICIO Asignar valor a las variables n , TFIN, α y β. Definir las funciones f11(t), f12(t), f21(t), f22(t), g1(t) y g2(t) Definir el vector {y} = {α , β}. C1,0 y1 C2,0 y2 h TFIN/n t0 0

Evaluar la matriz [ ] 0 0

0 0

f11(t ) f12(t )M

f21(t ) f22(t )⎡ ⎤

← ⎢ ⎥⎣ ⎦

Evaluar el vector { } 0

0

g1(t )b

g2(t )⎧ ⎫

← ⎨ ⎬⎩ ⎭

Para i desde 1 hasta n con paso 1 hacer: Evaluar el vector: {v} { [M]·{y} + {b} } Evaluar el vector: {p} {y} + h·{v} ti i·h

Evaluar la matriz:[ ] i i

i i

f11(t ) f12(t )M

f21(t ) f22(t )⎡ ⎤

← ⎢ ⎥⎣ ⎦

Evaluar el vector: { } i

i

g1(t )b

g2(t )⎧ ⎫

← ⎨ ⎬⎩ ⎭

Evaluar el vector: {z} {y} + (h/2)· { {v] + [M]·{p} + {b} } C1, i z1 C2, i z2 Evaluar el vector: {y} {z} Fin bucle en i.

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

74

Representar en una misma gráfica las secuencias de puntos (ti, C1, i) (i = 0, ...., n) y (ti, C2, i) (i = 0, ...., n). Representar la secuencia de puntos (C1, i , C2, i ) (i = 0, ...., n) FIN Utilizarlo con los datos: n = 300, TFIN = 3. , α = 0., β = 0.5, f11(t) = -t , f12(t) = t/2 , f21(t) = -10·t2 , f22(t) = 3·t /2 , g1(t) = 1. - t , g2(t) = e-t. 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 > n:=300:TFIN:=3.:alpha:=0.;beta:=0.5:

:= α 0.

> f11:=t->-t: f12:=t->t/2.: f21:=t->-10.*t*t: f22:=t->1.5*t: g1:=t->1.-t: g2:=t->exp(-t): > y:=vector(2,[alpha,beta]): > C:=array(1..2,0..n): > C[1,0]:=y[1]: C[2,0]:=y[2]: > h:=TFIN/n: > t:=array(0..n):t[0]:=0: > M:=matrix(2,2,[f11(t[0]),f12(t[0]),f21(t[0]),f22(t[0])]): b:=vector(2,[g1(t[0]),g2(t[0])]): > for i from 1 to n by 1 do v:=evalm(M&*y+b); p:=evalm(y+h*v); t[i]:=i*h; M:=matrix(2,2,[f11(t[i]),f12(t[i]),f21(t[i]), f22(t[i])]); b:=vector(2,[g1(t[i]),g2(t[i])]); z:=evalm(y+(h/2)*evalm(v+M&*p+b)); C[1,i]:=z[1]: C[2,i]:=z[2]: y:=evalm(z): od:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

75

> ptos1:=[seq([t[i],C[1,i]],i=0..n)]: ptos2:=[seq([t[i],C[2,i]],i=0..n)]: > dib1:=pointplot(ptos1,symbol=CIRCLE,color=blue): dib2:=pointplot(ptos2,symbol=box,color=red): > display(dib1,dib2);

> ptos:=[seq([C[1,i],C[2,i]],i=0..n)]: pointplot(ptos,color=gold,connect=true,thickness=5);

> fin_del_segundo_ejercicio; fin_del_segundo_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

76

Ejercicio 3º (5 puntos) a) Dada una matriz cuadrada [A] con n filas, y dado un vector {v} con n elementos no todos nulos, el método de la potencia permite determinar el valor propio de [A] con mayor módulo así como un vector propio a él asociado mediante el siguiente proceso iterativo: Paso 1º) Calcular el vector {r} = [A]·{v} Paso 2º) Determinar el valor (β) de la componente de mayor módulo del

vector {r}. Paso 3º) Calcular el vector {w} = (1/β)·{r}. Paso 4º) Si (||{v} – {w}||2 < ε ) entonces: Tomar el valor β como valor propio de mayor módulo de [A] y {w} como un vector propio de [A] asociado a dicho valor propio. en caso contrario: Hacer {v} {w} y volver al paso 1º repitiendo otra vez el

proceso. Se pide que escribas un procedimiento MAPLE , llamado metpot, que tomando como argumentos de entrada las variables escalares n, ε y maxiter, el vector {v} y la matriz [A], calcule, como argumentos de salida, el valor propio de mayor módulo λ y un vector propio a él asociado {w} , realizándose a lo sumo maxiter iteraciones del método de la potencia que se acaba de describir. b) Dada una matriz cuadrada [A], de n filas, de la que se conocen un valor propio no nulo λ1 y un vector propio a él asociado {v}, el método de deflacción de Hotelling permite determinar una matriz cuadrada [B], de n filas, con los mismos vectores propios que [A] y con los mismos valores propios salvo λ1 que no es valor propio de [B] y en su lugar [B] admite el 0 como valor propio. El método de Hotelling se puede esquematizar en el siguiente proceso: Dados los escalares n y λ1

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

77

Dados {v} =

1

2

n

vv...v

⎧ ⎫⎪ ⎪⎪ ⎪⎨ ⎬⎪ ⎪⎪ ⎪⎩ ⎭

y [A] =

1,1 1,2 1,n 1 1,n

2,1 2,2 2,n 1 2,n

n 1,1 n 1,2 n 1,n 1 n 1,n

n,1 n,2 n,n 1 n,n

A A ... A AA A ... A A... ... ... ...

A A ... A AA A ... A A

− − − − −

⎡ ⎤⎢ ⎥⎢ ⎥⎢ ⎥⎢ ⎥⎢ ⎥⎢ ⎥⎣ ⎦

Construir la matriz de (n+1) filas y n columnas:

[ ]

1 1,1 2,1 n 1,1 n,1

1,2 1 2,2 n 1,2 n,2

1,n 1 2,n 1 1 n 1,n 1 n,n 1

1,n 2,n n 1,n 1 n,n

1 2 n 1 n

( A ) A ... A AA ( A ) ... A A... ... ... ...

A A ... ( A ) AA A ... A ( A )v v ... v v

− − − − −

λ − − − −⎡ ⎤⎢ ⎥− λ − − −⎢ ⎥⎢ ⎥

= ⎢ ⎥− − λ − −⎢ ⎥⎢ ⎥− − − λ −⎢ ⎥⎢ ⎥⎣ ⎦

S

Construir el vector de (n+1) elementos: {b} =

00...01

⎧ ⎫⎪ ⎪⎪ ⎪⎪ ⎪⎨ ⎬⎪ ⎪⎪ ⎪⎪ ⎪⎩ ⎭

Determinar el vector de n elementos {y} que es solución del sistema de

ecuaciones [S]·{y} = {b}. (ver la nota que se escribe más abajo).

Evaluar la matriz: [B] [A] – λ1 · {v} · {y}T

Se pide escribir un procedimiento MAPLE, llamado hotelling, en el que considerando como argumentos de entrada los escalares n y λ1, el vector {v} y la matriz [A], se calcule como argumento de salida la matriz [B] conforme al procedimiento de Hotelling que se acaba de describir. NOTA: La resolución del sistema [S]·{y} = {b} usando el método de Gauss puede realizarse en MAPLE 7, tras cargar la librería linalg, mediante las instrucciones:

H:=augment(S,b): U:=gausselim(H): U[n+1,n+1]:=0: y:=backsub(U):

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

78

c) Escribir un programa MAPLE que, utilizando los procedimientos pedidos en los apartados anteriores calcule los dos primeros valores propios �1 y �2 de una matriz [A]. Para ello el programa debe calcular: 1º) El valor propio de mayor módulo �1 de la matriz [A] y un

vector propio {w} a él asociado. 2º) Una matriz [B] que tenga los mismos vectores propios que [A] y los mismos valores propios salvo �1 que no es valor propio de [B] pasando a ser el valor 0 un valor propio de [B]. 3º) El valor propio de mayor módulo �2 de [B] y un vector propio {q} a él asociado.

El programa debe trabajar con 30 dígitos significativos y se aplicará al calculo de los dos valores propios de mayor módulo de la matriz:

[ ]1 3 31 5 31 1 1

− −⎡ ⎤⎢ ⎥= ⎢ ⎥⎢ ⎥− −⎣ ⎦

A

En las llamadas al procedimiento metpot se considerarán además ε = 10-25 , maxiter = 100 y como vector {v} con el que iniciar el proceso un vector con todas sus componentes iguales a la unidad.

(Calificación de cada apartado: a) 1 punto, b) 2 puntos, c) 2 puntos) Solución: a) > restart; > metpot:=proc(n, eps, maxiter,v, A, lambda, w, iter) local i, j, tole, beta, v0, r: v0:=vector(n): r:=vector(n): i:=0: tole:=2*eps: v0:=evalm(v): while ((i<maxiter) and (tole > eps)) do i:=i+1: r:=evalm(A&*v0): beta:= r[1]:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

79

for j from 2 to n by 1 do if (abs(r[j]) > abs(beta)) then beta:=r[j]: fi: od: w:=evalm((1/beta)*r): tole:=norm(evalm(v0-w),2): v0:=evalm(w): od: lambda:=beta: iter:=i: end: > save metpot,"metpot.m": > fin_del_procedimiento_metpot;

fin_del_procedimiento_metpot

b) > restart: > hotelling:=proc(n,lambda1,v, A ,B) local b, H, i, j, S, ST, U, y: S:=matrix(n+1,n): b:=matrix(n+1,1): y:=vector(n): for i from 1 to n by 1 do for j from 1 to n by 1 do if (i = j) then S[i,i]:=lambda1-A[i,j]: else S[i,j]:=-A[j,i]: fi: od: od: for j from 1 to n by 1 do S[n+1,j]:=v[j]: b[j,1]:=0: od: b[n+1,1]:=1: H:=augment(S,b): U:=gausselim(H): U[n+1,n+1]:=0: y:=backsub(U): B:=evalm(A-lambda1*evalm(v&*transpose(y))): end: > save hotelling,"hotelling.m": > fin_del_procedimiento_hotelling;

fin_del_procedimiento_hotelling

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

80

c) > restart; > with(linalg): Warning, the protected names norm and trace have been redefined and unprotected > Digits:=30: > n:=3:A:=matrix(n,n,[1,-3,-3,1.,5.,3.,-1.,-1.,1.]);

:= A⎡

⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥

1 -3 -31. 5. 3.-1. -1. 1.

> read "metpot.m": read "hotelling.m": > v:=vector(n,[1,1,1]): vp1:=vector(n): eps:=1*10^(-25.): maxiter:=100: > metpot(n, eps, maxiter, v, A, lambda1, vp1, iter): > iter;

84

> lambda1;evalm(vp1); 3.99999999999999999999999979320

-0.999999999999999999999999948300 1.00000000000000000000000000000, ,[-0.51698030635268301706831371091810-25 ]

> B:=matrix(n,n): hotelling(n,lambda1,vp1, A,B): > evalm(B);

1.00000000000000000000000027573 1.00000000000000000000000006892[ , ,1.00000000000000000000000006892]0.999999999999999999999999724267 0.99999999999999999999999972428[ , ,

-1.00000000000000000000000027572][ , , ]-1. -0.999999999999999999999999793208 1.00000000000000000000000020679

> v:=vector(n,[1,1,1]): vp2:=vector(n): > metpot(n, eps, maxiter, v, B, lambda2, vp2, iter2);

84

> lambda2;evalm(vp2); 2.00000000000000000000000015509

0.77549999999999999999999993986510-25 1.00000000000000000000000000000, ,[-1.00000000000000000000000000000]

> fin_del_tercer_ejercicio; fin_del_tercer_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

81

Examen de Laboratorio (Convocatoria de septiembre) Fecha: 18 – IX – 2003 (Grupos 5 y 6)

Primer ejercicio (2,5 puntos) Dada una matriz cuadrada de elementos reales cualquiera, A, de dimensión (n,n), se puede formar la matriz B:

00T

AA

⎛ ⎞= ⎜ ⎟

⎝ ⎠B (1)

es simétrica y no singular. Se pide realizar un programa MAPLE que, dada una matriz cuadrada A, de elementos reales y dimensión (n,n): a) Construya una matriz B de la forma (1) b) Busque en B el elemento de mayor valor absoluto. c) Intercambie en B la fila y la columna donde se encuentre este elemento

de mayor valor absoluto por la primera fila y la primera columna respectivamente. Por ejemplo: si el elemento de mayor valor absoluto es el b3,5, habrá que intercambiar entre sí las filas 1 y 3, y las columnas 1 y 5.

Solución: > restart: > with(linalg): Warning, the protected names norm and trace have been redefined and unprotected > n:=2: > A:=matrix(n,n,[[1.,2.],[3.,4.]]): B:=matrix(2*n,2*n): Construye la matriz B > for i from 1 to n do for j from 1 to n do B[i,j]:=0.: B[i+n,j+n]:=0.: od: od: > for i from 1 to n do for j from n+1 to 2*n do B[i,j]:=A[i,j-n] od: od: > for i from n+1 to 2*n do

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

82

for j from 1 to n do B[i,j]:=A[j,i-n] od: od: > print(B);

⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥

0. 0. 1. 2.0. 0. 3. 4.1. 3. 0. 0.2. 4. 0. 0.

Busca el elemento de mayor valor absoluto > mayor:=abs(B[1,1]):ifila:=1:jcol:=1: > for i from 1 to 2*n do for j from 1 to 2*n do if abs(B[i,j]) > mayor then mayor:=abs(B[i,j]): ifila:=i: jcol:=j: fi: od: od: > print(mayor,ifila,jcol);

, ,4. 2 4

Intercambia fila y col por la primera fila y la primera columna respectivamente > for i from 1 to 2*n do aux:=B[1,i]: B[1,i]:=B[ifila,i]: B[ifila,i]:=aux: od:

> for i from 1 to 2*n do aux:=B[i,1]: B[i,1]:=B[i,jcol]: B[i,jcol]:=aux: od: > print(B);

⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥

4. 0. 3. 0.2. 0. 1. 0.0. 3. 0. 1.0. 4. 0. 2.

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

83

Segundo ejercicio (2,5 puntos) Dado un sistema de ecuaciones lineales Ax = b, donde A es una matriz cuadrada, de elementos reales y dimensión (n,n), puede resolverse expresando la matriz A como producto de dos matrices: L, triangular inferior y U, triangular superior. Así, el problema se transforma en resolver los dos sistemas triangulares: Ly = b y Ux = y. A continuación se presenta un algoritmo para la factorización LU de la matriz A denominado método de Crout. Dados A, n Desde k = 1 hasta n, hacer: Desde i = k hasta n, hacer:

( ) ( )1

1( , ) ( , ) , ,

k

pA i k A i k A i p A p k

=

← − ∑

Terminar para i Desde i = k+1 hasta n, hacer:

( ) ( )

( )

1

1

( , ) , ,( , )

,

k

p

A k i A k p A p iA k i

A k k

=

⎛ ⎞−⎜ ⎟

⎝ ⎠←∑

Terminar para i Terminar para k Al ejecutar el algoritmo precedente, se obtiene una nueva matriz A. Las matrices L y U correspondientes a la factorización de la matriz A original son:

11 12 1

21 22 2

1 2

0 0 10 0 1

0 0 1

n

n

n n nn

a a aa a a

a a a

⎛ ⎞ ⎛ ⎞⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟= =⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟

⎝ ⎠⎝ ⎠

L U

… …… …

… …

Se pide:

a) Realizar un programa MAPLE que implemente el algoritmo precedente, completándolo con la creación de las matrices L y U a partir de la matriz A transformada.

b) Aplicar el programa a un ejemplo con al menos n = 4 y comprobar

que, efectivamente, A = LU Solución:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

84

> restart: > with(linalg): Warning, the protected names norm and trace have been redefined and unprotected > n:=4: > A:=matrix(n,n,[[1.,2.,3.,4.],[2.,0.,4.,5.],[3.,4.,5.,6.],[4.,5.,6.,7.]]): > L:=matrix(n,n): U:=matrix(n,n): > print(A);

⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥

1. 2. 3. 4.2. 0. 4. 5.3. 4. 5. 6.4. 5. 6. 7.

Factoriza la matriz A > for k from 1 to n do for i from k to n do aux:=A[i,k]: A[i,k]:= aux - sum(A[i,p]*A[p,k],p=1..k-1): od: for i from k+1 to n do aux:=A[k,i]: aux2:=A[k,k]: A[k,i]:= (aux - sum(A[k,p]*A[p,i],p=1..k-1))/aux2: od: od: > print(A);

⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥

1. 2.000000000 3.000000000 4.0000000002. -4.000000000 0.5000000000 0.75000000003. -2.000000000 -3.000000000 1.5000000004. -3.000000000 -4.50000000 0.

Obtiene las matrices L y U > for i from 1 to n do for j from 1 to n do if i>=j then L[i,j]:=A[i,j]: U[i,j]:=0. else L[i,j]:=0.: U[i,j]:=A[i,j]: fi: od:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

85

U[i,i]:=1.: od: print(L,U);

⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥

1. 0. 0. 0.2. -4.000000000 0. 0.3. -2.000000000 -3.000000000 0.4. -3.000000000 -4.50000000 0.

,

⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥

1. 2.000000000 3.000000000 4.0000000000. 1. 0.5000000000 0.75000000000. 0. 1. 1.5000000000. 0. 0. 1.

> evalm(L&*U); ⎡

⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥

1. 2.000000000 3.000000000 4.0000000002. 0. 4.000000000 5.0000000003. 4.000000000 5.000000000 6.0000000004. 5.000000000 6.00000000 7.000000000

> fin_del_ejercicio; fin_del_ejercicio

Tercer ejercicio (5 puntos)

El intercambiador de calor de la figura se utiliza para calentar una corriente permanente de m (lb/h) de un fluido, de una temperatura T1 de entrada a una T2 de salida. Esto se consigue condensado continuamente en la celda un vapor saturado, manteniendo su temperatura, Ts , constante.

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

86

La longitud necesaria del intercambiador viene dada por:

( )2

1

Tp

sT

cmL dTD h T Tπ

=−∫ (1)

donde D es el diámetro del tubo. El coeficiente local de transmisión de calor, h, viene dado por:

0.40.80.23 4 pck mh

D D kµ

π µ⎛ ⎞⎛ ⎞

= ⎜ ⎟⎜ ⎟⎝ ⎠ ⎝ ⎠

(2)

donde cp (calor específico), µ (viscosidad) y k (conductividad térmica del fluido) dependen de la temperatura. En el caso del glicol etileno líquido, éstos vienen dados por:

( )( )

( )

0

0

2 3

0.53 0.00065 BTU/lb F

0.153 BTU/hr ft F

242 5.0372 0.0461 0.0002 lb/ft h

pc T

k

T T Tµ

= +

=

= − + −

(3)

Se pide:

e) Escribir un procedimiento en MAPLE que determine el coeficiente local de transmisión de calor del glicol etileno líquido para una temperatura dada utilizando las expresiones (2) y (3).

f) Escribir un procedimiento en MAPLE que calcule la longitud del

intercambiador integrando numéricamente mediante la fórmula de Simpson la expresión (1).

g) Aplicar al caso:

m=45000 lb/hr T1 = 0 ºF T2 = 90 ºF Ts = 250 ºF D = 1.032 in

NOTAS: (1) La fórmula de Simpson es:

( ) ( ) ( )46 2

b

a

b a a bf x dx f a f f b− ⎛ + ⎞⎛ ⎞≈ + +⎜ ⎟⎜ ⎟⎝ ⎠⎝ ⎠∫

(2) El procedimiento descrito en b) deberá llamar al descrito en a) para

calcular cp y h para cada temperatura. Solución:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

87

> restart: Procedimiento para el cálculo de los coeficientes cp, k, mu y h > coef:=proc(cp,k,mu,D,m,T,h) cp:=0.53 + 0.00065*T; k:=0.153; mu:=242.-5.0372*T+0.0461*T*T-0.0002*T*T*T; h:=(0.23*k/D)*((4*m/(3.1416*D*mu))**0.8)*((mu*cp/k)**0.4); end proc: Procedimiento para el cálculo de la longitud de la tubería (L) > longitud:=proc(m,T1,T2,Ts,D,L) local I1,I2,Imed,Tmed: coef(cp1,k1,mu1,D,m,T1,h1): print(cp1,k1,mu1,h1); I1:=cp1/(h1*(Ts-T1)); print(I1); Tmed:=(T1+T2)/2: coef(cpm,km,mum,D,m,Tmed,hm): print(cpm,km,mum,hm); Imed:=cpm/(hm*(Ts-Tmed)); print(Imed); coef(cp2,k2,mu2,D,m,T2,h2): print(cp2,k2,mu2,h2); I2:=cp2/(h2*(Ts-T2)); print(I2); L:=((T2-T1)/6)*(m/(3.1416*D))*(I1+4*Imed+I2): > end proc: > longitud(45000,0.,90.,250.,1.032,L):

, , ,0.53 0.153 242. 38.95836609 0.00005441706656

, , ,0.5592500000 0.153 90.45350000 59.00499521 0.00004623420053

, , ,0.58850 0.153 16.2620 119.6314970 0.00003074545661

> print(L); 56.23370347

> fin_del_ejercicio; fin_del_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

88

Examen de Laboratorio (Convocatoria de diciembre 2003) Fecha: 19 –XII – 2003 Hora: 16h 00m.

Primer ejercicio (2.5 puntos) Un cuerpo esférico de masa m y radio suficientemente pequeño es colocado en el centro de una cuerda elástica e impulsado en el instante inicial t = 0 hacia abajo con una velocidad V. Despreciando los efectos del rozamiento y del amortiguamiento elástico, el desplazamiento vertical y(t) del cuerpo esférico, en unidades físicas adecuadas puede ser calculado resolviendo la ecuación diferencial y”(t) = -(y(t))3 con las condiciones iniciales y(0) = 0, y’(0) = V. Una forma de obtener aproximaciones numéricas del desplazamiento del cuerpo consiste en seguir el proceso siguiente (que combina el método de Newton para resolver ecuaciones no lineales con el método de Numerov para resolver problemas de valor inicial):

a) Dividir el intervalo temporal [0, T] en el que se desean obtener valores aproximados en N subintervalos, de longitud h = T/(N-1), generando así los instantes de cálculo t1 = 0, t2 = h, ...., ti = (i-1)·h, ...., tN = (N-1)·h = T.

b) Considerar y1 = 0 , y calcular: ⎛ ⎞

= − +⎜ ⎟⎝ ⎠

2 44 8

2V Vy hV 1 h h20 480

c) Para i = 2, 3, .... (N-1) calcular yi+1 mediante la expresión:

− −

+

⎛ ⎞ ⎛ ⎞− + +⎜ ⎟ ⎜ ⎟

⎝ ⎠ ⎝ ⎠= −⎛ ⎞

−⎜ ⎟⎝ ⎠

2 22 2

i i i 1 i 1

i 1 i 22i

3·h hy · y 1 y · 1 y4 12

y yh1 y4

Se pide que escribas un programa MAPLE que, según el proceso descrito, calcule y represente en una gráfica los puntos ( ){ }

=

Ni i i 1

t ,y . Aplicar el programa

anterior al caso en que T = 60, N = 601, V = 0.025.

y(t)

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

89

Solución: > restart; > with(plots): Warning, the name changecoords has been redefined > tfin:=60.;v0:=0.025;n:=601;

:= tfin 60. := v0 0.025 := n 601

> y:=vector(n);t:=vector(n); := y ( )array ,.. 1 601 [ ] := t ( )array ,.. 1 601 [ ]

> t[1]:=0;y[1]:=0; := t1 0

:= y1 0

> delta:=tfin/(n-1); := δ 0.1000000000

> for i from 2 to n by 1 do t[i]:=t[i-1]+delta: od: > y[2]:=delta*v0*(1-(v0**2)*(delta**4)/20+(v0**4)*(delta**8)/480);

:= y2 0.002499999992

> for i from 2 to n-1 by 1 do alpha:=((3/4)*(delta*y[i])**2)-1: beta:=1 + (1/12)*(delta*y[i-1])**2: y[i+1]:=y[i]-((y[i]*alpha+y[i-1]*beta)/(1-(delta*y[i]/2)**2)): od: > ptos:=[seq([t[k],y[k]],k=1..n)]: > pointplot(ptos,symbol=box,color=blue);

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

90

> fin_del_primer_ejercicio;

fin_del_primer_ejercicio

Segundo ejercicio (2.5 puntos) En el algoritmo siguiente A denota una matriz de dimensiones ( n, m ), siendo n > m, b un vector de n elementos y x un vector de m elementos. Las variables representada por letras escritas en “negrita” representan matrices (si la letra es mayúscula) o vectores (si la letra es minúscula) de la dimensión correspondiente al resultado de la operación mediante la que se determinen. Las variables representadas por otras letras o nombres son escalares. Asimismo la notación (q , r) representa el producto escalar euclídeo del vector q por el vector r, es decir que si se supone que dichos vectores tienen m

elementos: =

= ∑m

i ii 1

( ) q ·rq,r . Por último se ha denotado por ||q||2 a la norma

euclídea dada por la expresión: = +2

( )q q,q .

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

91

Teniendo presente esta notación, se pide que escribas un programa MAPLE que refleje el siguiente algoritmo: Datos: n, m, A, b, x, ε. B AT·A c AT·b p AT·x f p σ (p , p) τ +σ1/2 r0 ||A·x – b||2

iter 0 Mientras (( iter < m) Y (τ > ε)) hacer: u B·f ρ σ / (f, u) x x + ρf p p - ρu δ σ σ (p , p) µ σ / δ f p + µf t +σ1/2 iter iter + 1 riter ||A·x – b||2

Fin bucle condicional. El programa que realices deberá escribir además el vector x obtenido al finalizar el proceso anterior y representar en una gráfica los puntos (k, log10( rk)) variando k entre 0 y el número de valores rk calculados. Utiliza el programa escrito con los datos n = 4, m = 3, ε = 10-5 y

⎡ ⎤⎢ ⎥⎢ ⎥=⎢ ⎥⎢ ⎥⎣ ⎦

0 0 14 0 10 4 15 6 1

A ,

⎧ ⎫⎪ ⎪−⎪ ⎪= ⎨ ⎬−⎪ ⎪⎪ ⎪−⎩ ⎭

0161661

b , ⎧ ⎫⎪ ⎪= ⎨ ⎬⎪ ⎪⎩ ⎭

000

x

Solución:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

92

> restart; > with(linalg):with(plots): Warning, the protected names norm and trace have been redefined and unprotected Warning, the name changecoords has been redefined > n:=4; m:=3; eps:=10.^(-5);

:= n 4 := m 3

:= eps 0.00001000000000

> A:=matrix(n,m,[[0,0,1.],[4,0,1],[0,4,1],[5,6,1]]); b:=vector(n,[0, -16, -16, -61]); x:=vector(m, [0, 0, 0]); r:=array(0..m):

:= A

⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥

0 0 1.4 0 10 4 15 6 1

:= b [ ], , ,0 -16 -16 -61 := x [ ], ,0 0 0

> r[0]:=norm(evalm(A&*x-b),2): > B:=evalm(transpose(A)&*A);c:=evalm(transpose(A)&*b);

:= B⎡

⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥

41 30 9.30 52 10.9. 10. 4.

:= c [ ], ,-369 -430 -93.

> p:=evalm(c-B&*x); := p [ ], ,-369. -430. -93.

> f:=evalm(p); := f [ ], ,-369. -430. -93.

> tau:=norm(f,2); := τ 574.2037966

> sigma:=dotprod(p,p); := σ 329710.

> iter:=0: > while ((iter < m) and (tau > eps)) do u:=evalm(B&*f): rho:=sigma/dotprod(f,u): x:=evalm(x+rho*f): p:=evalm(p-rho*u): delta:=sigma:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

93

sigma:=dotprod(p, p): mu:=sigma/delta: f:=evalm(p+mu*f): tau:=norm(p,2): iter:=iter+1: r[iter]:=norm(evalm(A&*x-b),2): od: > iter;

3

> evalm(x); [ ], ,-5.619047650 -5.753968296 3.777777742

> for i from 0 to iter by 1 do print(i, r[i]): od:

,0 65.06150936 ,1 8.888757947 ,2 8.002425546 ,3 6.057921481

> ptos:=[seq([k,log10(r[k])],k=0..iter)]: > pointplot(ptos,color=blue,connect=true);

> fin_del_segundo_ejercicio;

fin_del_segundo_ejercicio

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

94

Tercer ejercicio (5 puntos) En este ejercicio se pide que construyas dos procedimientos y un programa que permite calcular integrales definidas mediante el método de Romberg. a) Escribe un procedimiento llamado trapcom en el que usando como parámetros de entrada las variables “a” (que representará un número real), “b” (que representará otro número real superior al que represente “a”), “m” (que representará un número entero positivo) y “f” (que representará una función f(x)) se calcule como parámetro de salida un vector llamado “valor”, con (m+1) elementos, en el que el elemento i-ésimo se corresponde con el valor aproximado mediante la fórmula del trapecio compuesta de la función f(x) en el intervalo (a, b) utilizando (2i-1) subintervalos de idéntica longitud. Más concretamente, si para cada valor del índice “i” comprendido entre 1 y m (ambos inclusive) se denota por “k” al valor i 1k 2 −= se tiene que:

( )k

i jj 1

hvalor f (a) f (b) h f ( x )2 =

⎛ ⎞← + + ⎜ ⎟

⎝ ⎠∑ (i = 1, ..., m+1)

donde h = (b-a)/k y xj = a + (j-1)·h (j = 1, ..., k+1). Este procedimiento deberá ser salvado en el disquete de trabajo con el nombre trapcom.m. b) Escribe un procedimiento llamado romberg en el que usando como parámetros de entrada las variables “n” (que representará un número entero positivo), “m” (que representará un número entero positivo inferior o igual a “n”) y “v” (que representará un vector de “n” elementos) se calcule como parámetro de salida una matriz “A” de n filas y m columnas cuyos elementos se obtendrán como sigue:

• Los elementos de la primera columna de “A” se harán coincidir con los elementos del vector “v”

i ,1 iA v← (i = 1, ..., n)

• Los elementos de la columna j-ésima de “A” que estén ubicados

en la fila j o en filas con mayor subíndice se calculan a partir de los que se tienen en la columna anterior mediante la fórmula:

j 1i , j 1 i 1, j 1

i , j j 1

4 A AA

4 1

−− − −−

−←

− ( i = j, ..., n; j = 2, ..., m)

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

95

• A los elementos de la matriz “A” ubicados en la columna j-ésima

por encima de la fila j se les asignará valor nulo. Este procedimiento deberá ser salvado en el disquete de trabajo con el nombre romberg.m. c) Escribe un programa MAPLE en el que usando como datos los valores de las variables “a” (que representará un número real), “b” (que representará otro número real superior al que represente “a”), “m” (que representará un número entero positivo) y una función f(x), desarrolle los siguientes procesos:

• Utilice el procedimiento trapcom para calcular un vector “v” de (m+1) elementos en el que en su posición i-ésima se encuentre el

valor aproximado de b

a

f ( x )dx∫ mediante la fórmula del trapecio

compuesta con 2i-1 elementos. • Utilice el procedimiento romberg para, partiendo del vector “v”

calculado en el paso anterior, calcular una matriz “A” de dimensiones (m+1, m+1) según lo descrito en dicho procedimiento.

• Escriba la matriz “A” calculada con el procedimiento romberg.

Utiliza el programa escrito con a = 0, b = 1, m = 9 y 300 x

300

e 1f ( x )e 1

−=

−.

NOTA: Los elementos de la matriz A aproximan el valor de la integral b

a

f ( x )dx∫

siendo más precisos cuanto mayor es el índice de fila y de columna del elemento considerado.

Solución: a) > restart; > trapcom:=proc(a,b,m,f,valor) local h, i, j, k, nmax, x: nmax:=1+2**m: x:=array(0..nmax): for i from 1 to m+1 by 1 do k:=2**(i-1): h:=(b-a)/k:

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

96

x[0]:=a: for j from 1 to k by 1 do x[j]:=a+j*h: od: valor[i]:=h*(f(a)+f(b))/2: if (k > 1) then for j from 1 to (k-1) by 1 do valor[i]:=valor[i] + h*f(x[j]): od: fi: od: end: > save trapcom,"trapcom.m": > fin_procedimiento_trapcom;

fin_procedimiento_trapcom

b) > restart; > romberg:=proc(n,m,v,A) local i, j: for i from 1 to n by 1 do A[i,1]:=v[i]: od: for j from 2 to m by 1 do for i from 1 to (j-1) by 1 do A[i,j]:=0: od: for i from j to n by 1 do A[i,j]:= ((4**(j-1))*A[i,j-1]-A[i-1,j-1])/((4**(j-1))-1): od: od: end: > save romberg,"romberg.m": > fin_procedimiento_romberg;

fin_procedimiento_romberg

c) > restart; > read "trapcom.m": read "romberg.m": > f:=x->evalf((exp(300*x)-1)/(exp(300)-1)); a:=0;b:=1;m:=9;

:= f → x⎛

⎝⎜⎜⎜

⎠⎟⎟⎟evalf

− e( )300 x 1 − e300 1

:= a 0

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

97

:= b 1 := m 9

> intrapc:=vector(m+1): > trapcom(a,b,m,f,intrapc): > A:=matrix(m+1,m+1): > romberg(m+1,m+1,intrapc,A): > evalm(A); [ , , , , , , , , , ]0.5000000000 0 0 0 0 0 0 0 0 0[ , , , , , , , , , ]0.2500000000 0.1666666667 0 0 0 0 0 0 0 0[ , , , , , , , , , ]0.1250000000 0.08333333333 0.07777777773 0 0 0 0 0 0 00.06250000000 0.04166666667 0.03888888889 0.03827160494 0 0 0 0 0[ , , , , , , , , ,

0 ]0.03125000045 0.02083333393 0.01944444508 0.01913580311 0.01906076075[ , , , ,0 0 0 0 0, , , , , ]0.01562765079 0.01042020090 0.009725992033 0.009571730873[ , , , ,

0.009534224706 0.009524912354 0 0 0 0, , , , , ]0.007957738878 0.005401101573 0.005066494951 0.004992534681[ , , , ,

0.004974577047 0.004970119913 0.004969007631 0 0 0, , , , , ]0.004735581376 0.003661528873 0.003545557360 0.003521415492[ , , , ,

0.003515646397 0.003514220268 0.003513864737 0.003513775917 0 0, , , , , ]0.003706347925 0.003363270107 0.003343386189 0.003340177122[ , , , ,

0.003339466383 0.003339294164 0.003339251448 0.003339240790, , , ,0.003339238126 0, ]0.003428159490 0.003335430013 0.003333574007 0.003333418257[ , , , ,

0.003333391752 0.003333385814 0.003333384371 0.003333384013, , , ,0.003333383925 0.003333383903, ]

NOTA: Si se quiere escribir "A" con un aspecto "mas ordenado" como matriz, podemos reducir el número de digitos de cada número como se hace a continuación. > Digits:=4;

:= Digits 4

> A:=evalm(A);

:= A

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

0.50 0 0 0 0 0 0 0 0 00.25 0.17 0 0 0 0 0 0 0 00.12 0.083 0.078 0 0 0 0 0 0 00.062 0.042 0.039 0.038 0 0 0 0 0 00.031 0.021 0.019 0.019 0.019 0 0 0 0 00.016 0.010 0.0097 0.0096 0.0095 0.0095 0 0 0 00.0080 0.0054 0.0051 0.0050 0.0050 0.0050 0.0050 0 0 00.0047 0.0037 0.0036 0.0035 0.0035 0.0035 0.0035 0.0035 0 00.0037 0.0034 0.0033 0.0033 0.0033 0.0033 0.0033 0.0033 0.0033 00.0034 0.0033 0.0033 0.0033 0.0033 0.0033 0.0033 0.0033 0.0033 0.0033

Programación y Métodos Numéricos Examen de Laboratorio Carlos Conde, Arturo Hidalgo, Alfredo López Curso 2002- 2003

Universidad Politécnica de Madrid – ETSI Minas – Depto. Matemática Aplic. y Méts. Informát.

98

El valor exacto de la integral que se quiere calcular es: > evalf(int(f(x),x=a..b),10);

0.003333333333

Y hacia él convergen los elementos de cada columna a medida que aumenta el índice de fila, o los elementos de cada fila a medida que el índice de columna se aproxima más hacia el diagonal por la izquierda. Ello hace que los elementos diagonales tiendan, a medida que crece el índice de fila, hacia el valor exacto. > > fin_del_programa_del_tercer_ejercicio;

fin_del_programa_del_tercer_ejercicio