| |
Boletín de problemas 6
Todos los cádigos
y las imágenes se han elaborado con software
Java
Fecha de entrega: viernes 5 de
abril de 2002
Problema 1. Sistemas de autobuses
(última vez, lo prometemos) 100 puntos
Descripción del problema
Las ecuaciones analíticas
que hemos utilizado para hallar los sistemas óptimos
de autobuses en los boletines de problemas 1 y 5 son
soluciones aproximadas de un sistema de ecuaciones no
lineales. En este ejercicio obtendremos las soluciones
numéricas de estas ecuaciones.
Utilizamos un conjunto de ecuaciones
más sencillo, basado en coordinadas cartesianas
en lugar de polares. Tenemos un conjunto de rutas
de autobuses paralelas que prestan servicio en una región
de densidad uniforme. Todos los viajes se dirigen
o se originan desde un punto fuera de la región
(por lo general, en una zona del centro de la ciudad)
a la que sirven los autobuses. Las rutas de los autobuses
están separadas por una distancia g, funcionan
con un intervalo h y el precio de un billete
es f. Los usuarios están uniformemente distribuidos
en el área de dimensión X por Y,
y andan en dirección perpendicular hasta la ruta
más cercana. Ignoramos el espaciado de las
paradas en las rutas, las dimensiones de las calles,
etc. Todo esto se podría incluir pero complicaría
el modelo. Se trata básicamente del mismo modelo
que el de los boletines 1 y 5 salvo que las rutas son
locales, no express; el usuario va andando a
la parada en lugar de conduciendo; y se utilizan coordenadas
cartesianas; todo esto simplifica el modelo.
Para minimizar el déficit
(o maximizar el beneficio), maximizamos la diferencia
de ingresos menos costes. Los ingresos son:
Ingresos= TpXYf(a0-a2(kh
+g/(4j))-a4f)
Costes= 2XTcY/(ghv)
donde
|
Nombre de la variable
|
Valor
|
Definición
|
Unidades
|
|
p
|
3.59
|
Densidad del viaje
|
Viajes/millas cuadradas/día
|
|
j
|
0.05
|
Velocidad a pie
|
Millas/minutos
|
|
k
|
0.4
|
Coeficiente de espera/intervalo
|
|
|
c
|
50
|
Coste de explotación
de autobús
|
Centavoss/minuto
|
|
T
|
1050
|
Duración del día
|
Minutos
|
|
V
|
0.167
|
Velocidad del autobús
|
Millas/minuto
|
|
a0
|
0.41
|
Cuota de mercado del autobús
si presta el mismo servicio que el automóvil
|
|
|
a2
|
0.0081
|
Coeficiente de tiempo de
espera del autobús
|
|
|
a4
|
0.0014
|
Coeficiente del precio del
billete de autobús
|
|
|
X
|
4.0
|
Anchura del área de
análisis
|
Millas
|
|
Y
|
6.0
|
Longitud del área
de análisis
|
Millas
|
Observe que los valores de la mayoría
de los parámetros son distintos a los ejercicios
previos.
El número total de viajes
en todos los modos de transporte (bus, auto, etc.) es
TpXY, o la densidad del viaje multiplicada por
el área y el periodo temporal. El número
de viajes de autobús es la cuota de mercado del
autobús multiplicada por el total de viajes;
la cuota de mercado del autobús es a0-a2(kh
+g/(4j))-a4f). Esta
es una aproximación lineal que calcula la cuota
de mercado en función del intervalo h,
el espaciado de ruta g (lo que determina la distancia
promedio a pie a la ruta de autobús), y el precio
del billete f. Los ingresos son el número
de viajes de autobús multiplicado por el precio
del billete f.
El coste del servicio de autobús
se deriva del modo siguiente: hay X/g
rutas, en cada una se realizan T/h viajes,
y dura cada una Y/v, multiplicada por
un factor de viaje de ida y vuelta (2) y el coste de
explotación por minuto c.
El precio del billete f
es en centavos. El intervalo h es en minutos
entre salidas de autobús. El espaciado en la
ruta g es en millas entre rutas.
En este ejercicio hallaremos los
valores óptimos del espaciado de ruta g,
del intervalo h y del precio del billete f. Para
ello, tomamos la derivada de la función del beneficio
(déficit) Q con respecto a g, h
y f. (Son derivadas parciales pero utilizamos
el símbolo d porque el lenguaje html
no es compatible con el símbolo de la derivada
parcial.)
| Q = TpXYf(a0-a2(kh
+g/(4j))-a4f) - 2XTcY/(ghv) |
|
| dQ/dg= -TpXYfa2/(4j)
+ 2XTcY/(vhg2) = 0 |
(1)
|
| dQ/dh= -TpXYfa2k
+ 2XTcY/(vgh2) = 0 |
(2)
|
| dQ/df= TpXY(a0-a2(kh
+g/(4j))-2a4f) = 0 |
(3)
|
Observe que T, X
y Y se desprenden de todas las ecuaciones. Vea
también que las ecuaciones (1) y (2) son muy
similarse y arrojan como resultado una relación
lineal entre el espaciado de ruta g y el intervalo
h:
|
h= g/(4jk)
|
(4)
|
| Utilice (4) para eliminar
h de (1): |
|
|
dQ/dg= -pfa2/(4j)
+ 8jkc/(vg3) = 0
|
(5)
|
| Utilice (4) para eliminar
h de (3): |
|
|
dQ/df=
a0-a2g/(2j)-2a4f
= 0
|
(6)
|
| Podemos resolver (5) y (6)
analíticamente, aproximadamente para obtener:
|
|
|
g= (64j2ka4c/
(pva0a2))1/3
|
(7)
|
|
f= a0/(2a4)
(kca22)/(ja42pva0))1/3
|
(8)
|
| Utilizando (4) también
podemos hallar una solución aproximada para
el intervalo h: |
|
|
h= (a4c/
(pa0a2k2jv))1/3
|
(9)
|
Las soluciones aproximadas (7)-(9)
tienen errores. Se pueden utilizar para un análisis
inicial, pero si se necesitan respuestas exactas, debemos
resolver numéricamente las ecuaciones (1)-(3).
Como (2) y (3) son linealmente dependientes, sólo
hemos de resolver las ecuaciones (5) y (6) y, a continuación,
utilizar (4) para obtener el intervalo óptimo
h.
Examinemos el sistema de dos ecuaciones
no lineales que debemos resolver:
| -pfa2/(4j) + 8jkc/(vg3)
= 0 |
(0)
|
| a0-a2g/(2j)-2a4f
= 0 |
(1)
|
Numeremos las ecuaciones como 0
y 1: necesitaremos un array y será conveniente
numerarlo empezando por 0. Hagamos que la variableg
sea x0 y la variable f sea
x1, a fin de que encajen en el método
general para resolver este sistema. Reescriba (0) y
(1) utilizando x0 y x1,
y simplifique coeficientes:
| f0(x0 ,x1)=
-0.25pa2x1/j + 8jkc/(vx03)
= 0 |
(0)
|
| f1(x0 ,x1)=
a0 - 0.5a2x0/j
- 2a4x1 = 0 |
(1)
|
Utilizaremos el método de
Newton de dos dimensiones para resolver este sistema. Este
método necesita las derivadas de cada ecuación
con respecto a cada variable. De nuevo, se trata de
derivadas parciales, pero utilizamos el símbolo
d:
| df0/dx0 =
-24jkc/(vx04) |
(a)
|
| df0/dx1 =
-0.25pa2/j |
(b)
|
| df1/dx0 =
-0.5a2/j |
(c)
|
| df1/dx1 =
-2a4 |
(d)
|
Las ecuaciones (0)
y (1) se pueden resolver con una versión
bidimensional del método de Newton, utilizando
las derivadas (a)-(d).
Método de Newton en dos
dimensiones
Tenemos dos funciones f0(x0
,x1) y f1(x0
,x1) y queremos aproximar una
solución del sistema f0= 0
y f1= 0. En la vecindad de xi
cada función fi se puede expandir
utilizando una serie Taylor:
| f0(x0+
dx0, x1+
dx1)= f0(x0
,x1) + (df0/dx0)
dx0 + (df0/dx1)
dx1
+
|
(e)
|
| f1(x0+
dx0, x1+
dx1)= f1(x0
,x1) + (df1/dx0)
dx0 + (df1/dx1)
dx1
+
|
(f)
|
Si definimos f0(x0+
dx0, x1+
dx1)= 0 y f1(x0+
dx0, x1+
dx1)=0, obtenemos, en notación
matricial:
 |
