Ex.7 de la feuille 3 avec Gramm-Schmidt

F-X. Dehon - 16 nov. 2020 - dehon[@]unice.fr

Enoncé :


Méthode alternative pour 7b-c : On calcule une base orthogonale pour la forme bilinéaire de matrice A en essayant d'appliquer l'algorithme de Gramm-Schmidt à la base canonique de R3.

⚠ Le code ci-dessous a été exécuté avec Sagemath 8.9 basé sur Python 2. Les nouvelles versions de Sagemath s'appuient sur Python 3 qui n'est pas totalement compatible avec Python 2, voir la page (peut être incomplète) https://wiki.sagemath.org/Python3-user.

In [1]:
banner()
┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 8.9, Release Date: 2019-09-29                     │
│ Create a "Sage Worksheet" file for the notebook interface.         │
│ Enhanced for CoCalc.                                               │
│ Using Python 2.7.15. Type "help()" for help.                       │
└────────────────────────────────────────────────────────────────────┘
In [2]:
A=matrix([[3,2,2],[2,0,1],[2,1,0]])
show(A)
Out[2]:
(322201210)
In [3]:
#forme bilinéaire et forme quadratique de matrice A

def f(u,v):return(u*A*v)
def q(u):return(f(u,u))
var('x,y,z');print q(vector([x,y,z])).expand()
3*x^2 + 4*x*y + 4*x*z + 2*y*z
In [4]:
#projection de u sur le sous-espace dont B est une base orthogonale sans vecteur isotrope
def p(u,B):
    return(sum(f(u,e)/f(e,e)*e for e in B))
In [5]:
#base canonique de R^3
f1,f2,f3=identity_matrix(3).rows()
print f1,f2,f3
(1, 0, 0) (0, 1, 0) (0, 0, 1)
In [6]:
print q(f1)
3
In [7]:
B=[f1]
e2=f2-p(f2,B)
print q(e2)
-4/3
In [8]:
B=[f1,e2];print "B=",B
e3=f3-p(f3,B)
print q(e3)
B= [(1, 0, 0), (-2/3, 1, 0)]
-5/4
In [9]:
B=[f1,e2,e3];print "B=",B
B= [(1, 0, 0), (-2/3, 1, 0), (-1/2, -1/4, 1)]

Sans argument sur la correction de l'algorithme utilisé ci-dessus, on peut simplement vérifier que la famille B obtenue est bien une famille orthogonale pour q sans vecteur isotrope donc libre (pourquoi ?) donc une base.

Voici un exemple de discussion sur math.stackexchange.com où des intervenants discutent, parfois de façon péremptoire, sans même avoir lu.

Qu'aurait on fait si on était tombé en cours de route sur un vecteur isotrope, par exemple en appliquant l'algorithme à la base ((1,1,2),(1,2,2),(0,0,1)) ?

Dans la base B, q est de matrice diagonale (3,4/3,5/4).
Si (x,y,z) sont les coordonnées d'un vecteur u dans cette base alors q(u)=3x24/3y25/4z2, en particulier la signature de q est (1,2).
q(u)=0x=±4/9y2+5/12z2. On peut prendre par exemple (x,y,z)=(2/3,1,0) c'est à dire u=2/3f1+e2

In [10]:
#Vérification
u=2/3*B[0]+B[1]
print u,q(u)
(0, 1, 0) 0

Que (0,1,0) soit isotrope pour q est évident à regarder la matrice A de q puisque le deuxième terme sur la diagonale est nul. De même (0,0,1) est isotrope. Il y a en fait tout un hyperboloïde de vecteurs isotropes :

In [11]:
qq(x,y,z)=q(vector([x,y,z])).expand()
xmin,xmax=(-3,3)
ymin,ymax=(-3,3)
zmin,zmax=(-3,3)
Axes=line3d([(xmin,0,0),(xmax,0,0),(xmin,0,0)])+line3d([(0,ymin,0),(0,ymax,0),(0,ymin,0)])+line3d([(0,0,zmin),(0,0,zmax),(0,0,zmin)])#dessin axes
T=text3d('x', (xmax, -.1, -.1))+text3d('y', (-.1, ymax, -.1))+text3d('z', (.1, .1,zmax))

P=implicit_plot3d(qq(x,y,z)==0,(x,xmin,xmax),(y,ymin,ymax),(z,zmin,zmax),color='orange', opacity=0.7)#graphe de q

show(P+Axes+T,frame=false,aspect_ratio=[1,1,1],viewer='threejs')
Out[11]: