Scilab Home page | Wiki | Bug tracker | Forge | Mailing list archives | ATOMS | File exchange
Please login or create an account
Change language to: English - Português - Русский - 日本語
Aide de Scilab >> Scilab > Mots clés Scilab > backslash

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());

Voir aussi

  • slash — division à droite et feedback
  • inv — inverse d'une matrice
  • pinv — pseudo-inverse
  • percent — caractère spécial
  • ieee — détermine le mode d'exception IEEE pour les calculs
  • linsolve — solveur d'équation linéaire
  • umfpack — solve sparse linear system

Comments

Author : Michael BAUDIN posted the 13/03/2015 13:58
La phrase "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)." est améliorable.
* 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.
Reply to this comment
Please login to comment this page


Add a comment:
Please login to comment this page.

Report an issue
<< ans Mots clés Scilab brackets ([,]) >>

Scilab Enterprises
Copyright (c) 2011-2015 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Wed Jun 15 08:30:57 CEST 2016