Ejercicio: 3Eva_2024PAOII_T1 Accidente entre aeronaves
literal a
La distancia entre las aeronaves se determina a partir de las ecuaciones proporcionadas en el enunciado.
d = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2 + (z_2-z_1)^2}
La ecuación también mantiene la forma y el mínimo si se utiliza el cuadrado de la distancia:
D = d^2 = (x_2-x_1)^2 + (y_2-y_1)^2 + (z_2-z_1)^2
Las diferencias de distancia por eje pueden ser convergentes hacia el punto de impacto, dado que se conoce que el accidente ya ocurrió. Por lo que también se pueden revisar las distancias entre ejes en lugar de la distancia total en 3D, simplificando un poco el ejercicio. Observe la gráfica proporcionada:

Avión |
Helicóptero |
distancia por eje |
Ax(t) = 5.1 |
Hx(t) = 0.5t |
|0.5t-5.1| |
Ay(t) = 0.4t |
Hy(t) = sin(0.1t)cos(0.7t)+3.7 |
|sin(0.1t)cos(0.7t) + 3.7-0.4| |
Az(t) = 0.5 e^{-0.2t} + 0.3 |
Hz(t) = 0.36 |
|0.36 – (0.5 e^{-0.2t} + 0.3)| |
D = (0.5t-5.1)^2 + (sin(0.1t)cos(0.7t)+3.7-0.4t)^2 + (0.36-(0.5 e^{-0.2t} + 0.3))^2
dx =0.5t-5.1
dy = sin(0.1t)cos(0.7t) + 3.7-0.4
dz = 0.36 - (0.5 e^{-0.2t} + 0.3)
Se realiza la gráfica para la distancia al cuadrado Di y las distancias por cada eje dxi, dyi, dzi :