(g)
|
Puede ver que ésta es
la extensión bidimensional del Método
de Newton vista en clase.
Ahora tenemos que resolver la ecuación
matricial (g) para dx0 y dx1,
los tamaños de pasos para aproximarse a las soluciones
de las dos ecuaciones.
Mientras vemos esta semana en clase
métodos para resolver sistemas lineales generales,
para esta tarea podemos usar un método sencillo
que recordará de algebra llamada la regla de
Cramer. En dos dimensiones es especialmente sencillo.
Para un sistema:
|
(j)
|
| x0
= (a11 b0 -
a01 b1)/ (a00
a11 - a01 a10) |
(k)
|
| x1
= (- a10 b0
+ a00 b1)/
(a00 a11 - a01
a10) |
(l)
|
Como las derivadas parciales dfi/dxj
y los valores de función fi(x0
,x1) son conocidos, podemos
resolver para los tamaños de paso dx0
y dx1 utilizando (k) y (l).
Trabajo
Escriba un programa que resuelva
las ecuaciones (0) y (1) numéricamente
para hallar los valores óptimos del espaciado
de ruta g y del precio del billete f. Utilice
la ecuación (4) para hallar el intervalo h. Detalles:
1.
Escriba una clase y un método Newton en 2D similar
al método Newton en 1D visto en clase:
- Defina una interfaz que
contenga los métodos apropiados que el método
de Newton necesita. A continuación, se
muestra una posible interfaz, pero usted puede utilizar
la que quiera.
En la función siguiente, tenga en cuenta los
argumentos jj y kk. Los argumentos
extra jj y kk adoptan los valores 0
y 1, correspondientes a las dos dimensiones de nuestras
entradas.
Necesitamos un argumento extra 1 en el método
f() para elegir qué dimensión de la
función estamos evaluando.
Necesitamos 2 argumentos extra en df() para elegir
la dimensión que estamos diferenciando parcialmente
(jj), y la dimensión que diferenciamos
parcialmente con respecto a (kk).
public
interface MathFunction2D
{
// Function value for function j
public double f(int jj, double[] x);
// Partial derivative, function j, variable k
public double df(int jj, int kk, double[] x);
}
-
Fije en 50 las
iteraciones máximas y la tolerancia en 10-15.
La tolerancia es ridícula para este problema,
pero en general es una buena práctica fijarla
baja.
- El código es bastante
corto para el método: calcula los valores derivativos
y de función e invoca la regla de Cramer para
hallar el tamaño del paso dx, hasta
que el valor absoluto de ambas funciones es menor
que la tolerancia.
- Observe que la regla de Cramer
resuelve el paso dx, no el nuevo x;
ha de añadir el paso al cálculo actual
de x para obtener el siguiente cálculo. Tenga
cuidado con las convenciones de los signos; tenga
en cuenta que los valores de la función en
la ecuación (g) son negativos, por ejemplo.
Compruebe que el denominador en las ecuaciones (k)
y (l) no sea demasiado pequeño (o cero).
- Como el método de Newton
de 2D es tan sencillo, usted puede aplicar la regla
Cramer dentro del mismo cuerpo del método.
En un método de Newton n-dimensional
más general, se utilizaría un método
de eliminación gaussiano para resolver el sistema
lineal.
- No utilice contadores de bucles
de valores enteros con los nombres j o k;
entrarán en conflicto con las variables dobles
j y k.
2.
Escriba una clase para generar las funciones, derivadas
y las suposiciones iniciales.
Convendrá que las ponga todas en una clase ya
que comparten muchos parámetros. La clase debería:
- Implementar la interfaz MathFunction2D
(o la que usted haya creado).
- Implementar los métodos
para calcular las soluciones analíticas aproximadas
utilizando (7), (8) y (9). Utilice las soluciones
aproximadas de (7) y (8) como
suposiciones iniciales para su método
de Newton en 2D.
- Escriba los métodos setXXX()
y getXXX() necesarios (véase a continuación)
3.
Escriba una clase test con un método main() (o
incluya el main() en otra clase):
- Permita que el usuario introduzca
una variedad de densidades p para obtener el
espaciado de ruta, el intervalo y el
precio del billete óptimos. Puede
asumir un incremento de 0.5 unidades en densidad. Un
intervalo de densidad típico sería 2.0
a 4.0.
- Para cada densidad, muestre
las soluciones numéricas y aproximadas del
espaciado de ruta, el intervalo y el precio del billete.
Muestre también las suposiciones iniciales,
el número de iteraciones y el valor de las
dos funciones al final de los métodos numéricos.
- Del mismo modo, compruebe
el método de Newton con suposiciones iniciales
para las variables de:
- 0
- 0.0001
- 10
- No es necesario que escriba
un método main() separado para ejecutar estas
pruebas de las peticiones iniciales: podría
simplemente modificar temporalmente el main() existente.
Aunque no es necesario que entregue esta versión
del código, debe incluir un breve comentario
al final del método main() ordinario, describiendo
lo que sucede y por qué.
Puntuación extra (solución
IGU) 40 puntos
En los boletines de problemas 6
a 10, tiene la posibilidad de implementar una interfaz
gráfica de usuario en Swing para obtener 40 puntos
extra de nota. Esta solución se aplicará
unica y exclusivamente a uno de los boletines; le rogamos
que incluya un comentario en la parte superior del método
main() en el que indique la puesta en práctica
de esta solución.
Para la parte de nota extra del boletín de problemas
6, ponga en marcha una interfaz gráfica de usuario
(IGU) para que el usuario pueda elegir una densidad
(usando un control deslizante, que oscile entre los
valores 2.0 y 4.0), y luego muestre los resultados numéricos
del programa en formato texto en la IGU. Muestre las
mismas cantidades especificadas en el enunciado del
problema. Si lo desea, puede dibujar las rutas y su
espaciado tal y como se muestra en la figura del boletín
de problemas, pero no es obligatorio.
La interfaz debería tener
aproximadamente el siguiente aspecto:

Entrega del trabajo
Requisitos
- Problema 1: solamente por correo
electrónico. No es necesario entregarlo en
papel.
- Problemas 2 y 3: copia en papel
y copia electrónica de TODOS los códigos
fuente (todos los archivos con la extensión
.java).
- Incluya en TODOS los archivos
que presente su nombre, el nombre de usuario, la sección,
el nombre del profesor ayudante, el número
de trabajo y una relación de las personas con
las que haya comentado el boletín de problemas.
- NO entregue copias electrónicas
o en papel de código compilado (archivos .class).
Sanciones
- Por pérdida de copia
en papel: -10% de la puntuación del boletín
de problemas.
- Por pérdida de copia
electrónica: -30% de la puntuación del
boletín de problemas.
- Por entrega fuera del plazo:
-20% de la puntuación del boletín de
problemas si es un día de retraso. Por
más de un día de retraso = NO SE PUNTUARÁ
|