s1Eva2018TII_T2 Distancia mínima a un punto

Ejercicio: 1Eva2018TII_T2 Distancia mínima a un punto

1Eva2018TII_T2 Distancia Minima Punto 01 ani

Literal a

Se requiere analizar la distancias entre una trayectoria y=ex con el punto=[1,1]

Distancia Mínima Punto

Al analizar las distancias de ex y el punto [1,1] se trazan lineas paralelas a los ejes desde el punto [1,1], por lo que se determina que el intervalo de x = [a,b] para distancias se encuentra en:

a > 0, a = 0.1
b < 1, b = 0.7

El ejercicio usa la fórmula de distancia entre dos puntos:

d = \sqrt{(x_2-x_1)^2+(y_2- y_1)^2}

en los cuales:

[x1,y1] = [1,1]
[x2,y2] = [x, ex]

que al sustituir en la fórmula se convierte en:

d = \sqrt{(x-1)^2+(e^x- 1)^2}

que es lo requerido en el literal a


Literal b

Para usar un método de búsqueda de raíces, se requiere encontrar el valor cuando f(x) = d' = 0.

Un método como el de Newton Raphson requiere también f'(x) = d''

f(x) = \frac{x + (e^x - 1)e^x - 1}{\sqrt{(x - 1)^2 + (e^x - 1)^2}} f'(x)= \frac{(e^x - 1)e^x + e^{2x} + 1 - \frac{(x + (e^x - 1)e^x - 1)^2}{(x - 1)^2 + (e^x - 1)^2}} {\sqrt{(x - 1)^2 + (e^x - 1)^2}}

expresiones obtenidas usando Sympy

f(x):
    ______________________
   ╱                    2 
  ╱         2   ⎛ x    ⎞  
╲╱   (x - 1)  + ⎝ℯ  - 1⎠  

df(x) :
       ⎛ x    ⎞  x        
   x + ⎝ℯ  - 1⎠⋅ℯ  - 1    
──────────────────────────
    ______________________
   ╱                    2 
  ╱         2   ⎛ x    ⎞  
╲╱   (x - 1)  + ⎝ℯ  - 1⎠  

d2f(x) :
                                              2
                         ⎛    ⎛ x    ⎞  x    ⎞ 
⎛ x    ⎞  x    2⋅x       ⎝x + ⎝ℯ  - 1⎠⋅ℯ  - 1⎠ 
⎝ℯ  - 1⎠⋅ℯ  + ℯ    + 1 - ──────────────────────
                                             2 
                                 2   ⎛ x    ⎞  
                          (x - 1)  + ⎝ℯ  - 1⎠  
───────────────────────────────────────────────
               ______________________          
              ╱                    2           
             ╱         2   ⎛ x    ⎞            
           ╲╱   (x - 1)  + ⎝ℯ  - 1⎠   
distancia minima Newton Raphson 01

lo que permite observar la raíz de f(x) en una gráfica:

con las siguientes instrucciones:

# Eva_IIT2018_T2 Distancia mínima a un punto
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym

# INGRESO
x = sym.Symbol('x')
fx = sym.sqrt((x-1)**2+(sym.exp(x) -1)**2)

a = 0
b = 1
muestras = 21

# PROCEDIMIENTO
dfx = sym.diff(fx,x,1)
d2fx = sym.diff(fx,x,2)

f = sym.lambdify(x,dfx)
xi = np.linspace(a,b,muestras)
fi = f(xi)

# SALIDA
print("f(x):")
sym.pprint(fx)
print('df(x) :')
sym.pprint(dfx)
print("d2f(x) :")
sym.pprint(d2fx)

# GRAFICA
plt.plot(xi,fi, label='df(x)')
plt.axhline(0)
plt.xlabel('x')
plt.ylabel('df(x)')
plt.title('Derivada de distancia entre trayectoria y punto')
plt.legend()
plt.grid()
plt.tight_layout()
plt.show()

Para no complicar mas las fórmulas se recurre a un método mas simple aunque requiera más iteraciones como el método de la bisección en el intervalo dado. Donde f(x) es la derivada al pasar por cero.

f(x) = \frac{x + (e^x - 1)e^x - 1}{\sqrt{(x - 1)^2 + (e^x - 1)^2}}

itera = 0 , a = 0, b=1

c= \frac{0+1}{2} = 0.5 f(0) = \frac{0 + (e^0 - 1)e^0 - 1}{\sqrt{(0 - 1)^2 + (e^0 - 1)^2}} = -1 f(1) = \frac{1 + (e^1 - 1)e^1 - 1}{\sqrt{(1 - 1)^2 + (e^1 - 1)^2}} 2.7183 f(0.5) = \frac{(0.5) + (e^(0.5) - 1)e^(0.5) - 1}{\sqrt{((0.5) - 1)^2 + (e^(0.5) - 1)^2}} = 0.6954