Por lo que el resultado también se podría determinar usando por ejemplo el eje y. La ecuación a buscar la distancia mínima, punto de choque o cruce por cero podría ser:
f(t) =dy(t)= sin(0.1t)cos(0.7t) + 3.7-0.4t = 0
literal b
Por la gráfica se puede obtener un intervalo de búsqueda entre [8, 12], que usando solo las distancias en el eje y, se tiene:
dy(8) =1.0563
dy(12) =-1.5839
literal c
Se pide usar un método de búsqueda de raíces, pudiendo seleccionar Bisección en el intervalo encontrado en el literal b.
iteración 1
a = 8, b=12
c = \frac{a+b}{2} = \frac{8+12}{2} = 10
f(8) = 1.0563
f(10) =sin(0.1(10))cos(0.7(10)) + 3.7-0.4(10) = 0.3343
f(12) = -1.5839
cambio de signo a la derecha
a = 10, b = 12
tramo = |12-10| =2
iteración 2
a = 10, b=12
c = \frac{10+12}{2} = 11
f(11) =sin(0.1(11))cos(0.7(11)) + 3.7-0.4(11) = -0.5633
cambio de signo a la izquierda
a = 10, b = 11
tramo = |11-10| = 1
iteración 3
a = 10, b=11
c = \frac{10+11}{2} = 10.5
f(10.5) =sin(0.1(10.5))cos(0.7(10.5)) + 3.7-0.4(10.5) = -0.0811
cambio de signo a la izquierda
a = 10, b = 10.5
tramo = |10.5-10| = 0.5
literal d
La variable independiente en el ejercicio es tiempo ‘t’, que podría ser segundos. Si la tolerancia se estima en milisegundos, tolera = 10-3 .
El error se ha calculado en cada iteración
literal e
El error disminuye en cada iteración, por lo que el método converge.
La distancia mínima entre las aeronaves no tiene que llegar a cero para que se produzca un accidente. Las dimensiones de las aeronaves muestran que se encuentran entre 70m y 4 m, por lo que se estima que debe existir una separación mayor a 70 metros en cualquiera de los ejes para evitar un accidente. Si las coordenadas se estiman en Km, la tolerancia sería de 0.070 Km al considerar más de 70 metros como la distancia segura.
literal f
Usando el algoritmo se encuentra la raíz en:
i ['a', 'c', 'b'] ['f(a)', 'f(c)', 'f(b)']
tramo
0 [8, 10.0, 12] [ 1.0564 0.3344 -1.584 ]
2.0
1 [10.0, 11.0, 12] [ 0.3344 -0.5633 -1.584 ]
1.0
2 [10.0, 10.5, 11.0] [ 0.3344 -0.0811 -0.5633]
0.5
3 [10.0, 10.25, 10.5] [ 0.3344 0.1368 -0.0811]
0.25
4 [10.25, 10.375, 10.5] [ 0.1368 0.0302 -0.0811]
0.125
5 [10.375, 10.4375, 10.5] [ 0.0302 -0.0249 -0.0811]
0.0625
6 [10.375, 10.40625, 10.4375] [ 0.0302 0.0028 -0.0249]
0.03125
7 [10.40625, 10.421875, 10.4375] [ 0.0028 -0.011 -0.0249]
0.015625
8 [10.40625, 10.4140625, 10.421875] [ 0.0028 -0.0041 -0.011 ]
0.0078125
9 [10.40625, 10.41015625, 10.4140625] [ 0.0028 -0.0007 -0.0041]
0.00390625
10 [10.40625, 10.408203125, 10.41015625] [ 0.0028 0.001 -0.0007]
0.001953125
11 [10.408203125, 10.4091796875, 10.41015625] [ 0.001 0.0002 -0.0007]
0.0009765625
raíz en: 10.4091796875
Por lo que las coordenadas de choque entre aeronaves será:
Avión |
Helicóptero |
distancia por eje |
Ax(t) = 5.1 |
Hx(t) = 0.5 (10.40) = 5.2 |
|5.1-5.2| = 0.1 |
Ay(t) = 0.4(10.4) = 4.16 |
Hy(t) = sin(0.1(10.40))cos(0.7(10.40))+3.7 = 4.168 |
|4.16 – 4.168| = 0.008 |
Az(10.4) = 0.5 e^{-0.2(10.4)} + 0.3
= 0.3624 |
Hz(t) = 0.36 |
|0.3624 – 0.36| = 0.0024 |
Instrucciones en Python para Gráfica de distancias
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
# INGRESO
# Avión Aterriza
Ax = lambda t: 5.1 + 0*t
Ay = lambda t: 0.4*t
Az = lambda t: 0.5*np.exp(-0.2*t) + 0.3
# helicóptero
Hx = lambda t: 0.5*t + 0*t
Hy = lambda t: np.sin(0.10*t)*np.cos(0.7*t)+ 3.7
Hz = lambda t: 0.36 + 0*t
a = 0
b = 6/0.5 # x entre[0,6] usando gx(t)= 6
muestras = 41
# PROCEDIMIENTO
# Distancia por ejes
dx = lambda t: Hx(t) - Ax(t)
dy = lambda t: Hy(t) - Ay(t)
dz = lambda t: Hz(t) - Az(t)
# Distancia 3D
distancia2 = lambda t: dx(t)**2 + dy(t)**2 + dz(t)**2
# Simulacion en segmento t=[a,b]
ti = np.linspace(a,b,muestras)
dxi = dx(ti)
dyi = dy(ti)
dzi = dz(ti)
Di = distancia2(ti)
# SALIDA
print(dy(8))
print(dy(12))
plt.plot(ti,Di, label='Di')
plt.plot(ti,dxi,label='dxi')
plt.plot(ti,dyi,label='dyi')
plt.plot(ti,dzi,label='dzi')
plt.xlabel('ti')
plt.ylabel('distancia2')
plt.grid()
plt.legend()
plt.show()
Instrucciones en Python – Algoritmo Bisección
# 3Eva_2024PAOII_T1 Accidente entre aeronaves
# Algoritmo de Bisección
# [a,b] se escogen de la gráfica de la función
# error = tolera
import numpy as np
import matplotlib.pyplot as plt
# Algoritmo de Bisección
# [a,b] se escogen de la gráfica de la función
# error = tolera
import numpy as np
def biseccion(fx,a,b,tolera,iteramax = 20, vertabla=False, precision=4):
'''
Algoritmo de Bisección
Los valores de [a,b] son seleccionados
desde la gráfica de la función
error = tolera
'''
fa = fx(a)
fb = fx(b)
tramo = np.abs(b-a)
itera = 0
cambia = np.sign(fa)*np.sign(fb)
if cambia<0: # existe cambio de signo f(a) vs f(b)
if vertabla==True:
print('método de Bisección')
print('i', ['a','c','b'],[ 'f(a)', 'f(c)','f(b)'])
print(' ','tramo')
np.set_printoptions(precision)
while (tramo>=tolera and itera<=iteramax):
c = (a+b)/2
fc = fx(c)
cambia = np.sign(fa)*np.sign(fc)
if vertabla==True:
print(itera,[a,c,b],np.array([fa,fc,fb]))
if (cambia<0):
b = c
fb = fc
else:
a = c
fa = fc
tramo = np.abs(b-a)
if vertabla==True:
print(' ',tramo)
itera = itera + 1
respuesta = c
# Valida respuesta
if (itera>=iteramax):
respuesta = np.nan
else:
print(' No existe cambio de signo entre f(a) y f(b)')
print(' f(a) =',fa,', f(b) =',fb)
respuesta=np.nan
return(respuesta)
# INGRESO
fx = lambda t: np.sin(0.10*t)*np.cos(0.7*t)+ 3.7 - 0.4*t
a = 8
b = 12
tolera = 0.001
# PROCEDIMIENTO
respuesta = biseccion(fx,a,b,tolera,vertabla=True)
# SALIDA
print('raíz en: ', respuesta)