Vous êtes sur la page 1sur 20

Note d’enseignement. Niveau Licence L2.

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

Monday 1st March, 2021

Résumé. On présente une procédure de réduction des formes quadratiques sous


formes de carrés à la Gauss qui utilise les dérivées partielles pour déterminer les
formes linéaires qui interviennent dans la décomposition.

Abstract. We present a procedure for reducing quadratic forms into squares à la


Gauss that uses partial derivatives to determine the linear forms involved in the de-
composition.

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.

2 Principe de la réduction, cas n = 2.


Soit q une forme quadratique sur Rn de la forme
X
q(x) = ai , j xi x j .
1≤i , j ≤n

On procéde par récurrence en considérant le cas n = 2, i.e.,


q(x) = a 11 x 12 + 2a 12 x 1 x 2 + a 22 x 22 .
(I) (a 11 , a 22 ) 6= (0, 0). Supposons sans perte de généralité que a 11 6= 0.
On calcule la dérivée partielle par rapport à x 1 , on obtient
∂q ³ a 12 ´
(x) = 2a 11 x 1 + 2a 12 x 2 = 2a 11 x 1 + x2 .
∂x 1 a 11
Donc ³ a 12 ´2 ¡ a 12 ¢ 2
q(x) = a 11 x 1 + x 2 + a 22 − x .
a 11 a 11 2
a 12
Les applications linéaires L 1 (x) = x 1 + x 2 et L 2 (x) = x 2 sont des formes
a 11
linéaires, de plus la matrice de (L 1 , L 2 ) dans la base canonique (π1 (x) = x 1 , π2 (x) =

x 2 ) de (R2 ) est
1 0
à !
P = a 12 et d et (P ) 6= 0.
1
a 11

Alors L 1 , L 2 sont linéairement indépendantes. La signature dépend du signe


a 12 a 12
de a 11 et a 22 − . Si a 22 − = 0, alors
a 11 a 11
(
(1, 0) si a 11 > 0,
Sg(q) =
(0, 1) sinon.

Le rang est rg(q) = 1. Sinon.


 a 12
(2, 0) si a 11 > 0, a 22 − > 0,
a

a 12 11



Sg(q) = (1, 1) si.a 11 .a 22 − < 0,
a 11
a


(0, 2) si.a 11 < 0, a 22 − 12 < 0,


a 11

Le rang est rg(q) = 2.

(II) Deuxième cas: a i i = 0,, on a

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

Donc, on écrit alors


a 12 ³¡ ¢2 ¡ ¢2 ´
q(x) = x1 + x2 − x1 − x2 .
2
Les formes linéaires L 1 (x) = x 1 +x 2 , L 2 (x) = x 1 −x 2 sont linéairement indépen-
dantes car
µ ¶
1 1
P= et d et (P ) 6= 0.
1 −1

3 Principe de la réduction, cas général.

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(x) = a 11 x 12 + x 1 L(x 2 , · · · , x n ) + q̃(x 2 , x 3 , · · · , x n ).

Alors, la dérivée partielle par rapport à x 1 est

∂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

(II) Deuxième cas: a i i = 0, ∀i = 1, · · · , n. Supposons sans perte de généralité


que a 12 6= 0 et que la forme s’écrit sous la forme suivante :

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 ).

Les dérivées partielles par rapport à x 1 , x 2 sont

∂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 :

(I) Réitérer la méthode de Gauss avec q̃ − L 2 /(4a) ou q̃ − L 1 L 2 /2a qui ne dépend


respectivement que de x 2 , x 3 , · · · , x n (et x 3 , · · · , x n ).

Étape finale : On obtient


k
αi L 2i .
X
q(x) =
i =1
Les L i sont des formes linéaires indépendants.

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).

Dans ce qui suit, on présente deux exemples.

Exemple 0 : Déterminer la décomposition de Gauss de

q(x) = x 1 x 2 + x 2 x 3 + x 3 x 4 + x 1 x 4

Les dérivées partielles par rapport à x 1 et x 2 donnent

∂q ∂q
(x) = x 2 + x 4 (x) = x 1 + x 3 .
∂x 1 ∂x 2

Donc, les formes linéaires à utiliser sont L 1 (x 3 , x 4 ) = x 4 , L 2 (x 3 , x 4 ) = x 3 . On obtient