cambio de signo a la izquierda,

a= 0, b=c=0.5

tramo = |0.5-0| = 0.5

itera = 1

c= \frac{0+0.5}{2} = 0.25 f(0.25) = \frac{(0.25) + (e^(0.25) - 1)e^(0.25) - 1}{\sqrt{((0.25) - 1)^2 + (e^(0.25) - 1)^2}} = -0.4804

cambio de signo a la derecha,

a=c= 0.25, b=0.5

itera = 2

c= \frac{0.25+0.5}{2} = 0.375 f(0.375) = \frac{(0.375) + (e^(0.375) - 1)e^(0.375) - 1}{\sqrt{((0.375) - 1)^2 + (e^(0.375) - 1)^2}} = 0.0479

cambio de signo a la izquierda,

a= 0.25, b=c=0.375

se continúan las iteraciones con el algoritmo, para encontrar la raíz en 0.364:

método de Bisección
i ['a', 'c', 'b'] ['f(a)', 'f(c)', 'f(b)']
   tramo
0 [0, 0.5, 1] [-1.      0.6954  2.7183]
   0.5
1 [0, 0.25, 0.5] [-1.     -0.4804  0.6954]
   0.25
2 [0.25, 0.375, 0.5] [-0.4804  0.0479  0.6954]
   0.125
3 [0.25, 0.3125, 0.375] [-0.4804 -0.2388  0.0479]
   0.0625
4 [0.3125, 0.34375, 0.375] [-0.2388 -0.1004  0.0479]
   0.03125
5 [0.34375, 0.359375, 0.375] [-0.1004 -0.0274  0.0479]
   0.015625
6 [0.359375, 0.3671875, 0.375] [-0.0274  0.01    0.0479]
   0.0078125
7 [0.359375, 0.36328125, 0.3671875] [-0.0274 -0.0088  0.01  ]
   0.00390625
8 [0.36328125, 0.365234375, 0.3671875] [-0.0088  0.0006  0.01  ]
   0.001953125
9 [0.36328125, 0.3642578125, 0.365234375] [-0.0088 -0.0041  0.0006]
   0.0009765625
raíz en:  0.3642578125

Al algoritmo anterior se complementa con las instrucciones de la función para la bisección.

# 1Eva2018TII_T2 Distancia mínima a un punto
# 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 = 50, 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,np.array([a,c,b]),
                      np.array([fa,fc,fb]))
            if (cambia<0): # cambio de signo izquierda
                b = c
                fb = fc
            else: # cambio de signo derecha
                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)
 
# PROGRAMA ----------------------
# INGRESO
fx  = lambda x: (x + (np.exp(x) - 1)*np.exp(x) - 1)/np.sqrt((x - 1)**2 + (np.exp(x) - 1)**2)
a = 0
b = 1
tolera = 0.001
 
# PROCEDIMIENTO
c = biseccion(fx,a,b,tolera,vertabla=True)
# SALIDA
print('raíz en: ',c)

# GRAFICA
import matplotlib.pyplot as plt
 
muestras = 21 # en intervalo [a,b]
 
xj = np.linspace(a,b,muestras)
fj = fx(xj)
 
plt.plot(xj,fj, label='f(x)')
plt.plot(c,0,'o')
plt.axhline(0)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Biseccion')
plt.grid()
plt.legend()
plt.show()

Otros

Gráfica de trayectoria y punto, usada en el enunciado

# Eva_IIT2018_T2 Distancia mínima a un punto
import numpy as np
import matplotlib.pyplot as plt

# INGRESO
fx = lambda x: np.exp(x)
punto = [1,1]
xk = 0.25

a = 0
b = 2
muestras = 21

# PROCEDIMIENTO
xi = np.linspace(a,b,muestras)
fi = fx(xi)
fk = fx(xk)

# SALIDA
# GRAFICA
plt.plot(xi,fi, label='trayectoria')
plt.plot(punto[0],punto[1],'o', label='punto')
plt.plot(xk,fk,'o')
plt.axhline(punto[0], color='red',linestyle='dotted')
plt.axvline(punto[1], color='red',linestyle='dotted')
plt.axhline(0,color='gray')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Distancia mínima a un punto en trayectoria')
plt.legend()
#plt.grid()
plt.tight_layout()
plt.show()

Ejemplos por año