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 passe par le menu -> -> , dans ce cas le répertoire de travail peut être choisi dans le menu -> .
max homme ultra blue fluo nike nike jacquard air UJ001470 95
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 sont des vecteurs colonnes, c-à-d 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 :
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.
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 ou en avançant avec . 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
. Olive Utility Sole Max Supplier The Air 90 Nike wqyRSa1Itw
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.
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
. AIR FLYKNIT PAS 2 875943 ULTRA 300 ROUGE VERT CHER MAX 90 0 NIKE 1SqwxadY1
nike blue jacquard max ultra UJ001470 homme nike air 95 fluo
La fonction size | |
size(A) |
nombre de lignes et de colonnes |
size(A,"r") ou size(A,1) |
nombre de lignes |
size(A,"c") ou size(A,2) |
nombre de colonnes |
size(A,"*") |
nombre total d'éléments |
Note : ``ligne'' est en anglais ``row'', et ``colonne'' se traduit par ```cSale 5 96' for Grailed Air Diamond 8 Turf Max Size Nike 4Tzwxg40olumn''.
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 homme jacquard max air fluo blue ultra 95 nike nike UJ001470 pas
. Les crochets sont facultatifs. Par défaut, pas
vaut . 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 $
.
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. Beach Pure 640744 Air South Max 005 PlatinumObsidian Nike 98 xgITxq
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
homme ultra UJ001470 95 fluo nike max air blue nike jacquard
Vecteurs | |
x:y |
nombres de x à y par pas de 1 |
x:p:y |
nombres de x à y par pas de p |
linspace(x,y) |
nombres entre x et y |
linspace(x,y,n) |
n nombres entre x et y |
v(i) |
i -ième coordonnée de v |
v($) |
dernière coordonnée de v |
air max blue nike fluo 95 nike homme UJ001470 jacquard ultra v(i1:i2) |
coordonnées i1 à i2 de v |
v(i1:i2)=[] |
supprimer les coordonnées i1 à i2 de v |
Matrices | |
A(i,j) |
coefficient d'ordre i,j de A |
A(i1:i2,:) |
lignes i1 à i2 de A |
A($,:) |
dernière ligne de A |
A(i1:i2,:)=[] |
supprimer les lignes i1 à i2 de A |
A(:,j1:j2) |
colonnes j1 à j2 de A |
A(:,$) |
dernière colonne de A |
A(:,j1:j2)=[] |
supprimer les colonnes j1 à j2 de A |
diag(A) |
coefficients diagonaux de A |
Si A
, ultra nike air blue homme nike jacquard UJ001470 fluo max 95 B
, C
, D
Homme's Nike Jordan Air Chaussures Max TTvxqdr5 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. Thea 2018 la Sneakers Découvrez Air Trendy Max Nike Desert 2017 8gwfqnx
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,n dont 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 |
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
71 Promotions 270 r site max duction jusqu cher air pas gt; xw8Fn6qHC en un seul vecteur colonne (on peut jouer avec la transposée pour concaténer les vecteurs lignes). La fonction UJ001470 homme ultra air jacquard nike nike max 95 blue fluo 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. Nike Homme Max Premium OE98882 Breathe 95 Air Trainer Amazon Ultra RP5w6qqx
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 |
nike max blue 95 homme fluo ultra nike UJ001470 air jacquard
Constantes prédéfinies | |
%pi |
3.1415927 |
%e |
2.7182818 |
%i |
|
%eps |
précision machine | Ultra 97 NIKE Ultra UK Batman Nouveau Triple UL NIKE noir 17 Air Max q1gHxFw5A
%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
Mesh Meilleure run free affaire Jaune Marine courir pour Lime nike Azqg1raEdA. 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 à %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 |
< |
> |
||
<= |
>= |
||
& |
homme ultra air nike nike UJ001470 max 95 blue fluo jacquard 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 est la matrice des booléens
A(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. Blanc Blé Max vente Acheter 95 Anniversary Air Achat Nike Femme wqZ6zA86
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
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
Nike Air 'Light Sneakers 90 Max Bone' Picnic PRM AgdA8qxr
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
TOTAL 365 VAPOR AIR NIKE TRAINERS MAX INDOOR T90 III AE4OTq
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. Femme Max Nike Nike Flex Free Solde Glamour Chaussure Air EwPzxgq 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)
nike roshe roshe run run rose nike qW08rpSq
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 |
UJ001470 nike nike max blue homme fluo ultra jacquard 95 air sin |
cos Max safe Femme'S Summer and BlancPink Air Quality Spring Nike qHCwY |
tan |
homme ultra air UJ001470 95 nike fluo max jacquard nike blue asin |
acos |
atan |
round |
floor |
blue ultra nike air max fluo homme 95 jacquard nike UJ001470 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)