1³ ´
q(x) = (x 1 + x 2 + x 3 + x 4 )2 − (x 1 − x 2 + x 3 − x 4 )2
4
la signature est sg (q) = (1, 1) et le rang r g (q) = 2.

Exemple 1 : Déterminer la décomposition de Gauss de

q(x, y, z) = 2x 2 − 2y 2 − 6z 2 + 3x y − 4xz + 7y z

La dérivée partielle par rapport à x donne

∂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_

#include " u t i l . h"

# endif // _UTIL_H_

# i f n d e f _MATH_H_

#include "math . h"

# endif // _MATH_H_

#include <conio . h>

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

double * * CreateMat ( i n t n)

double * * mat ; // l a matrice

int y; // <y> pour l e s l i g n e s

mat = Malloc ( double * ,n ) ;

f o r ( y =0; y<n ; y++)

mat [ y ] = Malloc ( double , n ) ;

}
return mat ;

} // CreateMat ( )

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

double * * CopyMat( double * * mat , i n t n)

int x ; // <x> pour l e s colonnes

int y ; // <y> pour l e s l i g n e s

double * * c ;

c = CreateMat (n ) ;

f o r ( y =0; y<n ; y++)

f o r ( x =0; x<n ; x ++)

c [ y ] [ x ] = mat [ y ] [ x ] ;

return c ;

} // CopyMat ( )

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
void IdMat ( double * * mat , i n t n)

i n t x ; // <x> pour l e s colonnes

i n t y ; // <y> pour l e s l i g n e s

f o r ( y =0; y<n ; y++)

f o r ( x =0; x<n ; x ++)

mat [ y ] [ x ] = ( x == y ? 1.0 : 0 . 0 ) ;

} // IdMat ( )

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

void DeleteMat ( double * * mat , i n t n)

i n t y ; // <y> pour l e s l i g n e s

f o r ( y =0; y<n ; y++)

Free (mat [ y ] ) ;

Free (mat ) ;
} // DeleteMat ( )

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

void PrintMat ( double * * mat , i n t n)

i n t x ; // <x> pour l e s colonnes

i n t y ; // <y> pour l e s l i g n e s

f o r ( y =0; y<n ; y++)

i f (0 == y )

printf (" / " ) ;

e l s e i f (n−1 == y )

printf (" \\");

else

printf (" | " ) ;

f o r ( x =0; x<n ; x ++)

printf (" %5.2 l f " ,mat [ y ] [ x ] ) ;

i f (0 == y )

printf (" \\ \n " ) ;

e l s e i f (n−1 == y )
printf (" / \n " ) ;

else

printf (" | \n " ) ;

} // PrintMat ( )

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

// GAUSS

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

void gauss ( double * *M, i n t N)

int n, x , y , k ;

n = N−1;

while (n > 0)

// s i on n ’ a pas un terme carre . . .

i f (CmpDouble0(M[ n ] [ n ] ) )

i n t s ; // indice du "swap"

// . . . on cherche un autre terme carre . . .

s = −1;
f o r ( k =0; k<n ; k++)

i f ( ! CmpDouble0(M[ k ] [ k ] ) )

s = k;

break ;

i f ( −1 == s )

// . . . s i on n ’ en trouver decidement pas , on regarde s i on a des produits

// c r o i s e entre l a derniere v a r i a b l e et l ’ avant derniere , puis on elimine

// l e s deux dernieres l i g n e s et colonne :

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 )

//

f o r ( y =0; y<n−1; y++)


{

f o r ( x =0; x<n−1; x ++)

M[ y ] [ x ] −= (M[ n− 1 ] [ x ] *M[ n ] [ y ]+M[ n− 1 ] [ y ] *M[ n ] [ x ] ) /M[ n ] [ n− 1 ] ;

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

// . . . s i on en a trouve un , on l ’ echange et on recommence l a boucle au meme rang

// mais c e t t e f o i s − c i avec un terme carre

f o r ( k =0; k<=n ; k++) // l i g n e : L [ n] <−> L[ s ]

SwapDouble(&M[ n ] [ k ] ,&M[ s ] [ k ] ) ;

f o r ( k =0; k<=n ; k++) // colonne : C[ n] <−> C[ s ]

SwapDouble(&M[ k ] [ n] ,&M[ k ] [ s ] ) ;

else

// . . . on a donc un terme carre , on elimine l a derniere l i g n e et colonne :

//
// ( * * * * 0 )

// ( * * * * 0 )

// ( * * * * 0 )

// ( * * * * 0 )

// ( 0 0 0 0 ? )

//

f o r ( y =0; y<n ; y++)

f o r ( x =0; x<n ; x ++)

M[ y ] [ x ] −= M[n ] [ x ] * M[ y ] [ n] / M[ n ] [ n ] ;

f o r ( k =0; k<n ; k++)

M[ k ] [ n] = M[ n ] [ k ] = 0 . ;

// on passe au rang i n f e r i e u r

n − −;

} // gauss ( )
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

