Considérons le système:
0,12065x + 0,98775y= 2,01045
0,12032x + 0,98755y= 2,00555
Et commençons par le résoudre de façon exacte avec notre programme 'ad-hoc'.

Voici le résultat de l'exécution:
(2413/2000,3951/400)
(752/625,19751/2000)
*********************
(40209/2000)
(40111/2000)
*********************
(39502000/120731,-39510000/120731)
(-4812800/120731,4826000/120731)
*********************
x= 1775154/120731
y= 144527/603655
*********************
x= 14.70338189860102210699820262
y= 0.2394198673083135234529656840
Changeons maintenant très légèrement le membre de droite:
0,12065x + 0,98775y= 2,01145
0,12032x + 0,98755y= 2,00555
Exécutons à nouveau notre programme de résolution.
Voici le résultat de l'exécution:
(2413/2000,3951/400)
(752/625,19751/2000)
*********************
(40229/2000)
(40111/2000)
*********************
(39502000/120731,-39510000/120731)
(-4812800/120731,4826000/120731)
*********************
x= 2170174/120731
y= -96113/603655
*********************
x= 17.97528389560262070222229585
y= -0.1592184277443241586667881489
On s'aperçoit qu'une erreur d'arrondi de l'ordre de 1/1000 provoque une erreur relativement importante dans les solutions. La notion de système 'mal conditionné' n'a aucun sens du point de vue mathématique pur, mais elle à un sens du point de vue du calcul numérique avec des programmes de calcul. Elle dépend notamment de deux facteurs essentiels:
L'algorithme utilisé
La précision des types numériques utilisé pour les calculs (float, double, long double, etc...)

Nous conviendrons donc d'appeler 'mal conditionnés' des systèmes pour lesquels une faible variation des données entraîne une forte variation des solutions.
De fait nous pouvons constater que dans tous les cas il s'agit de systèmes pour lesquels le déterminant de la matrice est très petit. Donc les hyperplans affines solutions de chaque équation sont 'presque parallèles' et se coupent très loin de l'origine.

Café Python

C'est l'occasion de montrer que le module scipy.linalg se tire fort bien d'affaire même avec des systèmes volontairement piégés.

Résultat de l'éxécution:
[[ 14.7033819 ]
[ 0.23941987]]
*********************
[[ 17.9752839 ]
[ -0.15921843]]

Une mesure du conditionnement

Dans tout ce qui suit on suppose qu'on a affaire à un espace euclidien réel. On considère exclusivement des systèmes de Cramer. Sachant que X (solution) est lié à B (données initiales) par X=A -1 B. On désigne par dB une variation de B et par dX la variation de X correspondante. L'idée est de majorer ||dX||/||X|| relativement à ||dB||/||B||. Il s'agit ici de normes euclidiennes de vecteurs de ℝn.
Il existe plusieurs façons de définir la 'norme' d'une matrice A=(αi,j)1≤i,j≤n. L'une consiste à prendre ||A||= Sup(|αi,j|)1≤i,j≤n. On vérifie qu'on a bien une norme et que de plus:
||AX|| ≤ ||A||×||X|| Un calcul rapide montre qu'on a toujours: ||dx||/||X|| ≤ ||A|| × ||A-1||×||dB||/||B||
d'où l'importance du nombre ||A||×||A-1|| que l'on calcule avec diverses normes pour établir le degré de fiabilité des solutions.