Réduction de Gauss-Jordan : rref gaussjord

### 6.61.3 Réduction de Gauss-Jordan : `rref gaussjord`

`rref` permet de résoudre un système d’équations linéaires que l’on écrit sous forme matricielle (voir aussi 6.34.17) :

`A*X=B`

`rref` a un ou deux paramètres.

- Si `rref` n’a qu’un paramètre, ce paramètre est la "matrice augmentée" du système (celle formée par la matrice `A` du système et ayant comme dernier vecteur colonne le second membre `B`).
  Le résultat est une matrice `[A1,B1]` : `[A1,B1]` a des zéros de part et d’autre de sa diagonale et des 1 sur sa diagonale et les solutions de :
  `A1*X=B1`
  sont les mêmes que celles de :
  `A*X=B`
  `rref` peut travailler dans ℤ/pℤ.
  Par exemple, soit à résoudre le système dans ℝ et dans ℤ/5ℤ:

  ⎧ ⎨ ⎩ |
  3x + y | = | −2
  3x +2y | = | 2

  On tape pour résoudre le système dans ℝ:
  `rref([[3,1,-2],[3,2,2]])`
  On obtient :
  `[[1,0,-2],[0,1,4]]`
  cela signifie donc que :
  x=−2 et y=4 sont solutions du système.
  On tape pour résoudre le système dans ℤ/5ℤ:
  `rref([[3,1,-2],[3,2,2]]%5)`
  On obtient :
  `[[1 % 5,0,-2 % 5],[0,1 % 5,-1 % 5]]`
  cela signifie donc que :
  x=−2%5 et y=−1%5 sont solutions du système.
- Si `rref` a deux paramètres, le deuxième paramètre est un entier k qui permet de ne faire Gauss-Jordan que sur les k premières colonnes ou est l’option `conserver_pivot` ou `keep_pivot`.
  On tape :
  `rref([[3,1,-2,1],[3,2,2,2]],1)`
  On obtient :
  `[[3,1,-2,1],[0,1,4,1]]`
  L’option `conserver_pivot` ou `keep_pivot` permet de ne pas diviser par les pivots, cela pour éviter de diviser par des pivots nuls.
  par exemple, pour résoudre le système dans ℝ et dans ℤ/2ℤ:

  ⎧ ⎪ ⎨ ⎪ ⎩ |
  z1 + z2 | = a1
  z2 + z3 | = a2
  z3 + z4 | = a3
  z4 + z1 | = a4

  On tape pour résoudre le système dans ℝ :
  `A:=syst2mat([z1+z2=a1,z2+z3=a2,z3+z4=a3,z4+z1=a4], [z1,z2,z3,z4])`
  puis,
  `rref(A,keep_pivot)`
  ou bien, on tape directement :
  `rref([[1,1,0,0,-a1],[0,1,1,0,-a2],[0,0,1,1,-a3], [1,0,0,1,-a4]],keep_pivot)`
  On obtient :
  `[[a1-a2+a3-a4,0,0,a1-a2+a3-a4,0], [0,a1-a2+a3-a4,0,-a1+a2-a3+a4,0], [0,0,a1-a2+a3-a4,a1-a2+a3-a4,0], [0,0,0,0,a1-a2+a3-a4]]`

  Remarque
  Lorsque le nombre de colonnes est égal au nombre de lignes +1 `rref` ne divise pas par le pivot de la derniere colonne, par exemple, pour résoudre le système :

  ⎧ ⎪ ⎨ ⎪ ⎩ |
  z1 + z2 | = a1
  z2 + z3 | = a2
  z3 + z4 | = a3
  z4 + z1 | = a4

  On tape :

  `A:=syst2mat([z1+z2=a1,z2+z3=a2,z3+z4=a3,z4+z1=a4], [z1,z2,z3,z4])`
  `rref([[1,1,0,0,-a1],[0,1,1,0,-a2],[0,0,1,1,-a3], [1,0,0,1,-a4]])`

  On obtient :

  `[[1,0,0,1,0],[0,1,0,-1,0],[0,0,1,1,0], [0,0,0,0,a1-a2+a3-a4]]`

  Ainsi on peut savoir que si `a1-a2+a3-a4` n’est pas nul, il n’y a pas de solution. Puis, on tape :

  `rref([[1,1,0,0,-a1],[0,1,1,0,-a2],[0,0,1,1,-a3], [1,0,0,1,-a4]],3)`

  On obtient :

  `[[1,0,0,1,-a1+a2-a3],[0,1,0,-1,-a2+a3],[0,0,1,1,-a3], [0,0,0,0,1]]`

  ou encore si on remplace `a4` par `a1-a2+a3`, on tape :

  `rref([[1,1,0,0,-a1],[0,1,1,0,-a2],[0,0,1,1,-a3], [1,0,0,1,-a1+a2-a3]])`

  On obtient :

  `[[1,0,0,1,-a1+a2-a3],[0,1,0,-1,-a2+a3],[0,0,1,1,-a3], [0,0,0,0,0]]`

  On peut aussi taper :

  `rref([[1,1,0,0,-a1],[0,1,1,0,-a2],[0,0,1,1,-a3], [1,0,0,1,-a4]],3,keep_pivot)`

  On obtient tout de suite:

  `[[1,0,0,1,-a1+a2-a3],[0,1,0,-1,-a2+a3],[0,0,1,1,-a3], [0,0,0,0,a1-a2+a3-a4]]`

  Donc, les solutions lorsque `a1-a2+a3-a4=0` sont :
  `z1=a1-a2+a3-z4, z2=a2-a3+z4, z3=a3-z4, z4=z4`.
  On tape pour résoudre le système dans ℤ/2ℤ :

  `rref([[1,1,0,0,-a1],[0,1,1,0,-a2],[0,0,1,1,-a3], [1,0,0,1,-a4]]%2,3,keep_pivot)`

  On obtient :
  `[[1 % 2,0,0,1 % 2,(1 % 2)*a1+(1 % 2)*a2+(1 % 2)*a3],`
  `[0,1 % 2,0,1 % 2,(1 % 2)*a2+(1 % 2)*a3],[0,0,1 % 2,1 % 2,(1 % 2)*a3],`
  `[0,0,0,0,(1 % 2)*a1+(1 % 2)*a2+(1 % 2)*a3+(1 % 2)*a4]]`
  Donc lorsque `(a1+a2+a3+a4=0%2)`, les solutions dans ℤ/2ℤ sont :
  `z1=a1+a2+a3+z4%2, z2=a2+a3+z4%2, z3=a3+z4%2, z4=(1 % 2)*z4`.

- `rref` permet aussi de résoudre plusieurs systèmes d’équations linéaires qui ne diffèrent que par leur second membre. On écrit alors les second membres comme les colonnes d’une matrice.
  On tape :
  `rref([[3,1,-2,1],[3,2,2,2]])`
  On obtient :
  `[[1,0,-2,0],[0,1,4,1]]`
  cela signifie donc que :
  x=−2 et y=4 sont solutions du système

  ⎧ ⎨ ⎩ |
  3x + y | = | −2
  3x +2y | = | 2

  et que x=0 et y=1 sont solutions du système

  ⎧ ⎨ ⎩ |
  3x + y | = | 1
  3x +2y | = | 2