# Découvrir Scilab/Résolution d'équations

Table des matières — Index
Résolution d'équations
Scilab dispose de plusieurs primitives permettant la résolution d'équations. Nous présentons ci-après quatre fonctions internes, mais il en existe d'autres pour des systèmes spécifiques.

## Équation polynomiale

Rappelons que la commande roots(p) détermine les racines du polynôme p, c'est-à-dire que cette fonction résout l'équation
    p(x) = 0.
L'équation
    p(x) = y
se résout donc avec

## Équation linéaire matricielle

La commande kernel permet de déterminer le noyau de la matrice, c'est-à-dire, pour une matrice M, de résoudre l'équation matricielle
    MX = 0
la syntaxe est simplement :
La division de matrice consiste à résoudre une équation linéaire :
* à droite : X = A/B est la solution de XB = A,
* à gauche : X = A\B est la solution de AX = B,
* on a B/A = (A' \ B')' ;
Notons que l'on peut représenter un système d'équations linéaires par une matrice ; la division matricielle est donc un moyen de résoudre un tel système.
Si la matrice A est creuse, il est recommandé d'utiliser umfpack ; pour résoudre, X = A\B :
Par ailleurs, les résolutions numériques d'équations matricielles font souvent intervenir des décompositions d'une matrice :
* lu(M) : factorisation LU d'une matrice carrée, décomposition en un produit d'une matrice triangulaire inférieure L et d'une matrice triangulaire supérieure U,
* qr(M) : factorisation QR, décomposition en un produit d'une matrice orthogonale Q et une matrice triangulaire supérieure R,
* svd(M) : décomposition en valeurs singulières (singular value decomposition).

## Système d'équations linéaires

Scilab permet la résolution numérique d'un système d'équations linéaires, avec la fonction linsolve
où A est la matrice réelle des coefficients du système d'équations, et b un vecteur de constantes. Les solutions de
    A×x + b = 0
sont de la forme
    x$_0$ + w×kerA,
w étant un réel arbitraire.
Exemple
    Le système d'équation
       ${\begin{cases}3x+y=5\\4x-y=9\end{cases}}$
    est décrit par
       $\mathrm {A} ={\begin{pmatrix}3&1\\4&-1\\\end{pmatrix}},\ b={\begin{pmatrix}-5\\-9\\\end{pmatrix}}$
    donc
    le vecteur
       ${\begin{pmatrix}2\\-1\\\end{pmatrix}}$
    représente la solution x = 2 et y = –1.
    Si maintenant on tape
    indiquant que la solution est unique.
Exemple
    S'il y a plus d'inconnues que d'équations :
       $3x+y=5$
    la première commande renvoie une seule solution ; la deuxième commande indique que les solutions sont de la forme
       ${\begin{cases}x=1,5-0,316\,227\,8\cdot t\\y=0,5+0,948\,683\,3\cdot t\end{cases}}$
    notons qu'il s'agit d'une solution approchée, puisque la vraie solution est du type :
       ${\begin{cases}x=1,5-{\frac {1}{3}}\cdot t\simeq 1,5-0,33\ldots \cdot t\\y=0,5+t\end{cases}}$
