to get the file - OCW UPM - Universidad Politécnica de Madrid

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