Académique Documents
Professionnel Documents
Culture Documents
Reduction de Gauss Des Formes Quadratiques
Reduction de Gauss Des Formes Quadratiques
Réduction de Gauss des formes quadratiques sous forme de carrés via les dérivées partielles.
e. H. el Abdalaoui
elhoucein.elabdalaoui@univ-rouen.fr; elabdelh@gmail.com
1 Introduction.
Les formes quadratiques sont très utiles en géométrie (coniques), en calculs différentiels, prob-
abilités et statistiques et bien sûr en algèbre. La décomposition de ces formes en somme de
carré à la Gauss est un outil fondamental. On propose dans cette mini-note l’utilisation des
dérivées partielles pour exhiber les formes linéaires qui interviennent dans cette décomposi-
tion. Par ailleurs, il semble qu’il n’y a pas de programme implémenté sur des plateformes pour
déterminer d’une manière automatisée cette décomposition. On présente une esquisse de pro-
jet à la fin de cette note. On espère que cette brève note pourra être utile dans le cadre des en-
seignements et de la pédagogie distancielle. On suggère aux lecteurs de suivre le lien suivant
pour s’entraîner en ligne cliquer ici.
q(x) = 2a 12 x 1 x 2 .
les dérivée partielles par rapport à x 1 et x 2 sont
∂q ∂q
(x) = 2a 12 x 2 et (x) = 2a 12 x 1 .
∂x 1 ∂x 2
1-ère étape :
(I) 1-ère cas : a i i 6= (0, 0) pour un certain i . Supposons sans perte de général-
ité que a 11 6= 0 et que la forme s’écrit sous la forme suivante :
∂q ³ 1 ´
(x) = 2a 11 x 1 + L(x 2 , · · · , x n ) = 2a 11 x 1 + L(x 2 , · · · , x n ) .
∂x 1 2a 11
Donc
³ 1 ´2 1 ³ ´2
q(x) = a 11 x 1 + L(x 2 , · · · , x n ) +q̃(x 2 , x 3 , · · · , x n )− L(x 2 , · · · , x n ) .
2a 11 4a 11
q(x) = 2a 12 x 1 x 2 + x 1 L 1 (x 3 , · · · , x n ) + x 2 L 2 (x 3 , · · · , x n ) + q̃(x 3 , · · · , x n ).
∂q ³ L 1 (x 3 , · · · , x n ) ´
(x) = 2a 12 x 2 + L 1 (x 3 , · · · , x n ) = 2a 11 x 2 +
∂x 1 2a 12
et
∂q ³ L 2 (x 3 , · · · , x n ) ´
(x) = 2a 12 x 1 + L 2 (x 3 , · · · , x n ) = 2a 11 x 1 + .
∂x 2 2a 12
1 1
Donc, les formes linéaires sont x 1 + L 2 (x 3 , · · · , x n ) et x 2 + L 1 (x 3 , · · · , x n )
2a 12 2a 12
a 12 n³ L 1 (x 3 , · · · , x n ) + L 2 (x 3 , · · · , x n ) ´2 ³ L 2 (x 3 , · · · , x n ) − L 1 (x 3 , · · · , x n ) ´2 o
q(x) = x1 + x2 + − x1 − x2 +
2 2a 12 2a 12
L 1 (x 3 , · · · , x n )L 2 (x 3 , · · · , x n )
+ q̃(x 3 , · · · , x n ) − .
2a 12
2-ème étape :
Pour autant que l’auteur sache, il n’y a pas de réduction en somme de carrés à la Gauss sur des
plateformes pédagogiques et/ou de calcul scientifique de type Wolfram Alpha mais vous pouvez
développer un programme C pour mettre en oeuvre l’algorithme décrit (cf. section programme).
q(x) = x 1 x 2 + x 2 x 3 + x 3 x 4 + x 1 x 4
∂q ∂q
(x) = x 2 + x 4 (x) = x 1 + x 3 .
∂x 1 ∂x 2
q(x, y, z) = 2x 2 − 2y 2 − 6z 2 + 3x y − 4xz + 7y z
∂q ¡ 3 ¢
(x, y, z) = 4x + 3y − 4z = 2 x + y − 2z .
∂x 2
¡ 3 ¢
donc, la forme linéaire à utiliser dans la décomposition est x + y − 2z et
2
3 ¡ 25 2
q(x, y, z) = 2(x + y − z)2 − q̃(y, z), avec q̃(y, z) = y + 8z 2 − 10y z .
¢
4 8
On itére la procédure pour q̃(y, z). La dérivée parielle par rapport à y donne
∂q̃ 25 25 ³ 8 ´
(x, y, z) = y − 10z = 2. y− z .
∂y 4 8 5
³ 8 ´
Il résulte que la forme linéaire à utiliser est y − z . D’où
5
³ 3 ´2 25 ³ 8 ´2
q(x, y, z) == 2 x + y − z − y − z − 8z 2 + 8z 2 .
4 8 5
La signature est sg (q) = (1, 1) et le rang r g (q) = 2.
4 Esquisse de programme C.
Le programme C qui suit utilise la procédure classique. On pourra le modifier en utilisant le
calcul formel pour implémenter la procédure présentée dans cette note. Il suffit de déterminer
comme dans le cas classique le type de forme quadratique puis calculer les dérivées partielles
formelles et les insérer dans la décomposition finale en somme de carrés.
Les bibiliothéques dans le programme qui suit ["util.h", "math.h", "conio.h"] contiennent des
routines classiques.
# i f n d e f _UTIL_H_
# endif // _UTIL_H_
# i f n d e f _MATH_H_
# endif // _MATH_H_
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
double * * CreateMat ( i n t n)
}
return mat ;
} // CreateMat ( )
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
double * * c ;
c = CreateMat (n ) ;
c [ y ] [ x ] = mat [ y ] [ x ] ;
return c ;
} // CopyMat ( )
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
void IdMat ( double * * mat , i n t n)
i n t y ; // <y> pour l e s l i g n e s
mat [ y ] [ x ] = ( x == y ? 1.0 : 0 . 0 ) ;
} // IdMat ( )
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
i n t y ; // <y> pour l e s l i g n e s
Free (mat [ y ] ) ;
Free (mat ) ;
} // DeleteMat ( )
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
i n t y ; // <y> pour l e s l i g n e s
i f (0 == y )
e l s e i f (n−1 == y )
else
i f (0 == y )
e l s e i f (n−1 == y )
printf (" / \n " ) ;
else
} // PrintMat ( )
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
// GAUSS
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
int n, x , y , k ;
n = N−1;
while (n > 0)
i f (CmpDouble0(M[ n ] [ n ] ) )
i n t s ; // indice du "swap"
s = −1;
f o r ( k =0; k<n ; k++)
i f ( ! CmpDouble0(M[ k ] [ k ] ) )
s = k;
break ;
i f ( −1 == s )
i f ( ! CmpDouble0(M[ n ] [ n− 1 ] ) )
//
// ( * * * 0 0 )
// ( * * * 0 0 )
// ( * * * 0 0 )
// ( 0 0 0 1/2 0 )
// ( 0 0 0 0 −1/2 )
//
M[ n− 1 ] [n−1] = + 0 . 5 ;
M[ n− 1 ] [n ] = 0.0;
M[ n ] [ n−1] = 0.0;
M[ n ][n ] = − 0.5;
// on diminue de 2 l e rang
n −= 2 ;
else
// sinon
//
// ( 0 * * * 0 )
// ( * 0 * * 0 )
// ( * * 0 * 0 )
// ( * * * 0 0 )
// ( 0 0 0 0 0 )
//
// on diminue de 1 l e rang
n −= 1 ;
else
SwapDouble(&M[ n ] [ k ] ,&M[ s ] [ k ] ) ;
SwapDouble(&M[ k ] [ n] ,&M[ k ] [ s ] ) ;
else
//
// ( * * * * 0 )
// ( * * * * 0 )
// ( * * * * 0 )
// ( * * * * 0 )
// ( 0 0 0 0 ? )
//
M[ y ] [ x ] −= M[n ] [ x ] * M[ y ] [ n] / M[ n ] [ n ] ;
M[ k ] [ n] = M[ n ] [ k ] = 0 . ;
// on passe au rang i n f e r i e u r
n − −;
} // gauss ( )
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
double * * diag ;
int k;
( * p) = 0 ;
(*q) = 0;
diag = CopyMat(mat , n ) ;
gauss ( diag , n ) ;
( * p) ++;
( * q ) ++;
}
DeleteMat ( diag , n ) ;
} // sign ( )
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
p r i n t f ( " c y l i nd r e e l l i p t i q u e \n " ) ;
}
e l s e i f (2==pB && 1==qB && 1==pA && 1==qA)
p r i n t f ( " d r o i t e \n " ) ;
else
} // info ( )
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
// MAIN
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
i n t main( void )
InitLibUtil ( ) ;
double * * mat ;
int pA , qA , pB , qB ;
p r i n t f ( " \n " ) ;
p r i n t f ( "X = ( x , y , z , 1 ) \ n " ) ;
p r i n t f ( "Q = X .M. tX \n " ) ;
p r i n t f ( "M = \n " ) ;
mat = CreateMat ( 4 ) ;
mat [ 0 ] [ 0 ] = 1 . 0 ;
mat [ 0 ] [ 1 ] = 0 . 0 ;
mat [ 0 ] [ 2 ] = 0 . 0 ;
mat [ 0 ] [ 3 ] = 0 . 0 ;
mat [ 1 ] [ 0 ] = 0 . 0 ;
mat [ 1 ] [ 1 ] = 1 . 0 ;
mat [ 1 ] [ 2 ] = 0 . 0 ;
mat [ 1 ] [ 3 ] = 0 . 0 ;
mat [ 2 ] [ 0 ] = 0 . 0 ;
mat [ 2 ] [ 1 ] = 0 . 0 ;
mat [ 2 ] [ 2 ] = 1 . 0 ;
mat [ 2 ] [ 3 ] = 0 . 0 ;
mat [ 3 ] [ 0 ] = 0 . 0 ;
mat [ 3 ] [ 1 ] = 0 . 0 ;
mat [ 3 ] [ 2 ] = 0 . 0 ;
mat [ 3 ] [ 3 ] = − 1 . 0 ;
PrintMat (mat , 4 ) ;
p r i n t f ( " \n " ) ;
sign (&pA,&qA , mat , 3 ) ;
SwapInt(&pA,&qA ) ;
SwapInt(&pB,&qB ) ;
info (pA , qA , pB , qB ) ;
DeleteMat (mat , 4 ) ;
CloseLibUtil ( ) ;
getch ( ) ;
return 0 ;
} // WinMain ( )