Ejemplo 1: Hipérbola - Rotación Negativa

A partir de la ecuación (3.1a) $$ ax^2 + bxy + cy^2 + dx + ey + f = 0 $$ debe prestarse especial atención a la forma en la que aparecerán listados los coeficientes de la ecuación en la entrada de sympy


In [1]:
import numpy as np
from numpy import linalg as LA
import scipy as sp
import sympy as smp
import matplotlib as mpl
mpl.rcParams['text.usetex'] = True
mpl.rcParams['text.latex.unicode'] = True
import matplotlib.pyplot as plt

x, y = smp.symbols('x y')
Conic = smp.Poly(3 * x**2 + 10 * x * y + 3 * y**2 - 2 * x - 14 * y + 5, x, y)
Coefs = Conic.coeffs()
print(Coefs)


[3, 10, -2, 3, -14, 5]

aquí la ecuación introducida fue $$ 3x^2 + 10xy + 3y^2 - 2x - 14y + 5 = 0, $$ cuyo orden es el acostumbrado, sin embargo el resultado de la función coeffs corresponde a los coeficientes polinómio con todos los términos en $x$ ordenados al incio del polinomio, i.e $$ 3x^2 + 10xy - 2x + 3y^2 - 14y + 5 = 0, $$ con lo anterior, para continuar con el desarrollo expresado en Cónicas rotadas se asignan los correspondientes índices del arreglo Coefs como sigue


In [2]:
a = Coefs[0]
b = Coefs[1]
c = Coefs[3]
d = Coefs[2]
e = Coefs[4]
f = Coefs[5]

y se construye la matriz $M$


In [3]:
M = sp.matrix([[a, b / 2], [b / 2, c]], dtype = float)
M


Out[3]:
matrix([[ 3.,  5.],
        [ 5.,  3.]])

A continuación se define el vector $q$ de los valores propios de $M$


In [4]:
q = LA.eigvalsh(M)
q


Out[4]:
array([-2.,  8.])

El vector propio $v1$ asociado al menor valor propio


In [5]:
v1 = np.array([b, 2*(min(q) - a)], dtype = float)
v1


Out[5]:
array([ 10., -10.])

el determinante de la matriz $M$


In [6]:
dM = LA.det(M)
dM


Out[6]:
-15.999999999999998

las coordenadas $(u, v)$ del centro de la cónica en el plano rotado y la variable $T$


In [7]:
u = -(b * d + 2 * e * (min(q) - a)) / (2 * min(q) * LA.norm(v1))
v = -(b * e - 2 * d * (min(q) - a)) / (2 * max(q) * LA.norm(v1))
t = (1 / (4 * (LA.norm(v1)) **2))*((((b * d + 2 * e * (min(q) - a)) **2) / min(q)) + (((b * e - 2 * d * (min(q) - a)) ** 2) / max(q)))
u, v, t


Out[7]:
(2.12132034355964, 0.707106781186547, -5.00000000000000)

con $\lambda_1 = -2$ y $T_1 = -5 \neq f$ la ecuación dada corresponde a una hipérbola

Las coordenadas $(u, v)$ del centro transformadas al plano $x,\;\; y$ (las coordenadas $(h, k)$)


In [8]:
h = (1 / LA.norm(v1)) * (b * u - 2 * v * (min(q) - a))
k = (1 / LA.norm(v1)) * (2 * u * (min(q) - a) + b * v)
h, k


Out[8]:
(2.00000000000000, -1.00000000000000)

El ángulo de rotación $\theta$ (en radianes)


In [9]:
theta = -np.arccos(float(b / LA.norm(v1)))
theta


Out[9]:
-0.78539816339744839

La gráfica de la cónica


In [10]:
X = np.linspace(-5, 9, 100) # Define la longitud del eje x y el número de muestras
Y = np.linspace(-8, 7, 100) # Define la longitud del eje y y el número de muestras
X, Y = np.meshgrid(X, Y) # Crea el plano
#axes = plt.gca()
plt.figure(figsize = (7, 7)) # Escalado de la gráfica
# Define el rectángulo de inspección
plt.gca().set_xlim([-5, 9])
plt.gca().set_ylim([-8, 7])
plt.gca().set_aspect('equal', adjustable='box-forced') # aspecto
plt.gca().spines['left'].set_position('zero') # posición del eje y
plt.gca().spines['bottom'].set_position('zero') # posición del eje x
# Elimina los bordes derecho y superior del rectángulo de inspección
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
# Ubicación y etiquetas de los ejes
plt.gca().xaxis.set_label_coords(1.05, 0.55)
plt.xlabel('$x$')
plt.gca().yaxis.set_label_coords(.38, 1.05)
plt.gca().set_ylabel('$y$', rotation='horizontal')
# Gráfica
plt.contour(X, Y, (a * X **2 + b * X * Y + c * Y **2 + d * X + e * Y + f), [0], linewidths = 2, colors = 'royalblue') # Grafica la curva
plt.plot(h, k, '.', color = 'coral') # el centro
# Asíntotas
a1 = ((-2 * np.sqrt(max(q)) * (min(q) - a) - b * np.sqrt(abs(min(q)))) / (2 * np.sqrt(abs(min(q))) * (min(q) - a) - b * np.sqrt(max(q)))) * X[0,:] - (((-2 * np.sqrt(max(q)) * (min(q) - a) - b * np.sqrt(abs(min(q)))) / (2 * np.sqrt(abs(min(q))) * (min(q) - a) - b * np.sqrt(max(q)))) * h) + k
a2 = ((2 * np.sqrt(max(q)) * (min(q) - a) - b * np.sqrt(abs(min(q)))) / (2 * np.sqrt(abs(min(q))) * (min(q) - a) + b * np.sqrt(max(q)))) * X[0,:] - (((2 * np.sqrt(max(q)) * (min(q) - a) - b * np.sqrt(abs(min(q)))) / (2 * np.sqrt(abs(min(q))) * (min(q) - a) + b * np.sqrt(max(q)))) * h) + k
plt.plot(X[0,:], a1, '--', linewidth = 1, color = 'coral')
plt.plot(X[0,:], a2, '--', linewidth = 1, color = 'coral')
# Ejes u, v
plt.plot(X[0,:],  -X[0,:], '-', linewidth=.7, color = 'gray') # el eje u
plt.plot(X[0,:],  X[0,:], '-', linewidth=.7, color = 'gray') # el eje v
# Información de la cónica
plt.text(11, 8, 'Hipérbola', fontsize=16)
plt.text(11, 6, 'La ecuación de la cónica en $x$ e $y$', bbox={'facecolor':'royalblue', 'alpha':.35}, fontsize=14)
plt.text(11, 5,'$%ix^2+%ixy+%iy^2%ix%iy+%i=0$'%(a, b, c, d, e, f), fontsize=14)
plt.text(11, 4, 'centro $(%f, %f)$'%(h, k), fontsize=14)
plt.text(11, 2,'La ecuación de la cónica en $u$ y $v$', bbox={'facecolor':'palevioletred', 'alpha':.35}, fontsize=14) 
plt.text(11, 1, '$%iu^2-%fu+%iv^2-%fv+%i$'%(min(q), (b*d+2*e*(min(q) - a))/(LA.norm(v1)),max(q),((b*e-2*d*(min(q)-a))/(LA.norm(v1))),f), fontsize=14)
plt.text(11, 0, 'centro $(%f, %f)$'%(u, v), fontsize=14)
plt.text(11, -2, r'ángulo de rotación $\theta =$ %f rad'%(theta), fontsize=14)
plt.show() # muestra la gráfica



In [ ]: