GT_MM_1718_Clase_231017

597 days ago by GT_MM_1718

Distancia entre dos curvas (elipses)

Vamos a calcular la distancia entre dos curvas (elipses) a partir de sus ecuaciones en paramétricas. En primer lugar, dibujamos las dos elipses.

e1(t)=(cos(t)/5,sin(t)/3) e2(t)=(1+cos(t)/3,1+sin(t)/4) parametric_plot(e1(t),(t,0,2*pi))+parametric_plot(e2(t),(t,0,2*pi)) 
       

Definimos la distancia al cuadrado entre las elipses como la suma de los cuadrados de las diferencias entre sus coordenadas (restamos la coordenada x de las dos curvas y la elevamos al cuadrado, lo mismo con la coordenada y, y sumamos las dos cantidades). Nótese que como estamos cogiendo puntos distintos de las curvas, en cada una usamos un nombre diferente para el parámetro.

D(t,s)=sum([k^2 for k in vector(e2(t))-vector(e1(s))]) D(t,s) 
       
1/225*(3*cos(s) - 5*cos(t) - 15)^2 + 1/144*(4*sin(s) - 3*sin(t) - 12)^2
1/225*(3*cos(s) - 5*cos(t) - 15)^2 + 1/144*(4*sin(s) - 3*sin(t) - 12)^2

Representamos la distancia (para cada par de valores de los parámetros, t,s, representamos la distancia al cuadrado - hemos elegido representarla mediante curvas de nivel).

contour_plot(D(t,s),(t,0,2*pi),(s,0,2*pi),labels=true,fill=false) 
       

Queremos calcular el mínimo. En particular, el mínimo es un punto donde se anula el gradiente. Así que calculamos el gradiente.

F=D.diff() F(t,s) 
       
(-1/24*(4*sin(s) - 3*sin(t) - 12)*cos(t) + 2/45*(3*cos(s) - 5*cos(t) -
15)*sin(t), 1/18*(4*sin(s) - 3*sin(t) - 12)*cos(s) - 2/75*(3*cos(s) -
5*cos(t) - 15)*sin(s))
(-1/24*(4*sin(s) - 3*sin(t) - 12)*cos(t) + 2/45*(3*cos(s) - 5*cos(t) - 15)*sin(t), 1/18*(4*sin(s) - 3*sin(t) - 12)*cos(s) - 2/75*(3*cos(s) - 5*cos(t) - 15)*sin(s))

Representamos las curvas obtenidas igualando cada coordenada del gradiente a cero. Donde se corten será un máximo, un mínimo o un punto de silla.

implicit_plot(F(t,s)[0],(t,0,2*pi),(s,0,2*pi))+implicit_plot(F(t,s)[1],(t,0,2*pi),(s,0,2*pi))+contour_plot(D(t,s),(t,0,2*pi),(s,0,2*pi),labels=true,fill=false) 
       

Para calcular el mínimo, partimos del punto (4,1) que está próximo y aplicamos dos pasos del método de Newton a la función gradiente.

x1=vector([4.0,1.0])+F.diff()(4.0,1.0).solve_right(-F(4.0,1.0)) x1 
       
(3.75310225726869, 0.999353097118445)
(3.75310225726869, 0.999353097118445)
x2=x1+F.diff()(*x1).solve_right(-F(*x1)) x2 
       
(3.75165943860901, 0.998819864164055)
(3.75165943860901, 0.998819864164055)

Representamos el punto obtenido.

implicit_plot(F(t,s)[0],(t,0,2*pi),(s,0,2*pi))+implicit_plot(F(t,s)[1],(t,0,2*pi),(s,0,2*pi))+contour_plot(D(t,s),(t,0,2*pi),(s,0,2*pi),labels=true,fill=false)+point(x2,color='red',size=50) 
       

La distancia la podemos obtener sustituyendo en nuestra función distancia al cuadrado y calculando su raíz cuadrada.

sqrt(D(*x2)) 
       
0.845536407085398
0.845536407085398

Y los puntos donde se alcanza la distancia, sustituyendo los valores de los parámetros en las ecuaciones de las curvas.

e2(x2[0]),e1(x2[1]) 
       
((0.726796747648913, 0.856769450242124),
 (0.108258995891337, 0.280277589625196))
((0.726796747648913, 0.856769450242124),
 (0.108258995891337, 0.280277589625196))

Representamos los puntos obtenidos.

parametric_plot(e1(t),(t,0,2*pi))+parametric_plot(e2(t),(t,0,2*pi))+points([e2(x2[0]),e1(x2[1])],color='red')+line([e2(x2[0]),e1(x2[1])],color='gray')