On trouvera ici quelques calculs pour les exercices de la feuille de TD d'algèbre bilinéaire.
A = QQ['X']
X = A.gen()
P0=1
P1=X
P2=X**2
print "La base canonique: ", P0,",",P1,",",P2
var('t')
integral(P0*P1(t),t,0,1)
Le premier vecteur P0 est bien sûr de norme 1.
Calculons le deuxième vecteur de la base orthonormalisée
Q1 = P1 - integral(P0*P1(t),t,0,1) * P0
print(Q1)
Maintenant (le carré de) la norme de Q1:
integral(Q1(t)*Q1(t),t,0,1)
R1=2*sqrt(3)*Q1
print R1
integral(P0*P2(t),t,0,1)
integral(R1(t)*P2(t),t,0,1)
Q2=P2-integral(P0*P2(t),t,0,1)*P0-integral(R1(t)*P2(t),t,0,1)*R1
print Q2
integral(Q2(t)*Q2(t),t,0,1)
R2 = Q2 / (sqrt(integral(Q2(t)*Q2(t),t,0,1)))
print R2
Vérifions que (P0,R1,R2) est bien une base orthonormée:
print "Normes: ",integral(P0*P0,t,0,1),integral(R1(t)*R1(t),t,0,1),integral(R2(t)*R2(t),t,0,1)
print "Produits scalaires:"
print "P0 et R1: ",integral(P0*R1(t),t,0,1)
print "P0 et R2: ",integral(P0*R2(t),t,0,1)
print "R1 et R2: ",integral(R1(t)*R2(t),t,0,1)
Projetons la fonction sinus:
print "sin et P0: ", integral(sin(t)*P0,t,0,1)
print "sin et R1: ", integral(sin(t)*R1(t),t,0,1)
print "sin et P0: ", integral(sin(t)*R2(t),t,0,1)
Le projeté orthogonal:
Q = integral(sin(t)*P0,t,0,1)*P0 + integral(sin(t)*R1(t),t,0,1)*R1 + integral(sin(t)*R2(t),t,0,1)*R2
print Q
Évidemment le résultat n'est pas lisible. Essayons une approximation numérique (RR est le corps des nombres réels avec 53 bits de précision):
Qapprox = Q.polynomial(RR)
print Qapprox
Nous pouvons comparer notre fonction initiale (sinus) avec le polynôme de degré 2 que nous venons de calculer: superposons les deux courbes.
plot(Q,0,1)+plot(sin(t),0,1,color='red')
Waouh, les deux courbes sont vraiment très très proche. Spectaculaire !
Commençons par tracer !
var('x,y')
G = implicit_plot(x**2-x*y+y**2-1,(x,-2,2),(y,-2,2),axes=true)
G += arrow((0,0),(sqrt(2)/2,sqrt(2)/2),color='red')
G += arrow((0,0),(-sqrt(2)/2,sqrt(2)/2),color='red')
G += text('$U_1$',(.8,.8),color='red')
G += text('$U_2$',(-.8,.8),color='red')
G.plot()
Calculons le changement de base (nous utilisons xx au lieu de x')
E = x**2-x*y+y**2-1
var('xx,yy')
EE = E(x=sqrt(2)/2*(xx-yy),y=sqrt(2)/2*(xx+yy))
print EE
print "forme simplifiée: ",EE.polynomial(QQ)
Commençons par tracer !
G = implicit_plot(4*x**2-24*x*y+11*y**2-5,(x,-5,5),(y,-5,5))
G += arrow((0,0),(3/5,-4/5),color='red')
G += text('$U_1$',(1,-1),color='red')
G += arrow((0,0),(4/5,3/5),color='red')
G += text('$U_2$',(1,.8),color='red')
G += line([(-5,-10/11),(5,10/11)],color='green')
G += text('$D_1$',(4,1),color='green')
G += line([(-2.5,-5),(2.5,5)],color='green')
G += text('$D_2$',(2,3),color='green')
G += arrow((0,0),(11/5,2/5),color='green')
G += text('$V_1$',(2,.8),color='green')
G += arrow((0,0),(-1,-2),color='green')
G += text('$V_2$',(-1.5,-1.7),color='green')
G.show(axes=true)
Remarquez que les vecteurs propres $U_1$ et $U_2$ sont des vecteurs directeurs des deux bissectrices des asymptotes (en vert).
A = matrix ([[4,-12],[-12,11]])
print A
A.characteristic_polynomial()
A.eigenvalues()
A.eigenvectors_right()
L'affichage ci-dessus n'est pas complètement lisible: pour chacune des deux valeurs propres, aparait un vecteur propre et la multilplicité algébrique correspondante (ici toujours 1).
l = A.eigenvectors_right()
U20 = l[0][1][0]
U5 = l[1][1][0]
print U20,U5
On normalise les vecteurs propres:
U20 = 3/5 * U20
U5 = 4/5 * U5
Calculons la matrice de passage (notez le transpose()
pour mettre les vecteurs en colonne)
P = matrix([U20,U5]).transpose()
print P
P est bien une matrice orthogonale:
P.transpose()*P
On peut donc diagonaliser la matrice A de la forme quadratique:
P.transpose()*A*P
Dans la nouvelle base l'équation de l'hyperbole est donc $20x'^2-5y'^2=5$
Nous pouvons refaire le graphique dans ce nouveau repère.
var('xx,yy')
G = implicit_plot(20*xx**2-5*yy**2-5,(xx,-2,2),(yy,-2,2))
G += line([(-1,-2),(1,2)],color='green')
G += line([(-1,2),(1,-2)],color='green')
G.show(axes=true)