Ejercicio: 1Eva_IIT2018_T2 Distancia mínima a un punto
Literal a
Se requiere analizar la distancias entre una trayectoria y el punto = [1,1]
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 rango 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 encontrar el punto más cercano, se debe encontrar el mínimo de la distancia, se podría derivar la función y encontrar la raiz en cero.
Considere simplificar la función a un polinomio, donde tiene dos opciones:
b.1 Polinomio de Taylor, que también requiere derivadas (descartado)
b.2 evaluar la función en varios puntos, interpolar y obtener un polinomio.
Al reutilizar el algoritmo del tema 1 se obtiene lo planteado en b.2, usando un polinomio de grado 3, con muestras de 4 puntos equidistantes en el eje x.
polinomio 0.867192074184622*x**3 + 1.22015957396232*x**2 - 1.21861610672236*x + 1.01491694350023 derivada polinomio: 2.60157622255387*x**2 + 2.44031914792464*x - 1.21861610672236
Al aplicar un método para encontrar raíces se tiene que:
en distancia mínima en x= 0.3644244280922699 con y = 1.4396851273165785 distancia = 0.7728384816953889
Instrucciones en Python
# 1ra Evaluación II Término 2018 # Tema 2. Distancia mínima a un punto import numpy as np import matplotlib.pyplot as plt import sympy as sym # PRESENTA PROBLEMA # INGRESO punto = [1,1] trayectoria = lambda x: np.exp(x) a = 0 b = 1 muestras = 51 # PROCEDIMIENTO xif = np.linspace(a,b,muestras) trayecto = trayectoria(xif) # SALIDA plt.plot(xif,trayecto, label = 'trayectoria') plt.plot(punto[0],punto[1],'ro') plt.axhline(punto[0], color='grey') plt.axvline(punto[1], color='grey') plt.title('distancia a un punto') plt.legend() plt.xlabel('x') plt.ylabel('y') plt.show() # ------------------------ # PARA ANALIZAR DISTANCIAS def interpola_lagrange(xi,yi): ''' Interpolación con método de Lagrange resultado: polinomio en forma simbólica ''' # PROCEDIMIENTO n = len(xi) x = sym.Symbol('x') # Polinomio polinomio = 0 for i in range(0,n,1): # Termino de Lagrange termino = 1 for j in range(0,n,1): if (j!=i): termino = termino*(x-xi[j])/(xi[i]-xi[j]) polinomio = polinomio + termino*yi[i] # Expande el polinomio polinomio = polinomio.expand() return(polinomio) def posicionfalsa(fx,a,b,tolera): fa = fx(a) fb = fx(b) c = b - fb*(a-b)/(fa-fb) tramo = abs(c-a) while (tramo > tolera): fc = fx(c) cambia = np.sign(fa)*np.sign(fc) if (cambia > 0): tramo = abs(c-a) a=c fa=fc else: tramo = abs(c-b) b=c fb=fc c = b - fb*(a-b)/(fa-fb) print(tramo) respuesta = c # Valida respuesta fa = fx(a) fb = fx(b) cambio = np.sign(fa)*np.sign(fb) if (cambio>0): respuesta = np.nan return(respuesta) # INGRESO # Trayectoria y punto tomados de sección PRESENTA PROBLEMA y = lambda x: np.sqrt((x-punto[0])**2+(trayectoria(x)-punto[1])**2) a = 0.1 b = 0.7 muestras = 51 tolera = 0.0001 muestrap = 4 # Para el polinomio # PROCEDIMIENTO yif = y(xif) xip = np.linspace(a,b,muestrap) yip = y(xip) x = sym.Symbol('x') polinomio = interpola_lagrange(xip,yip) px = sym.lambdify('x',polinomio) pxi = px(xif) dpx = polinomio.diff('x',1) dpxn = sym.lambdify('x',dpx) fxi = dpxn(xif) raiz = posicionfalsa(dpxn,a,b,tolera) # SALIDA print('polinomio') print(polinomio) print('derivada polinomio:') print(dpx) print('en distancia mínima en x=',raiz) print('con y =', trayectoria(raiz)) print('distancia = ', y(raiz)) # GRAFICA plt.plot(xif,yif, label = 'distancia') plt.plot(xif,pxi, label = 'p(x)') plt.plot(xif,fxi, label = 'dpx(x)') plt.axhline(0, color = 'grey') plt.axvline(raiz, color = 'grey') plt.legend() plt.title('Distancia mínima de punto a f(x)') plt.xlabel('x') plt.ylabel('distancia') plt.show()