Krzywe drugiego stopnia    (krzywe stożkowe)
Olga Howczak

howczak@gmail.com

Opis zadania

Przygotować w programie Mathematica notebook prezentujący wszystkie krzywe stożkowe na płaszczyźnie zadane równaniem a (x^2) + 2b x y + c (y^2) + 2 d x + 2e y + f = 0, przed  i po diagonalizacji (postać kanoniczna). Współczynniki formy kwadratowej zadawane mają być w sposób losowy ze zbioru liczb {-3,-2,-1,0,1,2,3}.

Rozwiązanie

1) Losowanie współczynników formy kwadratowej

a=RandomInteger[{-3,3}];
b=RandomInteger[{-3,3}];
c=RandomInteger[{-3,3}];
d=RandomInteger[{-3,3}];
e=RandomInteger[{-3,3}];
f=RandomInteger[{-3,3}];

2)  Krzywe przed diagonalizacją

W tym punkcie wypisuję wylosowany kształt krzywej oraz rysuję tę krzywą korzystając z ImplicitPlot.

F[x_,y_]=a (x^2)+2 b x y+c (y^2)+2 d x+2 e y+f;

F[x,y]==0

(*<<Graphics`ImplicitPlot`*)

ContourPlot[F[x,y]==0,{x,-10,10},{y,-10,10},ContourStyle->{Hue[0.96`]},Axes->Automatic,Frame->True,Background->GrayLevel[0.95`]]

3) Diagonalizacja formy kwadratowej

Każdą formę można zapisać w postaci f( (Overscript[r, ->]))=((Overscript[r, ->])^T)M(Overscript[r, ->])+2((Overscript[B, ->])^T)(Overscript[r, ->]) +f=0, zgodnie z dalszym oznaczeniem  (Overscript[r, ->])=Y=(({{x}, {y}})),B=(({{d}, {e}})), M=(({{a, b}, {b, c}})).
f( (Overscript[r, ->])) można sprowadzić do postaci kanonicznej przez transformację  (Overscript[r, ->])=T(Overscript[r, ->])',gdzie T to jest ortonormalna macierz złożona z wektorów własnych macierzy M.
Postać diagonalna: f'( (Overscript[r, ->])')=(((Overscript[r, ->])')^T)M'(Overscript[r, ->])'+2(((Overscript[B, ->])')^T)(Overscript[r, ->])' +f=0,  gdzie
                                                                                 M'=(T^T)M T, (Overscript[B, ->])'=(T^T)(Overscript[B, ->])

Wyznaczanie ortonormalnej macierzy  transformacji T

F[x,y]==0
M={{a,b},{b,c}};
B={{d},{e}};
Y={{x},{y}};

F[x,y]==Expand[(Transpose[Y].M.Y+2 Transpose[B].Y+f)[[1,1]]]

Ponieważ opcja Eigenvectors wypisuje wektory własne macierzy w postaci wierszy, a potrzebuję żeby wektory własne M były wypisywane w macierz T w postaci kolumn, otrzymany wynik dodatkowo transponuję (Transpose)

G=Transpose[Eigenvectors[M]] ;
T=G/Norm[G];

G//MatrixForm

T//MatrixForm

Sprowadzenie do postaci bez wyrazów mieszanych "xy"

Obliczam :  f0= f'( (Overscript[r, ->])'),     f1=(((Overscript[r, ->])')^T)M'(Overscript[r, ->])',     f2=2(((Overscript[B, ->])')^T)(Overscript[r, ->])'  , ( X - nowe współrzędne po transformacji,  Y=TX )

X={{x1},{x2}};

f1=Transpose[X].Transpose[T].M.T.X //Simplify

f2=2Transpose[Transpose[T].B].X//Simplify

f0 -  forma kwadratowa po diaogonalizacji

f0=Simplify[f1+f2+f][[1,1]]