Si le système n'admet pas de solution, Scilab affiche le message d'erreur : WARNING:Conflicting linear constraints!.
Scilab permet également la résolution symbolique d'un système linéaire avec la fonction solve
où A est une matrice triangulaire supérieure de réels (les coefficients du système d'équation), c est un vecteur de chaînes de caractères (la partie à droite des signes égal), et w est la matrice résultat de
    A × w = c.
Exemple
    Le système d'équation
       ${\begin{cases}x+y=a_{1}\\y=a_{2}\end{cases}}$
    est décrit par
       $\mathrm {A} ={\begin{pmatrix}1&1\\0&1\\\end{pmatrix}},\ c={\begin{pmatrix}a_{1}\\a_{2}\\\end{pmatrix}}$
    indiquant que la solution est
       $x=a_{1}-a_{2}$ et $y=a_{2}$.
Scilab propose aussi la méthode du gradient conjugué avec la fonction conjgrad. La syntaxe élémentaire est :

## Système d'équations quelconque

Scilab permet la résolution numérique d'un système d'équations quelconques, avec la fonction fsolve.
Considérons un système de n équations à n inconnues (x$_1$, …, x$_n$), de la forme
    $\left\{{\begin{matrix}f_{1}(x_{1},\ldots ,x_{n})=0\\\vdots \\f_{n}(x_{1},\ldots ,x_{n})=0\\\end{matrix}}\right.$
On définit, en tant que fonction externe (voir Programmation > Fonctions) la fonction ƒ qui associe à un vecteur x(x$_1$, …, x$_n$) un vecteur v(vx$_1$, …, v$_n$) :
    $\mathbf {v} =f(\mathbf {x} ){\text{ : }}\left\{{\begin{matrix}v_{1}=f_{1}(x_{1},\ldots ,x_{n})\\\vdots \\v_{n}=f_{n}(x_{1},\ldots ,x_{n})\\\end{matrix}}\right.$
Le système d'équations consiste donc à résoudre : ƒ(x) = 0. La syntaxe utilisée est :
où f est la fonction externe telle que définie ci-dessus et x0 une estimation de la solution. Dans le cas d'un système d'équations, l'entrée x est donc un vecteur de dimension n et la fonction f renvoie un vecteur de dimension n.
Scilab utilise un algorithme du type méthode hybride de Powell. La fonction peut donner le vecteur v correspondant à la solution x estimée (v devant être proche de 0), avec la syntaxe :
Il est recommandé de fournir la jacobienne de ƒ, sous la forme d'une fonction externe ƒ$_J$ :
    $\mathbf {w} =f_{\mathrm {J} }(\mathbf {x} )=\mathrm {J} \mathbf {x}$
où J est la matrice jacobienne :
Exemple
    En reprenant le système d'équations ci-dessus
       ${\begin{cases}3x+y=5\\4x-y=9\end{cases}}$
    on écrit donc
    ce qui donne bien (2 ; –1).
Si la fonction est paramétrée, alors
* dans la définition de la fonction, la variable doit venir avant les paramètres ;
* lors de l'appel de fsolve, la fonction doit être encapsulée avec ses paramètres dans une liste.
Exemple
    Considérons le système
       ${\begin{cases}a\cdot x+b=0\\c\cdot y+d=0\end{cases}}$
    que l'on veut résoudre pour a = 1, b = 2, c = 3, d = 4. On écrit donc
    ce qui donne comme résultat (–2 ; −1,3333333).

## Exemple complet

Considérons un système mécanique simple : une poutre pivote autour d'un point fixe A(x$_A$, y$_A$) ; un vérin fixe pousse sur cette poutre selon un contact ponctuel au point B(x$_B$, y$_B$). La hauteur de la poutre vaut e = 200 mm, le pivot est implanté à mi-hauteur. Le vérin est implanté à une distance horizontale L = 1 000 mm. On a donc x$_B$ – x$_A$ = L, et l'altitude y$_B$ varie. Le sujet présente une symétrie plane, on se place donc dans le plan de symétrie (A, x, y). Dans ce repère, on a donc :
    $\mathrm {A} {\begin{pmatrix}x_{\mathrm {A} }=0\\y_{\mathrm {A} }=0\end{pmatrix}}$
    $\mathrm {B} {\begin{pmatrix}x_{\mathrm {B} }=\mathrm {L} \\y_{\mathrm {B} }\end{pmatrix}}$
On désire connaître l'inclinaison de la poutre en fonction du déplacement du vérin. Pour cela, on détermine l'équation de la droite génératrice de la poutre, située sur sa face inférieure. L'équation générale de cette droite (D) est :
    (D) : y + ax + b = 0 soit (D) : y = –ax – b
et l'on veut donc déterminer les paramètres a et b. Les conditions géométriques sont :
    la droite passe par le point B : y$_B$ + ax$_B$ + b = 0
    la distance de A à (D) vaut r = e/2 : ${\frac {y_{\mathrm {A} }+ax_{\mathrm {A} }+b}{1+a^{2}}}-r^{2}=0$
On doit donc résoudre un système de deux équations, qui n'est pas linéaire.
On désire développer du code que l'on pourra copier-coller. Donc, au niveau des notations :
* les inconnues à résoudre sont mises dans un vecteur X : $\mathrm {X} {\begin{pmatrix}a\\b\end{pmatrix}}$ ;
* les paramètres du problème sont mis dans un vecteur A : $\mathrm {A} {\begin{pmatrix}x_{\mathrm {A} }\\y_{\mathrm {A} }\\x_{\mathrm {B} }\\y_{\mathrm {B} }\\r\end{pmatrix}}$.
Le système d'équations devient donc :
    $\left\{{\begin{matrix}\mathrm {A} (4)+\mathrm {A} (3)\times \mathrm {X} (1)+\mathrm {X} (2)=0\\{\frac {\mathrm {A} (2)+\mathrm {A} (1)\times \mathrm {X} (1)+\mathrm {X} (2)}{1+\mathrm {X} (1)^{2}}}-\mathrm {A} (5)^{2}=0\end{matrix}}\right.$
Or ce problème présente deux solutions, puisqu'il existe deux droites passant par B et tangentes au cercle de centre A et de rayon r. Il faut donc :
* choisir un point de départ X$_0$ proche de la solution afin que l'algorithme converge vers le minimum local adapté ; on choisit la droite (A'B), avec
    A'(x$_A$, y$_A$ – r) ;
    (A'B) : y = y$_A$ + (y$_B$ – y$_{A'}$)/(x$_B$ – x$_A$)⋅(x – x$_A$), donc
    X$_0$(1) = –(y$_B$ – y$_{A'}$)/(x$_B$ – x$_A$) = –(A(4) – A(2) + A(5))/(A(3) – A(1)) ;
    X$_0$(2) = (y$_B$ – y$_{A'}$)/(x$_B$ – x$_A$)⋅x$_A$ – y$_A$ = (A(4) – A(2) + A(5))/(A(3) – A(1)) × A(1) – A(2) ;
* vérifier que la solution trouvée est bonne : on remarque que les deux droites possibles sont symétriques par rapport à la droite (AB), il suffit donc de vérifier que la pente de la droite trouvée est supérieure à celle de la droite (AB) :
    pente$_{(AB)}$ = (y$_B$ – y$_A$)/(x$_B$ – x$_A$) = (A(4) – A(2))/(A(3) – A(1)).
Pour accélérer les calculs, lorsqu'une expression revient plusieurs fois, on la met dans une variable ; on rappelle que seul y$_B$ = A(4) est variable. On identifie donc :
    facteur$_1$ = 1/(A(3) – A(1)) ;
    facteur$_2$ = (–A(2) + A(5)) × facteur$_1$ ;
    facteur$_3$ = A(4) × facteur$_1$ + facteur$_2$ ;
soit
    X$_0$(1) = –facteur$_3$ ;
    X$_0$(2) = facteur$_3$ × A(1) – A(2) ;
    pente$_{(AB)}$ = (A(4) – A(2)) × facteur$_1$.
Donc,
* on connaît A(x$_A$, y$_A$, x$_B$, y$_B$, r)', la valeur y$_B$ prenant plusieurs valeurs successives ; on cherche X(a, b)' ;
* on calcule les valeurs dérivées facteur$_1$ = ƒ(A(1), A(3)) et facteur$_2$ = ƒ(A(2), A(5)) qui sont fixes, et la valeur facteur$_3$ = ƒ(facteur$_1$, facteur$_2$, A(4)) qui dépend de y$_B$ ;
* pour chaque valeur de y$_B$ (et donc de facteur$_3$) :
** on détermine la valeur de départ X$_0$,
** on résout le système d'équations, donc on détermine a et b,
** on vérifie que a est compatible avec la réalité.
On a donc deux vecteurs de valeurs a et b, les valeurs a(i) et b(i) correspondant au déplacement du piston y$_B$(i), ce qui permet de déterminer l'inclinaison de la poutre pour chaque valeur y$_B$(i). La valeur b(i) ne nous sert à rien (b est juste un intermédiaire de calcul permettant de résoudre le système), mais nous la conservons tout de même car elle permet de tracer rapidement la droite solution si cela nous intéresse.
Une fois ceci fait, on désire déterminer les effort aux liaisons, c'est-à-dire la force F$_A$ que l'axe exerce sur la poutre en A, et la force F$_B$ que le vérin exerce sur la poutre en B. La force F$_A$ est totalement inconnue :
    $\mathrm {F_{A}} ={\begin{pmatrix}x_{\mathrm {FA} }\\y_{\mathrm {FA} }\end{pmatrix}}$
et on connaît la direction de la force F$_B$ : c'est le vecteur normal (–a, 1). Le vecteur peut donc s'écrire sous la forme :
    $\mathrm {F_{B}} =\mathrm {C} {\begin{pmatrix}-a\\1\end{pmatrix}}$.
Le système a une m, le centre des masses étant en G(x$_G$, y$_G$) ; prenons arbitrairement m = 100 kg, x$_G$ = 700 mm et y$_G$ = 200 mm. L poids P s'écrit p(0, –mg) avec g = 9,81 m∙s$^{-2}$. Les équations de la statique s'écrivent
    équilibre des forces : ${\vec {\mathrm {F} }}_{\mathrm {A} }+{\vec {\mathrm {F} }}_{\mathrm {B} }+{\vec {\mathrm {P} }}={\vec {0}}$
    équilibre des moments par rapport à A : ${\mathcal {M}}_{\mathrm {A} }({\vec {\mathrm {F} }}_{\mathrm {A} })+{\mathcal {M}}_{\mathrm {A} }({\vec {\mathrm {F} }}_{\mathrm {B} })+{\mathcal {M}}_{\mathrm {A} }({\vec {\mathrm {P} }})=0$
soit
    équilibre des forces : $\left\{{\begin{matrix}x_{\mathrm {FA} }-\mathrm {C} a+0=0\\y_{\mathrm {FA} }+\mathrm {C} -mg=0\end{matrix}}\right.$
    équilibre des moments par rapport à A :$0-x_{\mathrm {G} }\cdot mg+\mathrm {C} \mathrm {L} =0$.
Si l'on définit le vecteur des inconnues
    $\mathrm {X_{F}} ={\begin{pmatrix}x_{\mathrm {FA} }\\y_{\mathrm {FA} }\\\mathrm {C} \end{pmatrix}}$
et les vecteurs de paramètre
    $\mathrm {A_{F}} ={\begin{pmatrix}1&0&-a\\0&1&1\\0&0&L\end{pmatrix}}$
    $b_{\mathrm {F} }={\begin{pmatrix}0\\-mg\\-x_{\mathrm {G} }\cdot mg\end{pmatrix}}$
les équations de la statique s'écrivent sous la forme d'une équation matricielle :
    A$_F$X$_F$ + b$_F$ = 0.
En résolvant ce système, on peut en déduire les intensités des forces :
    $\mathrm {F_{A}} =\|(x_{\mathrm {FA} },y_{\mathrm {FA} })\|$ ;
    $\mathrm {F_{B}} =\mathrm {C} \|(-a,1)\|$.
Concrètement, le programme développé est :
On obtient donc :

## Voir aussi
### Dans Wikipédia

* Solveur d'équations
* Système d'équations

## Notes

* ↑ voir Propriétés métriques des droites et des plans sur Wikipédia.
Calcul différentiel et intégral < ↑ > Optimisation d'une fonction