« Découvrir Scilab/Résolution d'équations » : différence entre les versions

Contenu supprimé Contenu ajouté
m →‎Voir aussi : màj
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 15 :
: ''p''(''x'') = ''y''
se résout donc avec
<sourcesyntaxhighlight lang="scilab">
solution = roots(p - y)
</syntaxhighlight>
</source>
 
== Équation linéaire matricielle ==
Ligne 24 :
: MX = 0
la syntaxe est simplement :
<sourcesyntaxhighlight lang="scilab">
X = kernel(M)
</syntaxhighlight>
</source>
La division de matrice consiste à résoudre une équation linéaire :
* à droite : <code>X = A/B</code> est la solution de XB = A,
Ligne 34 :
 
Si la matrice A est creuse, il est recommandé d'utiliser <code>umfpack()</code> ; pour résoudre, <code>X = A\B</code> :
<sourcesyntaxhighlight lang="scilab">
X = umfpack(A, "\" , B)
</syntaxhighlight>
</source>
 
Par ailleurs, les résolutions numériques d'équations matricielles font souvent intervenir des décompositions d'une matrice :
Ligne 46 :
 
Scilab permet la résolution numérique d'un système d'équations linéaires, avec la fonction <code id="linsolve1">linsolve</code>
<sourcesyntaxhighlight lang="scilab">
[x, kerA] = linsolve(A, b)
</syntaxhighlight>
</source>
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
Ligne 73 :
</math>
: donc
<sourcesyntaxhighlight lang="scilab">
-->A = [3 1 ; 4 -1];
 
Ligne 83 :
2.
- 1.
</syntaxhighlight>
</source>
: le vecteur
:: <math>\begin{pmatrix}
Ligne 92 :
: représente la solution ''x'' = 2 et ''y'' = –1.
: Si maintenant on tape
<sourcesyntaxhighlight lang="scilab">
-->[x0, kerA] = linsolve(A,b)
kerA =
Ligne 101 :
2.
- 1.
</syntaxhighlight>
</source>
: indiquant que la solution est unique.
 
Ligne 107 :
: S'il y a plus d'inconnues que d'équations :
:: <math>3x + y = 5</math>
<sourcesyntaxhighlight lang="scilab">
-->A = [3 1] ; b = -5;
 
Ligne 125 :
1.5
0.5
</syntaxhighlight>
</source>
: la première commande renvoie une seule solution ; la deuxième commande indique que les solutions sont de la forme
:: <math>\begin{cases}
Ligne 140 :
 
Scilab permet également la résolution symbolique d'un système linéaire avec la fonction <font id="solve1"><code>solve</code></span>
<sourcesyntaxhighlight lang="scilab">
w = solve(A, c)
</syntaxhighlight>
</source>
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''.
Ligne 163 :
\end{pmatrix}
</math>
<sourcesyntaxhighlight lang="scilab">
-->A = ["1", "1" ; "0", "1"] ; c = ["a1" ; "a2"];
 
Ligne 172 :
! !
!a2 !
</syntaxhighlight>
</source>
: indiquant que la solution est
:: <math>x = a_1 - a_2</math> et <math>y = a_2</math>.
 
Scilab propose aussi la [[w:Méthode du gradient conjugué|méthode du gradient conjugué]] avec la fonction <code>conjgrad()</code>. La syntaxe élémentaire est :
<sourcesyntaxhighlight lang="scilab">
X = conjgrad(A, b)
</syntaxhighlight>
</source>
 
== Système d'équations quelconque ==
Ligne 199 :
Le système d'équations consiste donc à résoudre : ƒ('''x''') = '''0'''.
La syntaxe utilisée est :
<sourcesyntaxhighlight lang="scilab">
[x] = fsolve(x0, f)
</syntaxhighlight>
</source>
où <code>f</code> est la fonction externe telle que définie ci-dessus et <code>x0</code> 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 <code>f</code> renvoie un vecteur de dimension ''n''.
 
Scilab utilise un algorithme du type [[w:en:Powell's method|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 :
<sourcesyntaxhighlight lang="scilab">
[x, v] = fsolve(x0, f)
</syntaxhighlight>
</source>
Il est recommandé de fournir la jacobienne de ƒ, sous la forme d'une fonction externe ƒ<sub>J</sub> :
: <math>\mathbf{w} = f_\mathrm{J}(\mathbf{x}) = \mathrm{J}\mathbf{x}</math>
où J est la matrice jacobienne :
<sourcesyntaxhighlight lang="scilab">
[x] = fsolve(x0, f, fJ)
</syntaxhighlight>
</source>
 
'''Exemple'''
Ligne 223 :
</math>
: on écrit donc
<sourcesyntaxhighlight lang="scilab">
function [y] = f(x)
y = [3, 1 ; 4, -1]*x - [5 ; 9];
Ligne 230 :
x0 = [0 ; 0];
solution = fsolve(x0, f)
</syntaxhighlight>
</source>
: ce qui donne bien (2 ; –1).
 
Ligne 244 :
\end{cases}</math>
: que l'on veut résoudre pour ''a'' = 1, ''b'' = 2, ''c'' = 3, ''d'' = 4. On écrit donc
<sourcesyntaxhighlight lang="scilab">
function [Y] = f(X, A, b)
Y = A*X + b;
Ligne 257 :
// alternative : solution = fsolve(X0, list(f, A = param1, b = param2));
disp(solution);
</syntaxhighlight>
</source>
: ce qui donne comme résultat (–2 ; {{formatnum:–1.333,333,3}}).
 
Ligne 336 :
 
Concrètement, le programme développé est :
<sourcesyntaxhighlight lang="scilab">
// paramètres du problème géométrique
xA = 0;
Ligne 439 :
disp([yB', round(iFA), round(iFB)]); // angle en °, arrondi
 
</syntaxhighlight>
</source>
 
On obtient donc :
<sourcesyntaxhighlight lang="text">
position (mm), angle (°)
 
Ligne 470 :
155. 319. 698.
175. 325. 700.
</syntaxhighlight>
</source>
 
== Voir aussi ==