Wypisuję potrzebne dla dalszych obliczeń współczynniki przy potęgach x i y oraz dodatkowo przy xy, aby upewnić się, że znika
podczas transformacji.

CoefficientList[f0,{x1,x2}]//Simplify//MatrixForm

k=Coefficient[f0,(x1^2)];
l=Coefficient[f0,(x2^2)];
m=Coefficient[f0,x1];
n=Coefficient[f0,x2];
g=Coefficient[f0,x1 x2];

Po diagonalizacji forma kwadratowa ma postać:
      k (x1^2)+l (x2^2)+m x1+n x2+f=0

Sprowadzenie formy kwadratowej do postaci kanonicznej, w przypadku paraboli. (Jeden z współczynników potęgach 2 jest równy 0, czyli k=0 lub l=0)

(Jeden z współczynników potęgach 2 jest równy 0, czyli k=0 lub l=0)
forma kwadratowa po diagonaliyacji ma postać:

        k (x1^2)+m x1+n x2+f=0
        l (x2^2)+m x1+n x2+f=0 
        
 Sprowadzamy formę do postaci:
       k (((x1+(m/(2 k))))^2)-((m^2)/(4 k))+f+n x2=0 
       l (((x2+(n/(2 l))))^2)-((n^2)/(4 l))+f+mx1=0  
       
Aby sprowadzić formę do osi głównych stosuję transformację:
         y1=(m/(2 k))+x1;        lub        y1=x1
y2=x2;                                        y2=(n/(2 l))+x2;

If[k≠0&&l==0,ContourPlot[k (y1^2)-((m^2)/(4 k))+n y2+f==0,{y1,-10,10},{y2,-10,10},ContourStyle->{Hue[0.63`]},Axes->Automatic,Frame->True,Background->GrayLevel[0.95`]]]
If[k==0&&l≠0,ContourPlot[l (y2^2)-((n^2)/(4 l))+m y1+f==0,{y1,-10,10},{y2,-10,10},ContourStyle->{Hue[0.63`]},Axes->Automatic,Frame->True,Background->GrayLevel[0.95`]]]

Sprowadzenie formy do postaci  Fd=k(((x1+a))^2)+l(((x2+b))^2)+c=0,  gdzie a, b, c stałe

If[k≠0&&l≠0,Fd=k*(x1+1/2*m/k)^2+l*(x2+1/2*n/l)^2-1/4*(m^2)/k-1/4(n^2)/l +f]

Fd-f0==0//FullSimplify

Sprowadzenie formy do postaci kanonicznej: k (y1^2)+l (y2^2)+cc=0,  
 Oraz jej wykres

dokonuję transformacji:

         y1=(m/(2 k))+x1;

            y2=(n/(2 l))+x2

If[k≠0&&l≠0,Fk[y1_,y2_]=Fd/.{x1+1/2*m/k->y1,x2+1/2*n/l->y2};]

If[k≠0&&l≠0,ContourPlot[Fk[y1,y2]==0,{y1,-50,50},{y2,-50,50},AspectRatio->Automatic,ContourStyle->{Hue[0.68`]},Background->GrayLevel[0.9`],PlotPoints->150]]

Jeśli krzywa (k (y1^2)+l (y2^2)+cc=0,  ),   jest elipsą lub okręgiem:
stosuję dodatkowo "ParametricPlot":
y1=(Sqrt[(cc/k)]) cos(t)
y2=(Sqrt[(cc/k)]) sin(t)

If[k≠0&&l≠0,cc=1/4*(m^2)/k+1/4(n^2)/l -f];

If[(k>0&&l>0&&cc>0)||(k<0&&l<0&&cc<0),ParametricPlot[{N[Sqrt[cc/k]]Cos[t],N[Sqrt[cc/l]]Sin[t]},{t,0,2π},AspectRatio->Automatic,PlotStyle->{Hue[0.68]},Background->GrayLevel[0.9],PlotPoints->150,Frame->True]]