Pour lancer Scilab on a deux possibilités : 
 soit on ouvre un terminal,
on se place dans le répertoire de travail grâce à 
la commande cd
et ensuite on tape scilab ;
 soit on ouvre un terminal,
on se place dans le répertoire de travail grâce à 
la commande cd
et ensuite on tape scilab ;
 soit on passe par le menu
 soit on passe par le menu 
 ->
->
 ->
->
 ,
dans ce cas le répertoire de travail peut être choisi
dans le menu
,
dans ce cas le répertoire de travail peut être choisi
dans le menu  
 ->
->
 .
.
| ![\includegraphics[width=12cm]{scilab_w_intro.eps}](img9.png) | 
On obtient ainsi une ligne commande, indiquée par  -->
Pour alléger ces notes, on omettra systématiquement ce ``prompt'' (invite de commande) :
1+1
Scilab est basé sur le principe
que tout calcul, programmation ou tracé graphique peut se faire à 
partir de matrices rectangulaires. 
En Scilab, tout est matrice : les scalaires sont des matrices
 , les éléments de
, les éléments de 
 sont
des vecteurs colonnes, c-à-d des matrices
 sont
des vecteurs colonnes, c-à-d des matrices  et les vecteurs lignes sont des matrices
et les vecteurs lignes sont des matrices  .
.
Pour démarrer, et pour une utilisation ``légère'', vous rentrerez des commandes ligne par ligne.
Un ``retour-chariot''  
 exécute la
ligne, sauf dans deux cas :
 exécute la
ligne, sauf dans deux cas :
 si la ligne se termine par deux points, la séquence de commandes se
prolonge sur la ligne suivante ;
si la ligne se termine par deux points, la séquence de commandes se
prolonge sur la ligne suivante ;
 si la commande définit une matrice, les lignes de cette matrice
peuvent être séparées par des retour-chariot. Ceci sert
essentiellement à importer de grandes matrices depuis des fichiers.
si la commande définit une matrice, les lignes de cette matrice
peuvent être séparées par des retour-chariot. Ceci sert
essentiellement à importer de grandes matrices depuis des fichiers.
Dans une ligne de commande, tout ce qui suit // est ignoré,
ce qui est utile pour les commentaires. Les commandes que nous
proposons sur des lignes successives sont supposées être
séparées par des retour-chariot.
A=[1,2,3;4,5,6;7,8,9] // definit une matrice 3X3 A=[1,2,3;4, // message d'erreur A=[1,2,3;4,.. // attend la suite de la commande 5,6;7,8,9] // la meme matrice est definie A=[1,2,3; // premiere ligne 4,5,6; // deuxieme ligne 7,8,9] // fin de la matrice
Ajouter un point virgule en fin de ligne supprime l'affichage du résultat (le calcul est quand même effectué). Ceci évite les longs défilements à l'écran, et s'avère vite indispensable.
x=ones(1,100); // rien n'apparait x // le vecteur x a bien ete defini
Ligne de commande : Il est fréquent que des commandes doivent être répétées avec des 
modifications mineures. Il est inutile
de tout taper à nouveau : il suffit d'appuyer sur la touche 
 pour rappeler les commandes précédentes. On peut alors les
modifier : en reculant dans la ligne avec
pour rappeler les commandes précédentes. On peut alors les
modifier : en reculant dans la ligne avec   
 ou en avançant 
 avec
 ou en avançant 
 avec   
 . On 
 les exécute à nouveau par un retour-chariot.
. On 
 les exécute à nouveau par un retour-chariot. 
Dans les noms de variables, les majuscules sont distinctes des
minuscules. Les résultats sont affectés par défaut à la
variable ans (``answer''), qui contient donc le résultat du
dernier calcul non affecté.
 
