backslash
(\) division matricielle à gauche
Séquence d'appel
x=A\b
Description
L'anti-slash représente la division matricielle à gauche.
x=A\b
est une solution de A*x=b
.
Si A
est carrée et régulière x=A\b
(unique) est équivalent mathématiquement à x=inv(A)*b
(dont le calcul est par contre beaucoup plus coûteux).
Si A
n'est pas carrée, x
est une solution au sens des moindres carrés, c'est à dire que norm(A*x-b)
est minimale (norme euclidienne). Si A
est de rang maximal (colonnes linéairement indépendantes), la solution au sens des moindres carrés, x=A\b
, est unique (le vecteur x
minimisant norm(A*x-b)
est unique).
Si A
n'est pas de rang maximal, cette solution n'est pas unique, et x=A\b
, en général, n'est pas la solution de norme minimale (la solution de norme minimale est x=pinv(A)*b
).
A.\B
est la matrice dont le terme (i,j)
est égal à A(i,j)\B(i,j)
.
Si A
(ou B
) est un scalaire A.\B
est équivalent à A*ones(B).\B
(or A.\(B*ones(A))
.
A\.B
est un opérateur dont la signification n'est pas prédéfinie. il peut être utilisé pour définir de nouveaux opérateurs (voir overloading) avec la même priorité que *
ou /
.
Exemples
A=rand(3,2);b=[1;1;1]; x=A\b; y=pinv(A)*b; x-y A=rand(2,3);b=[1;1]; x=A\b; y=pinv(A)*b; x-y, A*x-b, A*y-b // Rang non maximal A=rand(3,1)*rand(1,2); b=[1;1;1]; x=A\b; y=pinv(A)*b; A*x-b, A*y-b A=rand(2,1)*rand(1,3); b=[1;1]; x=A\b; y=pinv(A)*b; A*x-b, A*y-b // Une comparaison de différents solveurs linéaire creux [A,descr,ref,mtype] = ReadHBSparse(SCI+"/modules/umfpack/examples/bcsstk24.rsa"); b = zeros(size(A,1),1); tic(); res = umfpack(A,'\',b); mprintf('\ntemps nécessaire à la résolution du système avec umfpack: %.3f\n',toc()); tic(); res = linsolve(A,b); mprintf('\ntemps nécessaire à la résolution du système avec linsolve: %.3f\n',toc()); tic(); res = A\b; mprintf('\ntemps nécessaire à la résolution du système avec l''opérateur backslash: %.3f\n',toc());
Comments
* On dit rarement "régulière", mais plutôt "inversible". La condition "et régulière" est maladroite, car le code ne teste pas la singularité mathématique de la matrice (qui est inconnue et incalculable). Le code teste d'abord si la matrice est carrée. Si c'est le cas, il factorise la matrice grâce à sa décomposition LU. Le branchement est réalisé en fonction du conditionnement de la matrice (et non sa singularité).
* x=inv(A)*b est, certes, plus coûteux, mais aussi moins précis. C'est parce que Lapack utilise le pivot de Gauss avec permutation des lignes, de telle sorte que la solution x est associée, au pire, à une erreur relative proportionnelle au conditionnement de la matrice A. Le fait que inv(A)*b est plus coûteux est, en fait, mineur sur le plan de la précision du calcul.
C'est pourquoi je propose de traduire la formulation anglaise :
http://help.scilab.org/docs/5.5.1/en_US/backslash.html
par ceci :
Si A est carré et non-singulière, X=A\B est équivalent à X=inv(A)*B en arithmétique exacte, mais le calcul réalisé par backslash est plus précis et et moins coûteux en arithmétique flottante. Par conséquent, pour calculer la solution du système d'équations linéaires A*X=B, on devrait plutôt utiliser l'opérateur backslash, et éviter la fonction inv.
Dans le cas où A est carrée, la solution X peut être calculée soit par décomposition LU ou bien par résolution d'un problème de moindres carrés linéaires. Si le conditionnement est plus petit que 1/(10*%eps) (c'est à dire si la matrice A est bien conditionnée), alors la décomposition LU est utilisée. Sinon (c'est à dire si A est mal conditionnée), alors X est la solution de norme minimale qui minimise ||A*X-B||. Elle est calculée en utilisant une décomposition orthogonale de A et, dans ce cas, X est la solution du problème de moindres carrés linéaires associé à A.
Add a comment:
Please login to comment this page.