void sign ( i n t * p , i n t * q , double * * mat , i n t n)

double * * diag ;

int k;

( * p) = 0 ;

(*q) = 0;

diag = CopyMat(mat , n ) ;

gauss ( diag , n ) ;

f o r ( k =0; k<n ; k++)

i f ( diag [ k ] [ k ] > MATH_EPSILON)

( * p) ++;

e l s e i f ( diag [ k ] [ k ] < −MATH_EPSILON)

( * q ) ++;

}
DeleteMat ( diag , n ) ;

} // sign ( )

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

void info ( i n t pA , i n t qA , i n t pB , i n t qB)

i f (4==pB && 0==qB && 3==pA && 0==qA)

p r i n t f ( " ensemble vide ( quadrique propre ) \n " ) ;

e l s e i f (3==pB && 1==qB && 3==pA && 0==qA)

p r i n t f ( " e l l i p s o i d e ( quadrique propre ) \n " ) ;

e l s e i f (3==pB && 1==qB && 2==pA && 1==qA)

p r i n t f ( " hyperboloide \ ‘ a deux nappes ( quadrique propre ) \n " ) ;

e l s e i f (3==pB && 1==qB && 2==pA && 0==qA)

p r i n t f ( " paraboloide e l l i p t i q u e ( quadrique propre ) \n " ) ;

e l s e i f (2==pB && 2==qB && 2==pA && 1==qA)


{

p r i n t f ( " hyperboloide \ ‘ a une nappe ( quadrique propre ) \n " ) ;

e l s e i f (2==pB && 2==qB && 1==pA && 1==qA)

p r i n t f ( " paraboloide hyperbolique ( quadrique propre ) \n " ) ;

e l s e i f (3==pB && 0==qB && 3==pA && 0==qA)

p r i n t f ( " point \n " ) ;

e l s e i f (3==pB && 0==qB && 2==pA && 0==qA)

p r i n t f ( " ensemble vide \n " ) ;

e l s e i f (2==pB && 1==qB && 2==pA && 1==qA)

p r i n t f ( " cone\n " ) ;

e l s e i f (2==pB && 1==qB && 2==pA && 0==qA)

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 ( " c y l i nd r e hyperbolique \n " ) ;

e l s e i f (2==pB && 1==qB && 1==pA && 0==qA)

p r i n t f ( " c y l i nd r e parabolique \n " ) ;

e l s e i f (2==pB && 0==qB && 2==pA && 0==qA)

p r i n t f ( " d r o i t e \n " ) ;

e l s e i f (2==pB && 0==qB && 1==pA && 0==qA)

p r i n t f ( " ensemble vide \n " ) ;

e l s e i f (1==pB && 1==qB && 1==pA && 1==qA)

p r i n t f ( " deux plans s \ ’ ecants \n " ) ;

e l s e i f (1==pB && 1==qB && 1==pA && 0==qA)

p r i n t f ( " deux plans p a r a l l \ ‘ e l e s \n " ) ;


}

e l s e i f (1==pB && 0==qB && 1==pA && 0==qA)

p r i n t f ( " plan double\n " ) ;

else

p r i n t f ( " impossible \n " ) ;

} // 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 ) ;

sign (&pB,&qB , mat , 4 ) ;

i f (pB < qB)

SwapInt(&pA,&qA ) ;

SwapInt(&pB,&qB ) ;

p r i n t f ( " signature de M0 : (%d,%d ) \n" ,pA , qA ) ;

p r i n t f ( " signature de M : (%d,%d ) \n" ,pB , qB ) ;

info (pA , qA , pB , qB ) ;

DeleteMat (mat , 4 ) ;

CloseLibUtil ( ) ;

// p r i n t f ("−−− f i n du programme −−−\n " ) ;

getch ( ) ;

return 0 ;

} // WinMain ( )

Vous aimerez peut-être aussi