Toutes les variables d'une session sont globales et conservées en
mémoire. Des erreurs proviennent souvent de confusions avec des noms de
variables déjà affectés. Il faut penser à ne pas toujours
utiliser les mêmes noms ou à libérer les variables par
clear. Les variables courantes sont accessibles par who
et whos. 
a=[1,2]; A=[1,2;3,4]; // affecte a et A 1+1 // affecte ans who // toutes les variables whos() // les details techniques clear a who // a disparait clear who // a, A et ans disparaissent
Il faut aussi faire attention à ne pas utiliser des noms de fonctions prédéfinies.
gamma(1) // appel de la fonction gamma gamma=3 // warning gamma(1) // 1er de la variable gamma gamma(4) // erreur : pas de 4e element dans gamma clear // efface les variables de l'utilisateur gamma(4) // la fonction gamma est de nouveau disponible
L'aide en ligne est appelée par help. La commande
apropos permet de retrouver les rubriques d'aide quand on ignore le nom
exact d'une fonction.
help help help apropos apropos matrix // rubriques dont le titre contient "matrix" help matrix // aide de la fonction "matrix"
On peut aussi accéder à l'aide grâce au menu 
 ->
->
 de la fenêtre Scilab.
 de la fenêtre Scilab.
x=[1,2,3] x' A=[1,2,3;4,5,6;7,8,9] A'
On a souvent besoin de connaître les dimensions
d'une matrice (par exemple pour vérifier si un vecteur est une ligne
ou une colonne). On utilise pour cela la fonction size.
| La fonction size | |
| size(A) | nombre de lignes et de colonnes | 
| size(A,"r")ousize(A,1) | nombre de lignes | 
| size(A,"c")ousize(A,2) | nombre de colonnes | 
| size(A,"*") | nombre total d'éléments | 
Note : ``ligne'' est en anglais ``row'', et ``colonne'' se traduit par ```column''.
help size A=[1,2,3;4,5,6] size(A) size(A') size(A,1) size(A,"c") size(A,"*")
Les commandes d'itération permettent de construire des vecteurs
de nombres séparés par des pas positifs ou
négatifs.
La syntaxe de base, [deb:pas:fin],  retourne un vecteur
ligne de valeurs allant de deb à fin par valeurs
séparées par des multiples de pas. Les crochets sont 
facultatifs. 
Par défaut, pas vaut  . 
Selon que
. 
Selon que fin-deb est ou non un multiple entier de 
pas, le vecteur se terminera ou non par fin.
Si l'on souhaite un vecteur
commençant par deb et se terminant par fin avec
n coordonnées régulièrement espacées, il est préférable
d'utiliser linspace(deb,fin,n).
v=0:10 v=0.10 v=[0:10] v=[0;10] v=[0,10] // attention aux confusions v=[0:0.1:1] size(v) v=[0:0.1:0.99] size(v) v=[0:0.15:1] v=[1:-0.15:0] v=linspace(0,1,10) v=linspace(0,1,11) v=linspace(0,1) // attention, n=100 par défaut v=logspace(1,2,11) log10(v) // voir l'aide en ligne
L'élément de la i-ième ligne, j-ième colonne de
la matrice A est A(i,j). Si v et w sont
deux vecteurs d'entiers, A(v,w) désigne la sous-matrice 
extraite de A en conservant les éléments dont
l'indice de ligne est dans v et l'indice de colonne dans
w. A(v,:) (respectivement : A(:,w)) désigne la 
sous-matrice formée des lignes (resp. : des colonnes) indicées par 
les coordonnées de v (resp. : w).
Les coordonnées sont numérotées à partir de  . Le dernier
indice peut être désigné par
. Le dernier
indice peut être désigné par $.
A=[1,2,3;4,5,6] A(2,2) A(:,2) A(:,[1,3]) A(1,$) A($,2)
On peut modifier un élément, une ligne, une colonne, pourvu 
que le résultat reste une matrice. Pour supprimer des éléments, 
on les affecte à la matrice vide : []
A=[1,2,3;4,5,6] A(1,3)=30 A(:,[1,3])=[10,20] // erreur A(:,[1,3])=[10,30;40,60] A(:,[1,3])=0 A(:,2)=[]
Il suffit d'une coordonnée pour repérer les éléments d'un vecteur ligne ou colonne.
v=[1:6] v(3) v(4)=40 v([2:4])=[] w=[1:6]' w([2,4,6])=0
Faire appel à un élément dont les coordonnées dépassent celles de la matrice provoque un message d'erreur. Cependant on peut étendre une matrice en affectant de nouvelles coordonnées, au-delà de sa taille. Les coordonnées intermédiaires sont nulles par défaut.
A=[1,2,3;4,5,6] A(0,0) // erreur A(3,2) // erreur A(3,2)=1 v=[1:6] v(8) // erreur v(8) = 1
| Vecteurs | |
| x:y | nombres de xàypar pas de 1 | 
| x:p:y | nombres de xàypar pas dep | 
| linspace(x,y) |  nombres entre xety | 
| linspace(x,y,n) | nnombres entrexety | 
| v(i) | i-ième coordonnée dev | 
| v($) | dernière coordonnée de v | 
| v(i1:i2) | coordonnées i1ài2dev | 
| v(i1:i2)=[] | supprimer les coordonnées i1ài2dev | 
| Matrices | |
| A(i,j) | coefficient d'ordre i,jdeA | 
| A(i1:i2,:) | lignes i1ài2deA | 
| A($,:) | dernière ligne de A | 
| A(i1:i2,:)=[] | supprimer les lignes i1ài2deA | 
| A(:,j1:j2) | colonnes j1àj2deA | 
| A(:,$) | dernière colonne de A | 
| A(:,j1:j2)=[] | supprimer les colonnes j1àj2deA | 
| diag(A) | coefficients diagonaux de A | 
Si A, B, C, D sont 4 matrices, les
commandes [A,B], [A;B], [A,B;C,D] retourneront
des matrices construites par blocs, pourvu que les dimensions
coïncident. En particulier, si v et w sont
deux vecteurs lignes, [v,w] les concaténera, 
tandis que [v;w] les empilera. 
A=[1,2,3;4,5,6] M=[A,A] M=[A;A] M=[A,A'] // erreur M=[A,[10;20];[7,8,9],30] M=[A,[10,20];[7,8,9],30] // erreur
Des fonctions prédéfinies permettent de construire certaines matrices particulières.
| Matrices particulières | |
| zeros(m,n) | matrice nulle de taille m,n | 
| ones(m,n) | matrice de taille m,ndont les coefficients 
valent 1 | 
| eye(m,n) | matrice identité de taille min( m,n), complétée
par des zéros | 
| rand(m,n) | matrice de taille m,nà coefficients 
aléatoires uniformes sur![$ ]0,1[$](img22.png)  | 
| diag(v) | matrice diagonale dont la diagonale est le vecteur v | 
| diag(v,k) | matrice  dont la  -ième diagonale est le vecteur v | 
| diag(A) | extrait la diagonale de la matrice A | 
| diag(A,k) | extrait la  -ième diagonale de la matrice A | 
| triu(A) | annule les coefficients au-dessous de la diagonale | 
| tril(A) | annule les coefficients au-dessus de la diagonale | 
| toeplitz | matrices à diagonales constantes | 
| testmatrix | carrés magiques et autres | 
d=[1:6]
D=diag(d)
diag(d,1)
A=[1,2,3;4,5,6]
d=diag(A)
B=[A,zeros(2,3);rand(2,2),ones(2,4)]
diag(B,1)
diag(B,-1)
diag(B,0)
help testmatrix
M=testmatrix("magi",3)
help toeplitz
M=toeplitz([1:4],[1:5])
triu(M)
tril(M)
Les commandes zeros, ones, eye, rand
retournent des matrices dont la taille peut être spécifiée soit
par un nombre de lignes et de colonnes, soit par une autre matrice. Si
un seul nombre est donné comme argument, ce nombre est compris comme
une matrice de taille  .
.
A=ones(5,5) // 5 lignes et 5 colonnes rand(A) // idem eye(A) // idem eye(5) // 1 ligne et 1 colonne ones(5) // idem rand(size(A)) // 1 ligne et 2 colonnes
On dispose de deux moyens pour réordonner des coefficients 
en une nouvelle matrice. La commande A(:) concatène
toutes les colonnes de A en un seul vecteur colonne (on peut
jouer avec la transposée pour concaténer les vecteurs lignes).
La fonction matrix crée une matrice de dimensions
spécifiées, pourvu qu'elles soient compatibles avec l'entrée.
On peut même créer avec matrix des tableaux à plus de
deux entrées (hypermatrices), ce qui ne sert que rarement.
v=[1:6] help matrix A=matrix(v,2,2) // erreur A=matrix(v,3,3) // erreur A=matrix(v,2,3) A=matrix(v,3,2)' w=A(:) A=A'; w=A(:)' H=matrix([1:24],[2,3,4])
Remarquons qu'un peu d'algèbre permet souvent
de construire des matrices particulières à peu de frais, en
utilisant le produit, noté *, et la transposée. Le produit
de Kronecker, kron ou .*., peut également être utile. 
A=ones(4,1)*[1:5] A=[1:4]'*ones(1,5) B=[1,2;3,4] kron(B,B) kron(B,eye(B)) kron(eye(B),B) kron(B,ones(2,3)) kron(ones(2,3),B)
Un générateur(s) de nombres pseudo-aléatoires plus performant que rand est 
fourni par la commande grand. Dans sa syntaxe, il faut indiquer
les dimensions du tableau, la loi  de distribution et les paramètres nécessaires :
grand(2,2,'bin',100,0.5) grand(1,10,'uin',-100,100) help grand
2+3*4 (2+3)*4 2^3*4 2^(3*4) 2^3^4 (2^3)^4
Toutes les opérations habituelles +, -, *, ^, / 
sont matricielles. Tenter une opération entre
matrices de tailles non compatibles retournera en général un
message d'erreur, sauf si une des matrices est un scalaire. Dans
ce cas, l'opération (addition, multiplication, puissance) 
s'appliquera terme à terme.
A=[1,2,3;4,5,6] A+ones(1,3) // erreur A+ones(A) A+10 A*10 A*ones(A) // erreur A*ones(A') A'*ones(A)
Il n'y a pas d'ambiguïté sur l'addition, mais il est souvent utile de pouvoir appliquer des multiplications terme à terme sans qu'elles soient interprétées comme des produits matriciels.
Dans ce cas on considère que les matrices sont des tableaux qui doivent avoir les mêmes dimensions afin de garantir un sens aux opérations terme à terme. Plus loin (section 1.5) on verra que les fonctions mathématiques habituelles s'appliquent en général terme à terme.
Le symbole d'opérateur, * ou ^, doit alors être
précédé d'un point, .* ou .^  
A=[1,2,3;4,5,6] A*A // erreur A*A' A.*A' // erreur A.*A A=[1,2;3,4] A^3 A.^3 // attention 2.^A 2^A // attention A.^A
La division est un cas particulier dangereux. Par défaut, 
la division à droite, 
A/B, calcule une solution d'un système linéaire, 
X*B=A.
A=[1,2;3,4] B=[1,2;2,2] D=A./B X=A/B X*B
Si v est un vecteur colonne, 1/v retourne un 
vecteur ligne w tel que w*v=1. Ceci engendre
des erreurs fréquentes, d'autant que 1./v,
compris comme (1.0)/v, retourne la même chose.
Il y a plusieurs solutions à ce problème, dont la plus
simple consiste à mettre des parenthèses : (1)./v
v=[1,2,3]' w=1/v w*v 1./v (1)./v ones(v)./v v.^(-1) v=v' w=1/v 1./v
| Opérations matricielles | |
| + - | addition, soustraction | 
| * ^ | multiplication, puissance (matricielles) | 
| .* .^ | multiplication, puissance terme à terme | 
| A\b | solution de A*x=b | 
| b/A | solution de x*A=b | 
| ./ | division terme à terme | 
| Constantes prédéfinies | |
| %pi | 3.1415927 | 
| %e | 2.7182818 | 
| %i |   | 
| %eps | précision machine | 
| %inf | infini | 
| %t | vrai | 
| %f | faux | 
| %s | variable de polynôme | 
Scilab est un langage faiblement typé. Les variables ne sont
pas déclarées, et la même lettre peut désigner un réel, un
entier, un polynôme, ou une fonction. Les types existent bien sûr,
et peuvent être obtenus par la fonction type. Par défaut,
les nombres sont traités comme des réels en double précision.
Les calculs ne sont donc pas ``exacts''. La précision machine
est donnée par la constante %eps, de l'ordre de  .
Cela ne signifie pas que les nombres inférieurs à
.
Cela ne signifie pas que les nombres inférieurs à %eps
ou supérieurs à 1/%eps sont inaccessibles, mais que Scilab
ne peux  distinguer deux réels que à %eps près.
help type help typeof %eps 1/%eps a=1+%eps typeof(a) a-1 b=(1+a)/2 b-a b-1 1/%inf 1/0.0000000000000000000000000000000000000003 1/300000000000000000000000000000000000000000 A=[1,2,3;4,5,6;7,8,8] A/A A*(1/A) 2^[1:20] 2^2^[1:20]
La commande format permet de modifier l'affichage des réels.
a=1/3
format("v",15); a
format("e",5);  a
format("e",15); a
format("v",25); a
%eps
100000/3
tan(atan(1))
v=[-1:0.1:1];
v(11)
w=linspace(-1,1,21);
w(11)
format('v',10)   // retour au valeurs par défaut
À part les réels, les entrées d'une matrice peuvent être 
des complexes, des
booléens, des polynômes ou des chaînes de caractères.
Les booléens sont %t (true) et %f (false)
pour les saisies, T et F pour les
affichages. L'égalité logique est notée == pour la
distinguer de l'affectation.
a=2==3 b=2<3 c=%t a|(b&c)
| Opérateurs logiques | |||
| == | égalité | ~ | non | 
| < |   | > |   | 
| <= |   | >= |   | 
| & | et | | | ou | 
Les matrices booléennes sont le résultat d'opérations
logiques matricielles (toujours terme à terme). Par exemple,
si A et B sont deux matrices (réelles) de même
taille, A<B est la matrice des booléens
A(i,j)<B(i,j). Les opérateurs
and et or peuvent s'appliquer à l'ensemble des 
éléments d'une matrice booléenne, à ses lignes 
ou à ses colonnes selon
l'option choisie. La commande find(v) retourne la liste des indices
des coordonnées ``vraies'' du vecteur booléen v. Si
v est une matrice, ses colonnes sont préalablement
concaténées. Si A est une matrice et B est
une matrice de booléens, la commande A(B) extrait de A
les coordonnées correspondant aux indices pour lesquels
B est à vrai. Cette propriété, fort utile en programmation, a
pour corollaire quelques comportements curieux : ones(B)
retournera une matrice de même taille que la matrice de booléens B.
 La fonction bool2s transforme des booléens
en 0 ou 1.
x=rand(2,10) b=x<0.5 bool2s(b) and(b) and(b,"c") and(b,"r") or(b) or(b,"r") b1=b(1,:); b2=b(2,:); b1 & b2 b1 | b2 b1 find(b1) y=[1:10] y(b1) A=[1,2,3;4,5,6;7,8,9] x=[%t,%f,%t] A(x,x) A(~x,x) B=rand(3,3)<0.5 A(B)Les complexes sont définis à l'aide de la constante
%i 
( ) ou bien en affectant
) ou bien en affectant sqrt(-1) à une nouvelle
variable. A noter que par défaut A' est la transposée
conjuguée de A. La transposée non conjuguée est 
A.'. Les fonctions classiques appliquées à un complexe
donnent toujours un résultat unique, même si mathématiquement
elles ne sont pas définies de façon unique (racine carrée, logarithme,
puissances).
A=[1,2;3,4]+%i*[0,1;2,3] real(A) imag(A) conj(A) A' A.' abs(A) phasemag(A) i=sqrt(-1) %i*i A*i %e^(%i*%pi) x=log(%i) exp(x) x=%i^(1/3) x^3
| Complexes | |
| real | partie réelle | 
| imag | partie imaginaire | 
| conj | conjugué | 
| abs | module | 
| phasemag | argument (en degrés) | 
Les polynômes et les fractions rationnelles constituent un type de données 
particulier. On peut construire un polynôme comme résultat d'opérations
sur d'autres polynômes. Il existe par défaut un polynôme élémentaire,
%s. On peut construire un polynôme d'une variable quelconque à 
l'aide de la fonction poly, en spécifiant soit ses racines (par 
défaut), soit ses coefficients. Les 
fractions rationnelles sont des quotients de polynômes.
Par défaut, Scilab effectue automatiquement les simplifications qu'il
reconnaît.
apropos poly help poly v=[1,2,3] p1=poly(v,"x") roots(p1) p2=poly(v,"x","c") coeff(p2) p1+p2 p3=1+2*%s-3*%s^2 p1+p3 // erreur : variables differentes p4=(%s-1)*(%s-2)*(%s-3) p3/p4
| Polynômes | |
| poly(v,"x") | polynôme dont les racines sont les éléments
de v | 
| poly(v,"x","c") | polynôme dont les coefficients sont les éléments
de v | 
| inv_coeff(v) | idem | 
| coeff(P) | coefficients du polynôme P | 
| roots(P) | racines du polynôme P | 
| factors | facteurs irréductibles réels d'un polynôme | 
| horner | évaluation d'un polynôme | 
Les chaînes de caractères, encadrées par des 
 côtes ("..." ou '...'), permettent de 
définir des expressions mathématiques, interprétables ensuite 
comme des commandes à exécuter ou des fonctions à définir.
Elles servent aussi d'intermédiaire pour des échanges de données
avec des fichiers. On peut transformer et formater des nombres
en chaînes de caractères (voir apropos string). 
expression=["x+y","x-y"]     // matrice de 2 chaines de caracteres
length(expression)           // longueurs des 2 chaines
size(expression)             // taille de la matrice 
part(expression,2)           // deuxieme caractere de chaque chaine
expression(1)+expression(2)  // concatenation des deux chaines
x=1; y=2;
evstr(expression)
x=1; instruction="y=(x+1)^2"
execstr(instruction)
y
deff("p=plus(x,y)","p=x+y")
plus(1,2)
plus(2,3)
| Chaînes de caractères | |
| evstr | évaluer une expression | 
| deff | définir une fonction | 
| execstr | exécuter une instruction | 
| length | longueur | 
| part | extraire | 
| + | concaténer | 
| string | transformer en chaîne | 
help. On peut retrouver
une fonction avec apropos, qui retourne les rubriques d'aide
dont le titre contient une chaîne de caractères donnée. 
De très nombreux exemples sont disponibles en démonstration,
on y accède par le menu  ->
->
 
 
Les fonctions numériques s'appliquent en général à chaque terme d'un vecteur ou d'une matrice. Il ne faut pas oublier que la multiplication, la puissance, la division doivent être précédées par un point pour s'appliquer terme à terme.
x=1:10 y=sin(x) y=x*sin(x) // erreur y=x.*sin(x) y=1./x.*sin(x) // erreur y=(1)./x.*sin(x) y=sin(x)./x A=[ 4, 4; 4, 4] sqrt(A) A.^(1/2) B=A^(1/2) // attention B*B
| Fonctions mathématiques | ||
| sqrt | exp | log | 
| sin | cos | tan | 
| asin | acos | atan | 
| round | floor | ceil | 
Les fonctions vectorielles s'appliquent à l'ensemble d'un vecteur 
ou d'une matrice, et retournent un scalaire. Pour appliquer une telle fonction 
colonne par colonne ou ligne par ligne, il faut rajouter
l'option "r" ou "c". Il n'est pas toujours évident de
décider laquelle des deux options choisir. 
Il faut se souvenir qu'avec l'option
"r", la fonction retournera un vecteur ligne (row), et donc
s'appliquera aux colonnes. Par exemple, sum(A,"r") retourne un 
vecteur ligne, qui est formé des
sommes des coefficients dans chaque colonne. 
| Fonctions vectorielles | |
| max | maximum | 
| min | minimum | 
| sort | tri par ordre décroissant | 
| gsort | tri, ordres particuliers | 
| sum | somme | 
| prod | produit | 
| cumsum | sommes cumulées | 
| cumprod | produits cumulés | 
| mean | moyenne | 
| median | médiane | 
| st_deviation | écart-type | 
| stdev | écart-type | 
A=[1,2,3;4,5,6] sum(A) sum(A,"r") sum(A,"c") cumsum(A,"r") cumsum(A,"c") cumsum(A) x=rand(1,5) mean(x) st_deviation(x) median(x) sort(x) gsort(x,"c","i")
L'utilisation de Scilab consiste en général à étendre le langage par 
de nouvelles fonctions, définies par des séquences d'instructions.
Nous avons vu l'utilisation de deff, nous verrons plus loin la
syntaxe des fichiers de fonctions. Comme alternative à deff,
signalons la possibilité de définir une fonction sur plusieurs
lignes dans la fenêtre Scilab. La première ligne est
nécessairement du type function y=f(x), la dernière est
endfunction. Il n'est pas recommandé d'utiliser cette
possibilité si la fonction à écrire est un tant soit peu
compliquée. Écrire un fichier de fonction externe, comme nous le
verrons plus loin, permet une programmation beaucoup plus claire et un
débuggage plus efficace.
Il est important de choisir des noms différents pour les nouvelles fonctions, sans quoi les définitions se superposeront, y compris à celles des fonctions prédéfinies.
deff("y=sin(x)","y=2*x")      // message d'avertissement
sin(2)
clear
sin(2)
Les nouvelles fonctions sont
traitées comme des variables, à la différence des fonctions
prédéfinies (primitives) : une fonction définie par 
deff peut être utilisée comme argument dans fplot2d
fonction mais une primitive ne peut pas.
deff("z=pente_secante(f,x,y)","z=(f(y)-f(x))/(y-x)")
x=%pi; y=%pi+0.01;
pente_secante(cos,x,y)        // correct
deff("y=f(x)","y=cos(x)")  
pente_secante(f,x,y)
z=[0:0.01:%pi];
fplot2d(z,cos)                // erreur
fplot2d(z,f)
Quand on définit une nouvelle fonction numérique, on a toujours intérêt
à faire en sorte qu'elle puisse s'appliquer correctement à une
matrice, ce qui impose de veiller aux multiplications terme à terme.
On peut aussi utiliser feval, qui distribue
l'évaluation d'une fonction sur l'ensemble des éléments d'un vecteur.
deff("y=f(x)","y=x*sin(x)")
f(1)
f([1:5])                      // erreur
help feval
feval([1:5],f)
deff("y=g(x)","y=x.*sin(x)") 
g(1)
g([1:5])
Certaines fonctions peuvent retourner plus d'un argument. Par exemple
les fonctions de tri sort et gsort retournent par
défaut le vecteur trié, mais peuvent aussi donner la permutation
des coordonnées qui a été effectuée. Les fonctions max et min
donnent aussi la position des maxima et minima dans une matrice.
v=rand(1,5) max(v) [m,i]=max(v) sort(v) [vtrie,perm]=sort(v)