a*x^2 + b*x*y + c*y^2 + d*x + e*y + f = 0 ,con almeno uno tra a, b e c diverso da 0, nel piano x,y è una conica: vedi. Posto Q = b^2-4*a*c, se Q = 0 è una parabola, se Q > 0 un'iperbole, se Q < 0 un'ellisse Data una conica descritta in forma polinomiale, tracciabile facilmente con R, posso studiarne le proprietà con WolframAlpha. Esempio: 4/3*x^2+y^2+x*y/2-7*x-8*y-32 = 0 Vediamo come tracciarla a partire dalla equazione inziale [ dopo aver azionato source("http://macosa.dima.unige.it/r.R") ] F = function(x,y) 4/3*x^2+y^2+x*y/2-7*x-8*y-32 PIANO(-30,30, -30,30); curva(F, "blue") PIANO(-10,10, -5,15); curva(F, "blue") # ho cambiato la scala Nella figura a destra ho tracciato anche un punto della curva, in cui y=10. Per far ciò ho risolto l'equazione F(x,y)=0 per y=10 (vedi il punto 22 della parte 3 della guida). h <- function(x) F(x,10); q=soluz(h,0, 2,5); q; PUNTO(q,10, "red") # [1] 3.842329 È un'ellisse. E infatti (1/2)^2-4*4/3*1 = -5.083333 < 0 Per studiarla, metto 4/3*x^2+y^2+x*y/2-7*x-8*y-32 = 0 in WolframAlpha. Clicco [Properties] Ho l'elenco delle proprietà. Per usare meglio questo elenco vado col mouse sotto il riquadro di esse e clicco [A Plaintext] in modo da copiare meglio i valori: ellipse foci | (4.32758, -0.902184) | (-0.393151, 7.91858) vertices | (5.65532, -3.38309) | (-1.72089, 10.3995) center | (1.96721, 3.5082) semimajor axis length | 7.81613 semiminor axis length | 6.00576 area | 147.472 perimeter | 43.6092 focal parameter | 7.21054 eccentricity | 0.639994 Quando l'eccentricità è 0 l'ellisse è un cerchio, quando è 1 si riduce ad un segmento. [il parametro focale dell'ellisse, parametro poco usato, è, riferendosi alla figura, QC^2/√(VC^2-QC^2) ] Vediamo come tracciarla usando (invece dell'eq.) queste informazioni di WolframAlpha. Ci sono vari modi di procedere. Il più semplice (con R) è il seguente. Metto in A e B i fuochi, in V uno dei vertici e in S la somma delle distanze di V dai fuochi, che (come sappiamo) è uguale alla somma delle distanze di un qualunque punto P dell'ellisse dai fuochi: A=c(4.32758, -0.902184); B=c(-0.393151, 7.91858); V=c(5.65532, -3.38309) S = punto_punto(A[1],A[2], V[1],V[2]) + punto_punto(B[1],B[2], V[1],V[2]) G = function(x,y) punto_punto(A[1],A[2], x,y) + punto_punto(B[1],B[2], x,y) - S PIANO(-10,10, -5,15) curva(G, "red"); PUNTO(A[1],A[2], "blue"); PUNTO(B[1],B[2], "blue") PUNTO(V[1],V[2], "seagreen") Volendo, WolframAlpha mi indica anche gli estremi laterali dell'ellisse: Real solutions: x = 24/61*(5 - sqrt(269)); y = 1/4*(16 - 24/61*(5 - sqrt(269))) x = 24/61*(5 + sqrt(269)); y = 1/4*(16 - 24/61*(5 + sqrt(269))) Potevo dunque anche procedere con uno di questi punti al posto di V: P = c( 24/61*(5 - sqrt(269)), 1/4*(16 - 24/61*(5 - sqrt(269))) ) S = punto_punto(A[1],A[2], P[1],P[2]) + punto_punto(B[1],B[2], P[1],P[2]) G = function(x,y) punto_punto(A[1],A[2], x,y) + punto_punto(B[1],B[2], x,y) - S PIANO(-10,10, -5,15) curva(G, "red"); PUNTO(A[1],A[2], "blue"); PUNTO(B[1],B[2], "blue") PUNTO(P[1],P[2], "seagreen") Ho tracciato anche i segmenti che congiungono i fuochi con P: linea(A[1],A[2],P[1],P[2],"seagreen");linea(B[1],B[2],P[1],P[2],"seagreen") Vediamo un altro modo (sempre usando le informazioni di WolframAlpha): scalo un cerchio centrato nell'origine tenendo conto del rapporto tra i semiassi, lo traslo tenendo conto del centro e lo ruoto tenendo conto delle coordinate dei fuochi. PIANO(-10,10, -5,15) C = c(1.96721, 3.5082); R = 7.81613 PUNTO(C[1],C[2], "green") # il cerchio centrato nell'origine con raggio = semiasse maggiore K = function(x,y) x^2+y^2-R^2 # lo schiaccio in modo da dargli la forma dell'ellisse # (il colore -1 non traccia la curva, che copio in U) rap = 6.00576/7.81613 moltra(K, 1,rap, 0,0, -1); U = ZZZ # lo ruoto e traslo portando O in C, e lo visualizzo D=c(0,A[2]) rottra(U, angolo(D,A,B),C[1],C[2],"seagreen") ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- Vediamo un altro esempio: 4/3*x^2-y^2+x*y/2-7*x-8*y-32 = 0 F = function(x,y) 4/3*x^2-y^2+x*y/2-7*x-8*y-32 PIANO(-20,20, -20,20); curva(F, "blue") Ottengo il grafico sopra a sinsitra. È un'iperbole. E infatti (1/2)^2+4*4/3*1 > 0 Come prima la studio con WolframAlpha: hyperbola foci | (-3.95779, -3.95486) | (10.4056, -2.4332) vertices | (-1.48632, -3.69303) | (7.93408, -2.69503) center | (3.22388, -3.19403) semimajor axis length | 4.73655 semiminor axis length | 5.45163 focal parameter | 4.11533 eccentricity | 1.52471 asymptotes | y = 1.43145 x - 7.80887 | y = -0.931454 x - 0.191134 [il parametro focale dell'iperbole, parametro poco usato, è, riferendosi alla figura: KV^2/√(KV^2+CV^2)= 5.45163^2/√(4.73655^2+5.45163^2) ] Ecco come tracciare gli asintoti: as1 = function(x) 1.43145*x-7.80887; as2 = function(x) -0.931454*x-0.191134 grafi(as1, -20,20, "red"); grafi(as2, -20,20, "red") C = c(3.22388, -3.19403) PUNTO(C[1],C[2], "seagreen") Volendo posso trovare l'angolo formato dagli asintoti, usando il comando inclinazione2 (vedi punto 16 della parte 2 della guida), che alla pendenza associa l'inclinazione: inclinazione2(1.43145) # [1] 55.06215 l'inclinazione di un asintoto inclinazione2(-0.931454) # [1] -42.96746 l'inclinazione dell'altro inclinazione2(1.43145)-inclinazione2(-0.931454) # [1] 98.02961 un angolo in ° formato dai due asinoti (quello che contiene # i due rami di curva); l'altro è 180° meno questo valore Le iperboli hanno la caratteristica di avere la differenza delle distanze dei loro punti dai fuochi costante (in valore assoluto). Verifichiamo la cosa in due punti: # i fuochi: A=c(-3.95779, -3.95486); B=c(10.4056, -2.4332) PUNTO(A[1],A[2], "seagreen"); PUNTO(B[1],B[2], "seagreen") u=8; h <- function(x) F(x,u); q=soluz(h,0, 10,13); q; PUNTO(q,u, "red") # [1] 12.13707 la x del punto P con y=8 a destra PUNTO(A[1],A[2], "seagreen"); PUNTO(B[1],B[2], "seagreen") linea(A[1],A[2],q,u, "seagreen"); linea(B[1],B[2],q,u, "seagreen") punto_punto(A[1],A[2],q,u)-punto_punto(B[1],B[2],q,u) # [1] 9.473119 la differenza tra AP e BP u=-10; h <- function(x) F(x,u); q=soluz(h,0, -5,-2.5); q; PUNTO(q,u, "red") # [1] -3.197402 la x del punto P con y=10 a sinistra linea(A[1],A[2],q,u, "magenta"); linea(B[1],B[2],q,u, "magenta") punto_punto(A[1],A[2],q,u)-punto_punto(B[1],B[2],q,u) # [1] -9.473119 la differenza tra AP e BP A destra la curva tracciata come luogo dei punti le cui distanze dai fuochi hanno differenza che in valore assoluto vale 9.473119: K = function(x,y) abs(punto_punto(x,y,A[1],A[2])-punto_punto(x,y,B[1],B[2]))-9.473119 PIANO(-10,15, -15,10); curva(K, "magenta") ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- H = function(x,y) x^2+y^2-2*x*y+4*x+4 PIANO(-3,0.2, -3,0.2) curva(H, "blue") È una parabola. E infatti (-2)^2-4*1*1 = 0 Con WolframAlpha abbiamo: parabola focus | (-3/2, -1/2) = (-1.5, -1/2) vertex | (-5/4, -1/4) = (-1.25, -1/4) semi-axis length | 1/(2*sqrt(2)) = 0.353553 [ FV nella figura = (distanza tra F e la direttrice)/2 [ focal parameter | 1/sqrt(2) = 0.707107 eccentricity | 1 directrix | y = -x - 1 [il parametro focale dell'iperbole, parametro poco usato, è, riferendosi alla figura: 2*semiasse ] Le parabole hanno la caratteristica di avere la le distanze dei loro punti dal fuoco e dalla direttrice eguali. Verifichiamo la cosa (ottenendo il grafico sotto a sinistra). PIANO(-3,0, -3,0); curva(H, "brown") V = c(-5/4, -1/4); F = c(-3/2,-1/2) f = function(x) -x-1 PUNTO(F[1],F[2], "red"); grafi(f, -3,0, "red") # prendo un punto della parabola, ad es. quello (a destra) di ordinata -2 u=-2; h <- function(x) H(x,u); q=soluz(h,0, -2,-1.1); q; PUNTO(q,u, "red") # [1] -1.171573 # la x del punto con y = -2 # dove la prependicolare punto_retta interseca la retta punto_retta2(q,u, -1,0,0,-1) # [1] -0.08578644 -0.91421356 segm(q,u, -0.08578644, -0.91421356, "green") segm(q,u, F[1],F[2], "green") # I valori delle distanze: punto_punto(q,u, F[1],F[2]) # [1] 1.535534 punto_retta(q,u, -1,0,0,-1) # [1] 1.535534 # OK Posso controllare la cosa tracciando direttamente la parabola usando questa caratteristica: W = function(x,y) punto_punto(x,y,F[1],F[2])-punto_retta(x,y, -1,0,0,-1) curva(W, "blue") Ho ottenuto la figura blu soprastante a destra. OK.