Académique Documents
Professionnel Documents
Culture Documents
Version provisoire - V4
Liesse
Gérard Blanchet, Maurice Charbit
8 mai 2014
2 kernSCILAB.aux
Table des matières
Avant-propos 7
1 Introduction au langage 11
1.1 Variables et constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.1.1 Vecteurs et matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.1.2 Les chaînes de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.1.3 Matrices prédéfinies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.1.4 Constantes et initialisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.1.5 Tableaux multidimensionnels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.1.6 Cellules et structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.2 Opérations et fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.2.1 Opérations matricielles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.2.2 Opérations pointées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.2.3 Fonctions mathématiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.2.4 Fonctions de matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.2.5 Autres fonctions utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.3 Structures de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.3.1 Opérateurs logiques et variables booléennes . . . . . . . . . . . . . . . . . . . . . . 26
1.3.2 Les boucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.3.3 Boucles implicites, min, max, find, etc. . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.4 Les affichages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1.4.1 Affichage 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1.4.2 Affichage 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.4.3 Remarque sur les tracés de courbes . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
1.4.4 Les animations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
1.5 Conversion de nombres en chaînes de caractères . . . . . . . . . . . . . . . . . . . . . . . . 36
1.6 Entrées/sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
1.6.1 Entrées à partir du clavier ou de la souris . . . . . . . . . . . . . . . . . . . . . . . 38
1.6.2 Entrées/sorties dans des fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
1.6.3 Entrées/sorties spécialisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
1.7 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3
4 kernSCILAB.aux
4 Construction d’interfaces 59
4.1 Les éléments de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2 Pour aller plus loin... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.2.1 Traitement de l’état des figures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.2.2 Utilisation des callback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.2.3 Utilisation des uimenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5 Simulation 67
5.1 Eléments de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.2 Les super-blocs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.3 Passage des paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.3.1 Variables implicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.3.2 Appel de Xcos à partir de scripts Scilab . . . . . . . . . . . . . . . . . . . . . . . . 71
5.4 Les blocs définis par l’utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.4.1 Définition du bloc hors traitement . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.4.2 Définition du traitement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
6 Variables aléatoires 73
6.1 Lois usuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
6.1.1 Loi uniforme sur (a, b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
6.1.2 Variable aléatoire gaussienne réelle . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
6.1.3 Variable aléatoire gaussienne complexe . . . . . . . . . . . . . . . . . . . . . . . . . 76
6.1.4 Vecteurs aléatoires gaussiens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
6.2 Estimation de la densité de probabilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
6.3 Génération de variables aléatoires dans Scilab . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.3.1 Générateurs de Scilab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.3.2 Chaîne de Markov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
6.3.3 Génération de variables aléatoires de loi quelconque . . . . . . . . . . . . . . . . . 83
6.4 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Annexes 137
A.1 Rappels élémentaires sur les variables aléatoires . . . . . . . . . . . . . . . . . . . . . . . . 137
A.1.1 Définitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
A.1.2 Moments et fonction caractéristique . . . . . . . . . . . . . . . . . . . . . . . . . . 140
A.2 Quelques indications sur les exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
A.2.1 Exercices dans le corps du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
A.2.2 Exercices divers avec indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
A.3 Exemples divers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
A.3.1 Diagrammes de gain et réponses impulsionnelles . . . . . . . . . . . . . . . . . . . 167
A.3.2 Loi binomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
A.3.3 Diagramme électrique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Bibliographie 173
Index 175
6 kernSCILAB.aux
Avant-propos
Ce document a pour but d’apporter quelques éléments sur l’utilisation du langage Scilab (1) . Il com-
porte aussi des informations et exemples sur la construction d’interfaces graphiques et sur l’utilisation du
langage C pour écrire ses propres fonctions au cas où Scilab n’offrirait pas des performances suffisantes.
La documentation de Scilab est très riche et offre de nombreux documents [2, 3, 4, 5, 6] qui exposent la
façon de s’y prendre pour mettre en œuvre ces compléments.
Ce document inclue les éléments suivants :
1. un chapitre d’introduction au langage ;
6. un chapitre donne quelques éléments sur l’utilisation de Scilab dans le cadre des probabilités ;
7. un chapitre est consacré à l’automatique linéaire temps continu sous forme d’un cours avec exemple ;
9. un chapitre est consacré à la construction de fonctions permettant à tout utilisateur d’enrichir Scilab
avec des fonctions écrites en C. Il introduit les concepts utilisés pour la construction de fonctions
accessibles sous forme de librairies dynamiques ;
10. un chapitre d’exercices est ensuite proposé ;
11. les annexes donnent quelques éléments sur les variables aléatoires, des indications sur les exercices
et quelques exemples qui complètent les exercices et exemples déjà donnés dans le corps du texte.
− et MATLAB⃝
R
7.12.0.635 (R2011a) 64-bit (maci64),
sur Macintosh MacBook Pro 13 pouces, processeur Intel i7, 2,7 GHz, Mac OS X 10.6.8.
1. http://wiki.scilab.org/Tutorials ;
2. http://www.scilab.org/resources/documentation ;
3. www-fourier.ujf-grenoble.fr/ decauwer/polyscilab.pdf.
(1). www.scilab.org
7
8 kernSCILAB.aux
Notations and Abbreviations
∅ ensemble vide
∑ ∑ ∑
k,n = k n
{
1 when |t| < T /2
rectT (t) =
0 otherwise
sin(πx)
sinc(x) =
{ πx
1 when x ∈ A
1(x ∈ A) = (indicatrice de A)
0 otherwise
(a, b]= {x : a < x ≤ b}
{
distribution de Dirac lorsque t ∈ R
δ(t)
symbole de Kronecker lorsque t ∈ Z
Re(z) partie réelle de z
Im(z) partie imaginaire de z
√
i or j = −1
x(t)
X(f ) transformée de Fourier
(x ⋆ y)(t) convolution à temps continu
∫
= x(u)y(t − u)du
R
(x ⋆ y)(t) convolution à temps discret
∑
= x(u)y(t − u)
u∈Z
x or x vecteur x
IN matrice identité (N × N )
A∗ complexe conjgué de A
AT transposé de A
AH transposé-conjugué de A
A−1 matrice inverse de A
9
10 Initiation à Scilab
AR Autoregressif
ARMA AR et MA
CAN Convertisseur Analogique-Numérique
CNA Convertisseur Numérique-Analogique
d.p./dp densité de probabilité
d.s.p./dsp densité spectrale de puissance
dse densité spectrale d’énergie
EDLCC équations différentielle linéaires à coefficients constants
FFT Fast Fourier Transform
FT Fonction de Transfert
i.i.d./iid indépendantes et identiquement distribuées
MA Moyenne Ajustée
MAC Multiplication ACcumulation
p.a./pa processus aléatoire
RIF Réponse Impulsionnelle Finie
RII Réponse Impulsionnelle Infinie
RSB Rapport Signal à Bruit
SLI Système Linéaire Invariant
SSL Stationnaire au Second ordre au sens Large
TCD Transformée en Cosinus Discrète
TF Transformée de Fourier à temps continu
TFCT Transformée de Fourier à Court Terme
TFD Transformée de Fourier Discrète
TFDI Transformée de Fourier Discrète Inverse
TFTD Transformée de Fourier à Temps Discret
TZ Transformée en z
TZC Transformée en z causale
v.a./va variable aléatoire
ZOH Zero-Order Hold
Chapitre 1
Introduction au langage
Ce chapitre est inspiré du premier chapitre de Signal and Image Processing using Matlab⃝
R
, G. Blanchet,
M. Charbit, ISTE 2006 (http://www.iste.co.uk/index.php?f=a&ACTION =View&id=61).
− au programme lancé dans un environnement tel que X11, Windows, Mac OS, etc.,
Scilab est un interpréteur. Une fois lancé, il affiche une fenêtre de commande (figure 1.1 ) dans laquelle
on peut taper des commandes qui sont alors interprétées.
11
12 Chapitre 1 - Introduction au langage
Si les commandes sont syntaxiquement correctes, Scilab les exécute, cette exécution donnant, elle
aussi, lieu à des vérifications.
− « comme avec une calculette » en tapant les commandes dans la fenêtre idoine. Par exemple, taper
a=2*log10(5) puis <return> dans la fenêtre de commande. Le résultat obtenu est donné figure
1.2 . clc() efface la fenêtre de commande et tohome renvoie le curseur « en haut, à gauche ».
Les commandes exécutés peuvent être rappelées en tapant sur la flèche ↑ pour faire défiler toutes
les commandes précédemment tapées, ou une suite de lettres suivie par ↑. Toutes les commandes
commençant par ces lettres défilent alors ;
− ou « par exécution de programmes ». Un programme regroupe des commandes dans un fichier texte
appelé programme ou script. L’utilisateur lui donne un nom, avec l’extension sce. La documentation
Scilab explique comment utiliser l’éditeur « intégré » SciNotes ou un éditeur externe pour créer de
tels programmes. Ceci ne pose aucun problème particulier. Si un programme a pour nom prog1.sce
(voir exemple 1.1), l’utilisateur tape exec(’prog1.sce’) dans la fenêtre de commande pour en
lancer l’exécution. Scilab recherche le fichier dans le répertoire courant. La commande mtlb_type
prog1.sce permet de visualiser le contenu du fichier.
Le développement d’un projet nécessite la création de plusieurs programmes et fonctions. Cela
implique en principe la création d’un répertoire dans lequel tous ces éléments, et les fichiers de
données associés, seront rangés. On dira qu’il s’agit du répertoire de travail. Lors de chaque nouvelle
session on doit donc indiquer ce dernier à Scilab. On peut le faire en cliquant dans la colonne gauche
de la fenêtre de commande (figure 1.1 ). Une fois ceci fait, on peut taper pwd pour vérifier (figure
1.3 ).
Si des fonctions du répertoire courant doivent être utilisées, on doit pré-charger ces dernières en
tapant getd() dans la fenêtre de commande ou en insérant cette commande dans chaque programme
qui fait appel à celles-ci.
Pour éviter de refaire le choix du répertoire de travail chaque fois que l’on utilise Scilab, on peut,
entre autres méthodes (taper help startup pour avoir un panorama plus complet), créer un fichier
scilab.ini que l’on range dans un répertoire décrit dans la documentation. Ici, ce fichier contient :
et est rangé dans le répertoire SCIHOME (figure 1.4 ) comme la documentation l’indique.
Exemple 1.1 (Utilisation de l’éditeur intégré) L’éditeur intégré destiné à « saisir » les pro-
grammes peut être appelé en cliquant sur l’icône (figure 1.5 ) ou en tapant scinotes dans la
fenêtre de commande.
Figure 1.5 – Appel à l’éditeur intégré, en cliquant sur l’icône adéquat, et saisie
du programme
Une fois le programme tapé et sauvegardé sous le nom prog1.sce, les commandes mtlb_type et
exec donnent :
-->mtlb_type prog1.sce
!a = [1;2;3], b = a, !
14 Chapitre 1 - Introduction au langage
! !
!c = [1;-1] !
-->exec(’prog1.sce’,0)
a =
1.
2.
3.
b =
1.
2.
3.
c =
1.
- 1.
Scilab n’est pas compatible avec Matlab. Le menu Applications comporte une option de conversion
de programmes Matlab vers Scilab. La fonction mtlb_type que l’on vient de voir fait partie des fonctions
– ici la fonction type de Matlab – émulées par Scilab.
Exemple 1.2 (Définition d’une matrice) Taper a=[1 2 3;4 5 6] dans la fenêtre de commande. La
réponse est donnée figure 1.6 .
définition de la matrice a
résultat
(2 lignes, 3 colonnes)
Chaque élément peut être désigné par ses indices. Ainsi, taper a(1,1) donne 1 et a(2,1) donne 4.
L’affectation a=[1 2;3 4 5] conduit à un message d’erreur car le nombre de colonnes est différent sur
les deux lignes.
Quand les composantes d’un vecteur forment une suite de valeurs séparées par des intervalles réguliers,
il est préférable d’utiliser une « boucle implicite » telle que (indD:step:indF). Cette expression fournit
Telecom-ParisTech – GB 15
une suite partant de indD et allant jusqu’à indF par incréments de step. Les valeurs ne peuvent aller
au-delà de indF. La valeur de l’incrément step peut être omise si elle vaut 1.
Exemple 1.4 (Enumération implicite avec incrément) Taper a=(0:4:10). Scilab donne :
-->a=(0:4:10)
a =
0. 4. 8.
Le dernier élément d’un vecteur est indicé par « $ ». Dans l’exemple précédent, a($) donne la valeur
8.
Il est possible d’étendre la taille d’une matrice. L’interpréteur alloue dynamiquement de l’espace
mémoire lors de l’extension.
La ligne de commande a=[1 2 3; 4 5 6]; a=[a;a] contient deux instructions. La première, a=[1 2
3; 4 5 6];, est terminée par le « séparateur d’instruction » point-virgule. Cela inhibe l’impression d’un
résultat à l’écran. Si l’on avait mis une virgule comme séparateur, on aurait eu :
-->a=[1 2 3; 4 5 6], a=[a;a]
a =
1. 2. 3.
4. 5. 6.
a =
1. 2. 3.
4. 5. 6.
1. 2. 3.
4. 5. 6.
Scilab retourne :
16 Chapitre 1 - Introduction au langage
A =
1. 2. 3. 4.
5. 6. 7. 8.
ans =
2.
On peut aussi extraire les éléments d’un tableau à l’aide d’indices regroupés dans un vecteur. Exemple :
-->myind=[1,2,7]; A(myind)
ans =
1.
5.
4.
Lorsque A est une matrice (n × m), l’instruction B = zeros(A) retourne une matrice de zéros de
même dimension (n × m) que A. Cela peut être très pratique lorsque l’on est amené à modifier la taille
de matrices pendant une phase de mise au point.
Remarques :
− lorsqu’on définit des variables et autres objets, le langage est sensible aux majuscules et minuscules ;
− le format d’affichage peut être modifié en utilisant la commande format. Ainsi format(’e’) donne
un format flottant standard et format(’v’) un format variable. format(’e’,15) donne un format
flottant avec 15 caractères ;
− Scilab est un interpréteur. Il réserve de l’espace mémoire chaque fois qu’une variable est utilisée
pour la première fois. Les variables utilisées pendant une session restent rangées en mémoire, d’où
l’utilité – rare toutefois – de « nettoyer » cet espace mémoire de temps en temps. La fonction clear
(taper help clear) peut être utilisée dans ce but ;
− il est toujors plus efficace de « prédimensionner » une matrice – par exemple avec M=zeros(m,n) –
que de laisser Scilab la remplir dynamiquement au cours de son utilisation dans un programme.
Changement de taille
La fonction matrix est utilisée pour modifier la taille d’une matrice, par exemple pour passer d’une
matrice (2 × 6) à une matrice (3 × 4). Ce changement de taille peut être effectué directement :
-->a=[(1:6);(7:12)]
a =
1. 2. 3. 4. 5. 6.
7. 8. 9. 10. 11. 12.
-->c=zeros(3,4); c(:)=a
c =
1. 8. 4. 11.
7. 3. 10. 6.
2. 9. 5. 12.
-->matrix(a,3,4)
ans =
1. 8. 4. 11.
7. 3. 10. 6.
2. 9. 5. 12.
La commande zeros(3,4) initialise le choix de taille pour la matrice c. c(:)=a remplit c, colonne par
colonne, avec la suite des 12 valeurs prises dans a colonne par colonne. a et c doivent avoir exactement
le même nombre d’éléments.
Telecom-ParisTech – GB 17
-->x=[ones(1,5);-ones(1,5)];
-->y=zeros(1,10); y(:)=x
y =
1. - 1. 1. - 1. 1. - 1. 1. - 1. 1. - 1.
-->N=[’paul’;"pierre"]
N =
!paul !
! !
!pierre !
-->size(N), length(N)
ans =
2. 1.
ans =
4.
6.
L’instruction size(N) retourne une taille de (2 × 1) (2 lignes de « une chaîne de caractères »). Taper
N(1,2) dans Scilab provoque une erreur. length(N) donne la longueur de chacune des entrées de N.
Si l’on veut récupérer les lettres d’une chaîne de caractères, on peut utiliser les fonctions strsplit ou
part. On notera l’utilisation du + à la place de la concaténation (strcat([’paul’,’ ’,’pierre’])) :
-->chc=’paul’+’ ’+’pierre’;
-->tabl=strsplit(chc,(1:length(chc)-1)) // ou tabl=strsplit(chc)
tabl =
!p !
! !
!a !
! !
!u !
! !
!l !
! !
! !
! !
!p !
! !
!i !
! !
!e !
! !
!r !
! !
!r !
! !
!e !
-->tabl(1)+tabl(2)
ans =
pa
Le paragraphe 1.5 donne quelques façons de passer des nombres à leur représentation textuelle.
− ones(L,C) donne une matrice de L lignes et C colonnes ne contenant que des « 1 ». ones(1,N)
donne un vecteur ligne constitué de N « 1 » ;
− eye(N,N) donne une matrice identité (N ×N ) (des « 1 » sur la diagonale, des « 0 » partout ailleurs) ;
− eye(L,C) donne une matrice (L × C) constituée d’une matrice identité I N , où N est égal à
min(L, C), complétée par une matrice de « 0 ». Ainsi, eye(1,N) donne un vecteur ligne avec un
« 1 » suivi de N − 1 « 0 » ;
− outre les fonctions telles que hank ou toeplitz, Scilab dispose de la fonction testmatrix pour
engendrer quelques matrices particulières.
-->format(’e’,15); // 15 symboles
-->%eps
%eps =
2.22044605D-16
Il est conseillé de vérifier la valeur effective de %eps avant de l’utiliser. Il semble qu’il y ait quelque
divergence entre documentation et valeur effective.
Les constantes %nan (not-a-number) et %inf (infini) peuvent être utilisées pour définir des matrices
et faire des traitements.
-->a+1
ans =
1. Inf Nan 3.
-->a ./ (a+1)
ans =
Des opérations telles que 0/0 ou log(0) ne donnent pas %nan ou -%inf respectivement, mais un message
d’erreur.
Un certain nombre de fonctions permettent d’effectuer des traitements en éliminant les résultats qui
pourraient être égaux à %nan (nansum, thrownan, etc.).
-->num=1+%s; den=%s^2+%s+1;
-->frac=num/den
frac =
1 + s
---------
2
1 + s + s
-->typeof(frac)
ans =
rational
Des variables sont réservées pour recevoir des informations telles que des chemins d’accès (taper SCI,
SCIHOME ou PWD).
0. 0.
0. 0.
(:,:,2)
0. 0.
0. 0.
B =
20 Chapitre 1 - Introduction au langage
(:,:,1)
1. 3.
2. 4.
(:,:,2)
5. 7.
6. 8.
-->hypermat([2,2,2],[1:8]) // idem avec hypermat(dimensions,remplissage)
ans =
(:,:,1.0D+00)
1.0D+00 3.0D+00
2.0D+00 4.0D+00
(:,:,2.0D+00)
5.0D+00 7.0D+00
6.0D+00 8.0D+00
Les fonctions repmat (construction par pavage) et cat (construction par concaténation) permettent
de construire des tableaux à partir d’autres tableaux.
Tableaux de cellules
Dans un tableau de cellules, les éléments peuvent être de toute nature, nombres, chaînes, tableaux,
etc. Taper :
-->langcell=cell(3,1); // definition
-->langcell(1).entries=’SCILAB’;
-->langcell(3).entries=2013;
-->langcell(2)
ans =
{2x2 constant}
-->langcell(2).entries
ans =
6. 5.
2. 3.
-->langcell(2).entries(1,2)
ans =
5.
langcell est constitué de trois éléments : le premier est une chaîne de caractères, le second est
un tableau (2 × 2), et le troisième un scalaire. Les premières instructions peuvent être remplacées par
makecell([3,1],’SCILAB’,[6 5;2 3],2013) pour initialiser le tableau de cellules.
Ces objets peuvent être manipulés à l’aide d’un certain nombre de fonctions : makecell, iscell,
cell2mat, etc.
Telecom-ParisTech – GB 21
"SCILABxy"
ans =
1. 1.
ans =
3.
Dans la fonction makecell le paramètre [3,1] donne la dimension de la cellule comme dans
cell(3,1). b=cell2mat(a) convertit la cellule a en une chaîne de caractères.
Structures
Une structure est définie par la fonction struct. L’exemple qui suit définit une structure, appelée
langstruc, formée de trois champs : Language, Version et Year. L’instruction assigne la chaîne SCILAB
au premier champ, la chaîne 6.5 au second, et la valeur numérique 2013 au troisième :
-->langstruc=struct(’Language’,’SCILAB’,’Version’,’6.5’,’Year’,2013)
langstruc =
Language: "SCILAB"
Version: "6.5"
Year: 2013
-->langstruc.Year
ans =
2013
-->a=[1 2; 3 4] * [5;6]
a =
17.
39.
-->size(a)
ans =
2. 1.
-->A\b, inv(A)*b
ans =
- 1.
1.
ans =
- 1.
1.
c =
14.
-->d=b’*a
d =
0. 0. 0. 0.
0. 1. 2. 3.
0. 2. 4. 6.
0. 3. 6. 9.
Les vecteurs a et b sont des vecteurs lignes réels (4 × 1). Le scalaire c est égal au produit scalaire des
vecteurs a et b.
Exemple 1.16 (Opérations pointées) Taper les commandes suivantes et vérifier les résultats obte-
nus :
-->clear // libere l’espace données
-->c = a.* b;
-->d=a ./ b;
-->e = a .^(.5);
-->a,b,c,d,e
− a et b sont deux matrices (3 × 4). Elles sont obtenues par multiplication d’un vecteur colonne (3 × 1)
et d’un vecteur ligne (1 × 4) ;
− c est une matrice qui a ci,j = ai,j × bi,j comme élément générique ;
-->plot(tims’, real(sig))
tims est un vecteur (1 × 1024) et tims’*fq est une matrice (1024 × 3). On peut vérifier ces dimensions
en utilisant whos :
24 Chapitre 1 - Introduction au langage
-->whos -name fq
Nom Type Dimensions Octets
fq constant 1 par 3 40
index R V B
1 0 0 1
2 0 0,5 0
3 1 0 0
4 0 0,75 0,75
5 0,75 0 0,75
6 0,75 0,75 0
7 0,25 0,25 0,25
Fonctions « Built-in »
Un grand nombre de fonctions peuvent être appelées dans Scilab. Certaines sont fournies par l’envi-
ronnement de Scilab, tandis que d’autres peuvent être développées par des tierces parties.
Parmi toutes ces fonctions, le contenu de certaines d’entre elles peut être visualisé directement, tandis
que d’autres sont écrites en langage machine pour des raisons de vitesse d’exécution.
Exemple 1.19 (Source de fonctions et fonctions compilées) Taper : mtlb_type companion. Sci-
lab affiche le texte de la fonction companion. Toutefois, la commande mtlb_type fft donne :
-->mtlb_type fft
A Ak
eA = I + + ··· + + ···
1! k!
et est obtenue par l’instruction expm(A).
Telecom-ParisTech – GB 25
- 0.3722813 0
0 5.3722813
al =
- 0.8245648 - 0.4159736
0.5657675 - 0.9093767
-->al*be*inv(al)
ans =
1. 2.
3. 4.
− la fonction poly construit un objet « polynôme » associé à une matrice (polynôme caractéristique),
ou un polynôme dont les racines ou les coefficients sont données par le vecteur argument (voir aussi
l’exemple 1.9).
2
2 - 3x + x
-->mp=poly([1 2],"x","coeff") // option "coeff"
mp =
1 + 2x
-->mp=poly([1 2;3 4],"x") // poly. caracteristique
mp =
2
- 2 - 5x + x
-->typeof(mp)
ans =
polynomial
-->coeff(mp)
ans =
- 2. - 5. 1.
- 0.3722813
5.3722813
mp =
2
- 2 - 5x + x
-->[roots(mp),roots(mtlb_fliplr(coeff(mp)))]
ans =
5.3722813 5.3722813
- 0.3722813 - 0.3722813
2
2 + 3s + s
pN =
4 + 2s
Les quantités booléennes peuvent être utilisées dans les structures de programmation telles que :
« if ... elseif ... else ... end », « select ... case ... else ... end », « while ... end »
et dans la fonction find.
Exemple 1.25 (Utilisation de while) Ecrire et sauver le programme calcule.sce donné ci-après.
//===== calcule.sce
n=1; xe=1; f=1; merr=1;
while merr>%eps
f=f*n; merr=1/f;
xe1=xe+merr;
n=n+1; xe=xe1;
end
Ce programme calcule une valeur approchée de e à l’aide de son développement en série 1 + 1 + 1/2! +
1/3! + · · · . Le test d’arrêt porte sur la différence de deux valeurs successives soit 1/n!. Tant que cette
valeur est supérieure à %eps, le calcul continue.
L’exécution, et l’affichage du résultat xe, sont obtenus en tapant exec(’calcule.sce’,-1), xe. Le
paramètre « -1 » de l’instruction exec indique que l’on ne veut pas visualiser les instructions pendant
l’exécution.
Opérateurs logiques
Les opérateurs logiques AND (symbole &), OR (symbole |), et NOT (symbole ~) opèrent sur des
quantités booléennes. Les variables prédéfinies « faux » et « vrai » sont désignées par %f, ou %F, et %t, ou
%T, respectivement. Elles ont le type boolean – constante booléenne – (taper typeof(%t)).
C =
F T T T
F F T T
F F F T
F F F F
-->[l,c]=find(B)
c =
2. 3. 3. 4. 4. 4.
l =
1. 1. 2. 1. 2. 3.
boolean
-->C = A & B, C = A | B
C =
F F T F
C =
28 Chapitre 1 - Introduction au langage
F T T T
-->C = A .* B, typeof(C)
C =
0. 0. 1. 0.
ans =
constant
Remarques
La dernière instruction de l’exemple précédent effectue une multiplication « terme à terme ». Il y a
conversion (fonction bool2s) des booléens en constantes 0 (%f) ou 1 (%t). Le booléen %t correspond à la
valeur 1, %f correspond à la valeur 0.
Il y a toujours deux façons de traiter des expressions logiques. On peut utiliser les constantes %t ou
%f ou utiliser leur « valeur numérique 1 ou 0 respectivement (voir exercices 1.3 et 10.2).
Il faut aussi distinguer les opérations « numériques » ⊕ (addition opération modulo 2 ou « OU exclu-
sif ») qui est différente du OU (« OU inclusif ») et ⊗ qui se confond avec la multiplication normale.
isnan (Not-a-Number), isinf (infini), isascii, isalphanum, iscell, etc. sont des booléens utilisés
pour tester l’état ou le type de variables.
-->M
M =
2.4414063 1.2207031
1.2207031 0.6103516
Cette boucle calcule A5 .Comme pour tous les interpréteurs, l’utilisation de boucles détériore considé-
rablement les performances . Il est conseillé de les éviter autant que faire se peut.
0.452
-->tic, a=a.^2; toc
Telecom-ParisTech – GB 29
ans =
0.009
tic démarre le chronomètre (précision de l’ordre de la ms), toc l’arrête en donnant le temps écoulé,
en secondes, depuis son démarrage.
1. 2.
3. 4.
ans =
2.5
ans =
2. 3.
ans =
1.5
3.5
-->max(a), max(a,"c"), min(a,"m")
ans =
4.
ans =
2.
4.
ans =
1. 2.
Le paramètre "c" indique que l’on cherche selon les colonnes ("r" selon les lignes) et "m" suivant
la même règle que Matlab.
2. La fonction find délivre les indices pour lesquels la condition donnée est remplie.
rand(3,3) fournit un tableau (3 × 3) obtenu par un tirage « aléatoire » de nombres dans l’intervalle
[0, 1]. La première forme du find donne l’indice linéaire, tandis que la seconde fournit les couples
(ℓ(i), c(i)) d’indices des éléments qui remplissent la condition.
30 Chapitre 1 - Introduction au langage
Exemple 1.32 (Quelques autres fonctions) Ce qui suit construit tous les couples (m, n), m ̸=
n, obtenus à partir des quatre chiffres 1 à 4.
0. 1. 1. 1.
0. 0. 1. 1.
0. 0. 0. 1.
0. 0. 0. 0.
>-->[nl,nc]=find(B==1); [nl;nc]
ans =
1. 1. 2. 1. 2. 3.
2. 3. 3. 4. 4. 4.
-->set(gca(),"auto_clear","on")
− on peut définir des sous-fenêtres de tracés dans une fenêtre à l’aide de subplot.
-->x=(0:%pi/10:2*%pi);
-->subplot(212), plot(tps,cos(2*%pi*f0*tps),’-r’,tps,cos(2*%pi*f0*tps),’o’)
La fonction xsetech permet de définir plus finement (encore que l’on ne puisse que donner des
« pourcentages » des dimensions de fenêtre) les zones des tracés que subplot qui ne laisse pas le
choix des tailles.
Il existe d’autres fonctions pour le tracer : plot2d (voir exemple qui suit), plot2d2 (tracé en « marches
d’escalier »), plot2d3 (tracé avec des « bâtons »), plot2d4 (tracé avec des « flèches » à la place de
segments).
2s+4
Figure 1.7 – Tracé du diagramme de Bode de s2 +3s+2
32 Chapitre 1 - Introduction au langage
Le paramètre "ln" de plot2d indique que l’on prend ω en échelle logarithmique (l) et le gain de
décibels 20 log10 (gain) en linéaire (n). Ce tracé peut être fait par la fonction bode qui est une des fonctions
disponibles dans Scilab.
//===== cardioide.sce
clf()
theta=[0:0.02:2*%pi]’; rho=1+cos(theta)
polarplot(theta,rho)
a=gca(); a.isoview=’on’
90
120 60
150 30
210 330
240 300
270
qui est l’équation d’un cercle de centre O et rayon c dans des coordonnées orthonormales. Ceci conduit
à la procédure de calcul qui suit :
√
1. Calculer Y = c[cos θ sin θ]T pour θ = 0 à 2π par pas de 2π/N .
2. Faire le changement de variable X = X 0 + F −1 Y .
La fonction de calcul des points d’une ellipse définie par X0, E, et c comme paramètres peut être écrite
de la façon qui suit. Taper cette fonction et sauvez-la avec l’extension sci (Scilab propose ellipse.sci
comme nom de fichier au moment de la sauvegarde) :
function ellipse(X0, E, c)
N=100; theta = (0:N) * (2*%pi) ./ N;
Y = sqrt(c)*[cos(theta);sin(theta)]; // cercle
Telecom-ParisTech – GB 33
Fm1=inv(sqrtm(E)); X = diag(X0)*ones(2,N+1)+Fm1*Y;
plot(X(1,:),X(2,:)); set(gca(),"isoview","on");
endfunction
Avant d’appeler cette fonction il faut signaler à Scilab que l’on veut utiliser des fonctions présentes
dans un répertoire donné, ici le répertoire courant. C’est le rôle de la fonction getd. L’appel à ellipse
peut être ensuite être fait :
-->set(gca(),"grid",[1 1])
−2
−4
−6
−8
−4 −2 0 2 4
√
On peut vérifier que les axes ont pour longueur 1/ λk , où λk est une valeur propre, de direction
donnée par le vecteur propre associé. Les vecteurs propres (fonction spec) ont 1 pour norme :
-->[P,Delta]=spec(E); P’ * P
ans =
1. 0.
0. 1.
Le programme ellaxes.sce trace les deux axes de l’ellipse lorsque le booléen tra a la valeur « vrai »
(figure 1.10 ).
//===== ellaxes.sce
clf
tra=%t
X0=[0,0]; c=1; E=[1.3628 .7566;.7566 .5166];
ellipse(X0, E, c); set(gca(),’grid’,[1 1])
if tra then
[vecp,valp]=spec(E); ml=sqrt(diag(1./valp));
v1=X0’-ml(1)*vecp(:,1); v2=X0’+ml(1)*vecp(:,1);
w1=X0’-ml(2)*vecp(:,2); w2=X0’+ml(2)*vecp(:,2);
plot([v1(1) v2(1)],[v1(2) v2(2)],’-r’,[w1(1) w2(1)],[w1(2) w2(2)],’-r’)
end
34 Chapitre 1 - Introduction au langage
−1
−2
−3
−4
−2 −1 0 1 2
1.4.2 Affichage 3D
Fonctions z = f (x, y)
Lorsque l’on a une fonction du type z = f (x, y) la fonction meshgrid permet de définir toutes les
coordonnées d’un quadrillage. Les fonctions mesh ou surf effectuent le tracé.
0.8
0.6
0.2
2
1 0
2
0 1
Y
−1 0
X
−1
−2 −2
Figure 1.11 – Tracé d’une gaussienne : à gauche avec mesh, à droite avec surf
et la palette de couleurs standard
1
−1 0.5
0 z
−0.5
−0.5
0
x 1
0.8
0.5 0.6
0.4 y
0.2
1 0
plot(real(Pt),imag(Pt)), set(gca(),"auto_clear","on")
adb=get(gca(),"data_bounds")+.2*[-1,-1;1,1]; set(gca(),"data_bounds",adb)
1,5
0,5
−0,5
−1
−1,5
−2
−2,5
−0,2 0 0,2 0,4 0,6 0,8 1 1,2 1,4 1,6 1,8
phi=linspace(0,2*%pi,100);
clf, comet(sin(3*phi),cos(2*phi+%pi/6))
1. considérons la fonction xstringb. Cette dernière permet d’ajouter du texte dans un graphe aux
coordonnées (x, y) (figure 1.14 ). Taper et sauver le programme ellipsecom.sce :
puis exec(’ellipsecom.sce’,-1).
−2
−4
−6
−8
−4 −2 0 2 4
La chaîne de caractère est ici obtenue à partir d’une expression (entre les $). La commande
xstringb(x,y,str,w,h,"fill") signifie que le rectangle de tracé est positionné en (x, y) (point
bas-gauche du rectangle de tracé), qu’il a une largeur w et une hauteur h prise « vers le haut »
lorsque h > 0. "fill" indique que la chaîne de caractère remplit au mieux le rectangle ;
2. pour afficher une valeur numérique, il faut la convertir d’abord en chaîne de caractères. Ceci peut
être fait à l’aide de la fonction string.
-->x=(0:.3:1.5); typeof(x(1))
ans =
constant
-->y=string(x), typeof(y(1))
y =
3. la fonction msprintf peut aussi être utilisée pour obtenir des chaînes de caractères.
-->fq=[10.5 20.566];
F1 = +10.50, F2 = 2.06e+01
L’expression msprintf(...) fournit une chaîne de caractères selon le format spécifié par ’F1 =
%+15.2f, F2 = %4.2e’. Pour plus d’information, il faut se tourner vers la fonction printf du
langage C ;
4. title, legend permettent d’afficher des informations dans une fenêtre de tracer.
1.6 Entrées/sorties
1.6.1 Entrées à partir du clavier ou de la souris
Scilab permet d’effectuer des opérations d’entrées/sorties à partir du clavier, de l’écran ou avec des
fichiers :
1. input pour acquisition à partir du clavier ;
12.
ans =
constant
-->x=input("valeur:", "string"), typeof(x)
valeur:chaine
x =
chaine
ans =
string
2. xgetmouse pour récupérer les coordonnées lors d’un « click » dans la fenêtre graphique (voir exemple
1.48) ;
Les fonctions mprinf, msprintf, disp peuvent alors être utilisées pour afficher, ou simplement
convertir, des quantités numériques en chaînes de caractères.
0,8
0,6
0,4
0,2
−0,2
−0,4
−0,6
−0,8
−1
−50 0 50 100 150 200 250 300 350 400
-->x1=exp(2*%i*%pi*f1*tps); x2=exp(2*%i*%pi*f2*tps);
-->save(’vals.dat’,’x1’,’x2’);
-->clear x1 x2
-->load(’vals.dat’,’x1’,’x2’);
2. Les fonctions mopen, mget, mput, mclose , etc. sont utilisées pour les entrées-sorties dans des fichiers.
-->clear; x=[1:100];
-->fid=mopen(’try1.dat’,’wb’);
-->mput(x,"f",fid); % Writing
-->mclose(fid);
puis :
-->clear; fid=mopen(’try1.dat’,’rb’);
-->y=mget(20,"f",fid); % Reading
-->mclose(fid);
Le fichier de données try1.dat est créé avec un tableau x de 100 nombres flottants. La relecture
fournit un tableau y de 20 flottants.
3. D’autres fonctions facilitent le travail du programmeur, entre autres :
40 Chapitre 1 - Introduction au langage
4. Des fonctions permettent de récupérer des données dans un fichier Excel dont il faudra vérifier la
version pour pouvoir y accéder dans Scilab.
-->mtlb_type donnees.csv
!"rang";"racine" !
! !
!1;1,0000000 !
! !
!2;1,4142136 !
! !
!3;1,7320508 !
! !
!4;2,0000000 !
! !
!5;2,2360680 !
! !
!6;2,4494897 !
! !
!7;2,6457513 !
! !
!8;2,8284271 !
! !
!9;3,0000000 !
! !
!10;3,1622777 !
! !
!11;3,3166248 !
// ----- traitcsv.sce
clear
fid=mopen(’donnees.csv’,’rt’);
x=mgetl(fid);
mclose(fid)
lx=size(x,1);
for k=2:lx
lstr=length(x(k));
idx=strindex(x(k),’;’);
a(k-1,1)=eval(part(x(k),1:idx-1));
y=strsubst(part(x(k),idx+1:lstr),’,’,’.’);
a(k-1,2)=eval(y);
end
plot(a(:,1),a(:,2),’-’,a(:,1),a(:,2),’o’)
set(gca(),’grid’,[1 1])
-->xc=csvRead(’donnees.csv’,’;’,’,’);
-->a=xc(2:$,:)
a =
1. 1.
2. 1.4142136
3. 1.7320508
4. 2.
5. 2.236068
6. 2.4494897
7. 2.6457513
8. 2.8284271
9. 3.
10. 3.1622777
11. 3.3166248
!"rang";"racine"; !
! !
!1;1,0000000;"23/04/2014" !
! !
!2;1,4142136;"24/04/2014" !
! !
!3;1,7320508;"25/04/2014" !
! !
!4;2,0000000;"26/04/2014" !
! !
!5;2,2360680;"27/04/2014" !
! !
!6;2,4494897;"28/04/2014" !
! !
!7;2,6457513;"29/04/2014" !
! !
!8;2,8284271;"30/04/2014" !
! !
!9;3,0000000;"01/05/2014" !
! !
!10;3,1622777;"02/05/2014" !
! !
!11;3,3166248;"03/05/2014" !
-->xx=csvRead(’donnees2.csv’,’;’,’,’,’string’)
Attention : Le fichier ’donnees2.csv’ est déjà ouvert dans Scilab.
ans =
!"rang" "racine" !
! !
!1 1.0000000 "23/04/2014" !
! !
!2 1.4142136 "24/04/2014" !
! !
!3 1.7320508 "25/04/2014" !
! !
!4 2.0000000 "26/04/2014" !
! !
!5 2.2360680 "27/04/2014" !
! !
42 Chapitre 1 - Introduction au langage
!6 2.4494897 "28/04/2014" !
! !
!7 2.6457513 "29/04/2014" !
! !
!8 2.8284271 "30/04/2014" !
! !
!9 3.0000000 "01/05/2014" !
! !
!10 3.1622777 "02/05/2014" !
! !
!11 3.3166248 "03/05/2014" !
-->a=eval(xx(2:$,1:2));
-->y=part(xx(2:$,3),2:length(xx(2,3))-1);
Si on avait converti en type « double » la conversion de la dernière colonne aurait donné NaN.
Exemple 1.52 (Sortie du tracé courant au format « jpeg ») on suppose que l’on vient de
faire un plot et que l’on veut sauvegarder l’image de la fenêtre au format dans le fichier tstbez.jpg.
-->previous_driver = driver(’JPG’)
previous_driver =
Rec
-->xinit(’tstbez.jpg’);
-->xend();
-->driver(previous_driver)
ans =
JPG
previous_driver = driver(’JPG’) retourne le driver courant, ici Rec (« driver écran ») et posi-
tionne l’unité de sortie sur le driver « jpeg ». Ce dernier est initialisé avec xinit auquel on donne le
nom du fichier à traiter. La session graphique est terminé avec xend(). driver(previous_driver)
permet ensuite de revenir au « driver écran ».
-->wavread(’desgens’,’info’);
ans =
Telecom-ParisTech – GB 43
column 1 to 7
Le résultat de la dernière commande se lit (sous toute réserve...) : « format des données » = 1,
« nombre de canaux » = 1, « fréquence d’échantillonnage » = 8000 Hz, « longueur de l’enregistrement »
= 16000, « alignement » = 2 (2 octets), « nombre de bits par échantillon » = 16, « ? », « longueur de
l’enregistrement » = 16000 échantillons.
0,6
0,4
0,2
0
−0,2
−0,4
−0,6
Pour écouter :
-->y=loadwave("desgens.wav");
-->length(y)
ans =
1.6000000000D+04
-->playsnd(y,8000)
1.7 Exercices
Exercice 1.1 (Méthode de Jacobi (indications page 143)) Le méthode de Jacobi est une des nom-
breuses méthodes itératives de résolution de système linéaire Ax = b. Elle consiste à poser A = M − N pour
faire tourner la récurrence :
{
x0 donné
xn+1 = M −1 N xn + M −1 b
Cet algorithme converge, et donne la solution unique, si et seulement si les valeurs propres de M −1 N sont
de module < 1. Dans la méthode de Jacobi on choisit M = D et N = L + U où D est la matrice diagonale
définie par la diagonale de A, L (resp. U ) la matrice strictement triangulaire inférieure (resp. supérieure)
associée à A. On en déduit :
function [x,rho,k]=jacobimethod(A,b,x0,stcr0,maxit)
//=================================================!
// [x,rho,eltime]=JACOBIMETHOD(A,b,x0,stcr0,maxit) !
// Systeme Ax+b !
// x0 = initial state !
// stcr0 = critere d’arret |x(n+1)-x(n)|>stcr0 !
// maxit = max. iteration number !
// x = solution of Ax=b !
// rho = spectral radius !
// k = loop number !
//=================================================!
Exercice 1.2 (Méthode de Cholesky et factorisation (indications page 144)) Le problème posé
est celui de la factorisation de matrices hermitiennes définies positives sous la forme A = LLH où L est
une matrice triangulaire inférieure. Il existe plusieurs algorithmes tels que les algotithmes de Cholesky, de
« Cholesky-Banachiewicz », « Cholesky-Crout », etc. Ici nous allons nous intéresser à une réalisation récursive
symbolisée par :
∗
ℓ11 0 0 ... 0 ℓ11 ℓ21 . . . ℓn1
ℓ21 ℓ22 0 0 ℓn2
0 ℓ22
. .. . . .. ..
Ln × LH = .. . .. × .. . .
n
. . . . .
.. .. 0 .
. . . .
.
ℓn1 . . . . . . . . . ℓnn 0 . . . . . . 0 ℓnn
ℓ11 0T ℓ11 vH
= v
×
0
Ln−1 LH n−1
ℓ211 ℓ11 v H a11 AH
(2:n,1)
=
ℓ11 v
=
A(2:n,1)
vv H
+ Ln−1 LH
n−1 A(2:n,2:n)
On en déduit :
√
ℓ11 = a11
v = A(2:n,1) /ℓ11
Ln−1 LHn−1 = A(2:n,2:n) − vv
H
On notera que Scilab dispose de deux fonctions de factorisation : lu (factorisation LU) et qr (factorisation
QR).
Exercice 1.3 (Opérateurs logiques (indications page 144)) Scilab ne dispose pas d’opérateurs tels
que le produit matriciel lorsque les variables sont logiques. Dans ce cas – on parle de variables d’un corps fini
de Galois à deux éléments appelé GF(2) – les opérations + et × correspondent aux opérations logiques or
et and. Il est cependant toujours possible de faire toutes les opérations avec des variables réelles et récupérer
ensuite le résultat logique. A titre d’exercice, on va écrire un « produit scalaire » de deux façons :
1. on effectue tous les calculs avec les valeurs numériques 0 (correspondant à « faux ») et 1 (correspondant à
« vrai ») et on passe en booléen. Les deux vecteurs seront engendrés par ; v1=grand(N,1,"uin",0,1);
v2=grand(N,1,"uin",0,1); où N est la longueur du vecteur. Si la fonction × donne le bon résultat,
quelle opération doit-on utiliser pour le « OU » ?
Telecom-ParisTech – GB 45
2. on effectue tous les calculs avec les valeurs booléennes Les deux vecteurs seront engendrés par ;
v1=grand(N,1,"uin",0,1);, v1=v1==1; v2=grand(N,1,"uin",0,1);, v2=v2==1; où N est la lon-
gueur du vecteur ;
3. écrire une fonction de produit matriciel, C=boolmatrixmul(A,B), où A et B sont deux matrices boo-
léennes aux dimensions adéquates.
Exercice 1.4 (Coloriage (indications page 145)) On dispose d’une image (tableau) pixc définie, et
tracée, de la façon suivante :
nbr=12; nbc=8; pixc=ones(nbr,nbc); pixc(3:8,2:6)=0; pixc(9:12,6:7)=0;
[idl0,idc0]=find(pixc==0); [idl1,idc1]=find(pixc==1); pixc0=pixc;
//===== tracer
plot(idc0,idl0,’or’), plot(idc1,idl1,’x’), plot(cc,cr,’*r’)
adb=get(gca(),’data_bounds’)+[-1,-1;1,1];
set(gca(),’data_bounds’,adb), set(gca(),’grid’,[1 1])
set(gca(),’axes_reverse’,["off","on","off"])
Construire une fonction récursive qui colorie la zone « remplie » de zéros en remplaçant ces derniers par
une autre valeur.
46 Chapitre 1 - Introduction au langage
Chapitre 2
Exemple 2.1 (Fonction locale) Le programme ellipsetst trace une ellipse, le calcul de cette der-
nière étant fait par une fonction locale :
//===== ellipsetst.sce
clear
//===== definiton de la fonction
deff(’[X]=ellipse(X0, E, c)’,[’N=100; theta = (0:N) * (2*%pi) ./ N’;
’Y = sqrt(c)*[cos(theta);sin(theta)]’;
’Fm1=inv(sqrtm(E))’;
’X = diag(X0)*ones(2,N+1)+Fm1*Y’]);
//===== fin de definiton
//===== Programme
X0=[0,0]; c=1; E=[1.3628 .7566;.7566 .5166];
[X]=ellipse(X0, E, c);
plot(X(1,:),X(2,:)); set(gca(),"isoview","on")
return
47
48 Chapitre 2 - Ecriture des programmes et mise au point
argn(2) donne le nombre d’arguments en entrée. Si celui-ci est inférieur à 3, la valeur attribuée par
défaut à c est 1. Si elle est inférieure à 2, on attribue en plus la matrice unité (2 × 2) à E. ellipse2([1;1])
trace un cercle de rayon 1 centré en (1, 1).
argn(1) donne le nombre d’arguments en sortie.
La fonction teste aussi la dimension et la taille de X0 . Comme X0 peut être un vecteur ligne ou
colonne, on teste seulement sa longueur qui doit être égale à 2. Si ce n’est pas le cas on affiche un message
d’erreur et on sort « proprement de l’exécution » par la fonction error.
-->ellipse2([1;1;2])
!--error 10000
dimension erronée de X0
at line 4 of function ellipse2 called by :
ellipse2([1;1;2])
Nous voulons en faire une fonction membre d’une bibliothèque. Cette dernière appelée myloclib
contient les fonctions présentes dans un répertoire local nommé explelib. La commande genlib « com-
pile » les fonctions trouvées et leur donne l’extension .bin. Le format de ces fonctions est compatible
avec Windows, Mac OS et Linux.
-->cd ~/ECOLE/REDACTIONS/SCILAB/Latex/progs; PWD, pwd
PWD =
/Users/blanchet
ans =
/Users/blanchet/ECOLE/REDACTIONS/SCILAB/Latex/progs
-->mkdir(’explelib’)
ans =
1.
-->genlib(’myloclib’,’~/ECOLE/REDACTIONS/SCILAB/Latex/progs/explelib’,verbose=%t)
-- Création de [myloclib] (Macros) --
genlib : Traitement du fichier : mellipse.sci
genlib : Régénère les noms et les bibliothèques
Telecom-ParisTech – GB 49
-->myloclib
myloclib =
mellipse
-->whereis(’mellipse’)
ans =
!myloclib !
! !
!x !
-->X0=[0,0]; c=1; E=[1.3628 .7566;.7566 .5166];
-->[X]=mellipse(X0, E, c);
Lorsque les .bin ont été engendrés, il n’est plus nécessaire d’utiliser la fonction genlib. On se contente
de « charger » les fonctions de la bibliothèque à l’aide de la fonction lib.
mellipse
merr =
276.
-->clear a, merr=execstr("a=1+2, disp(a)",’errcatch’)
3.
merr =
0.
Le paramètre errcatch indique que la fonction retourne un code erreur pour l’analyse de l’expression.
Le paramètre "m" indique qu’un message d’erreur doit être retourné si nécessaire.
50 Chapitre 2 - Ecriture des programmes et mise au point
unix_s, unix_w, unix_g permettent de lancer des commandes DOS ou Unix sans sortie, ou en redi-
rigeant la sortie vers la fenêtre de commande ou une fenêtre particulière respectivement.
Exemple 2.4 (Utilisation des points d’arrêt) Pour tester l’utilisation des points d’arrêt, on utilise
le programme ellaxes.sce vu dans le chapitre 1. Taper ensuite :
-->setbpt(’ellipse’,[5]), dispbpt
Point d’arrêt de la fonction : ellipse
5
-->exec(’ellaxes.sce’,-1)
Arrêt après la ligne 5 dans la fonction ellipse.
-1->Fm1
Fm1 =
1.5019974 - 1.2923485
- 1.2923485 2.9473917
-1->resume
-->delbpt(’ellipse’)
L’instruction setbpt a pour paramètres le nom d’une fonction et une liste de numéros de ligne
([n,m,...]) sur lesquelles on désire mettre un point d’arrêt.
resume permet de reprendre l’exécution de la fonction interrompue tandis que abort interrompt cette
exécution en revenant à la fenêtre de commande.
Comme aucune indication de ligne n’est donnée, l’instruction delbpt supprime tous les points d’arrêt
de la fonction ellipse.
1. pause stoppe l’exécution en permettant d’afficher les variables locales. L’exécution reprend avec
resume ou est abandonnée avec abort,
3. where fait comme whereami en retournant le nom du script courant et le numéro de ligne.
Telecom-ParisTech – GB 51
//===== testtry.sce
try
fd=mopen(’fichierne.dat’,’r’);
x=mget(1,’d’,fd); // lecture double --> double
mclose(fd);
catch
mprintf(’Verifier la presence du fichier\nx vaut 0’)
x=0;
end
-->exec(’testtry.sce’,-1)
Verifier la presence du fichier
x vaut 0
-->add_profiling(’ellipse’)
Attention : Redéfinition de la fonction : ellipse.
Utilisez funcprot(0) pour ne pas afficher ce message.
-->profile(ellipse)
ans =
1. 0.000015 0.
1. 0.000028 12.
1. 0.000032 10.
1. 0.001453 5.
1. 0.000029 13.
1. 0.137104 17.
1. 0.000001 0.
--> remove_profiling(’ellipse’)
Les trois colonnes indiquent, pour chaque instruction, le nombre de répétitions, le temps d’exécution
et la « charge de travail » de l’interpréteur :
1. 0.000015 0. N=100;
1. 0.000028 12. theta = (0:N) * (2*%pi) ./ N;
1. 0.000032 10. Y = sqrt(c)*[cos(theta);sin(theta)];
1. 0.001453 5. Fm1=inv(sqrtm(E));
1. 0.000029 13. X = diag(X0)*ones(2,N+1)+Fm1*Y;
1. 0.137104 17. plot(X(1,:),X(2,:));
1. 0.000001 0. set(gca(),"isoview","on");
52 Chapitre 2 - Ecriture des programmes et mise au point
L’instruction reset_profiling peut être utilisée pour remettre à zéro les compteurs de « profiling »
du code de la fonction.
Chapitre 3
Exemple 3.1 (Traitement d’un fichier PGM) Le format PGM (portable graymap) est un format
très simple dans lequel chaque élément aij donne, sur un ou deux octets, le niveau de gris du pixel (i, j)
associé dans l’image (figure 3.1 ).
Le programme tstimage0.sce lit un fichier .pgm en retournant dans le tableau Vimage les niveaux
de gris de l’image. Celle-ci est ensuite affichée à l’aide de Matplot (figure 3.2 ).
//===== tstimage0.sce
// image au format pgm (portable graymap file)
funcprot(0); getd
fid=mopen(’st2672_420p.pgm’,’r’); // image 672*420
//===== traitement en-tete
[nbrows,nbcols,mform]=procheader(fid);
//=====
Vimage=zeros(nbrows,nbcols);
//===== lecture image
for k=1:nbrows
Vrow=mget(nbcols,mform,fid); Vimage(k,:)=Vrow;
end
mclose(fid)
//===== ecriture dans un fichier binaire pour test (format uchar)
fid=mopen(’voiture.dat’,’wb’);
for k=1:nbrows, mput(Vimage(k,:),’uc’,fid); end
mclose(fid)
//===== affichage avec Matplot
f = scf(1); clf; cm=graycolormap(256);
53
54 Chapitre 3 - Eléments sur les images
Le programme sauvegarde l’image dans un fichier appelé voiture.dat. D’une façon générale, il est
préférable de sauvegarder (save) le tableau dans un fichier .sod pour pouvoir le relire avec load (para-
graphe 1.6.2).
function [nbrows,nbcols,mform]=procheader(fid)
Telecom-ParisTech – GB 55
La fonction trtcomment traite les lignes de commentaires éventuelles. Celles-ci commençent par # et
se terminent par un passage à la ligne (code 10) :
function trtcomment(fid)
//===== traitement de ligne de commentaire commencant
// par le caractere ’’diese’’
cc=mget(1,’uc’,fid); moff=mtell([fid]);
if ascii(cc)==’#’ then
cc=55;
while (isempty(find(cc==10))), cc=mget(1,’uc’,fid); end
else
mseek(moff - 1);
end
endfunction
Il est possible d’utiliser, à la place de Matplot, la fonction grayplot pour obtenir l’affichage de l’image.
f1=scf(1); clf()
rect0=[10 10 nx+9 ny+9];
Matplot(Vimage, rect=rect0, strf=’070’)
cm=graycolormap(256);
f1.color_map=cm; f1.auto_resize=’off’; f1.axes_size=[nx,ny];
//===== affichage resultat
f2=scf(2); clf()
Matplot(zr, rect=rect0, strf=’070’)
cm=graycolormap(256);
f2.color_map=cm; f2.auto_resize=’off’; f2.axes_size=[nx,ny];
La fonction de filtrage utilise la transformée de Fourier discrète 2D, donc réalisant convol2d, et peut
être écrite de la façon suivante :
function zr=myfilter2(B,Vimage)
sV=size(Vimage); nx=sV(2); ny=sV(1);
sB=size(B); nBx=sB(2); nBy=sB(1);
//===== image
Vimg=[zeros(nBy,nx+nBx);zeros(ny,nBx),Vimage];
Vimgs=fft(Vimg,-1);
//===== filtre
Bt=zeros(ny+nBy,nx+nBx);
Bt(1:nBy,1:nBx)=B; Bts=fft(Bt,-1);
//=====
Zs=Bts .* Vimgs;
clear Bts Vimgs
z=real(fft(Zs,1));
zr=z(nBy+1:ny+nBy,nBx+1:nx+nBx);
endfunction
Remarque : convol2d est une convolution et non un filtrage. Cela implique que la dimension de
l’image résultante est plus importante que celle de l’image de départ.
Le programme veriffft3.sce effectue le même traitement qu’auparavant, avec un affichage
un peu différent (fonction grayplot). On notera la modification de dimension de l’image filtrée
(zr=zr(3:−2, 3 :-2);).
//===== veriffft3.sce
clear
funcprot(0); getd()
load(’imgcar336210.sod’)
Telecom-ParisTech – GB 57
Exemple 3.2 (Seuillage d’une image) L’opération de seuillage, ou binarisation, fait partie des trai-
tements simples. Ici le seuil est réglé manuellement, mais il existe des méthodes « automatiques » de
recherche de seuil (méthode de Otsu en particulier). Le résultat est donné figure 3.4 .
//===== trtseuil.sce
clear
funcprot(0); getd
load(’wendyNG.sod’)
sV=size(xwen); nx=sV(2); ny=sV(1);
//===== seuillage
xwent=zeros(ny,nx);
idx=find(xwen>=110); xwent(idx)=255;
f1=scf(1); clf()
Matplot(xwent, rect=[0 0 nx-1 ny-1], strf=’070’)
cm=graycolormap(256);
f1.color_map=cm; f1.auto_resize=’off’; f1.axes_size=[nx,ny];
/Applications/scilab-5.4.0.app/Contents/MacOS/share/scilab/contrib/sivp-0.5.3/}
-->cd SCI/contrib/sivp-0.5.3
-->exec(’builder.sce’)
Le problème est que SIVP nécessite OpenCV (Open Computer Vision Library)
(http://sourceforge.net/projects/opencvlibrary/files/latest/download?source=directory).
Toujours sous Mac OS, il faut installer au préalable MacPorts :
http://www.macports.org/install.php
58 Chapitre 3 - Eléments sur les images
Une fois tout cela installé, on passe à OpenCV (voir site de Tilo Mitra qui explique la démarche,
http://tilomitra.com/opencv-on-mac-osx/) :
# make a separate directory for building
demariolan:~ blanchet$ cd /Applications/OpenCV-2.4.4
demariolan:OpenCV-2.4.4 blanchet$ cmake -G "Unix Makefiles"
# Now, we can make OpenCV. Type the following in:
demariolan:OpenCV-2.4.4 blanchet$ make -j8
sudo make install
# This should now build OpenCV into your /usr/local/ directory.
Construction d’interfaces
Scilab offre des possibilités de construction d’interfaces graphiques mariant menus déroulants, boutons,
zones de saisie, etc. Les fonctions de base permettant de construire les objets graphiques sont :
− figure pour construire les fenêtres de l’application,
− uicontrol pour afficher, et définir les traitements associés, les objets de contrôle tels que bouton-
poussoirs, cases à cocher, listes déroulantes, etc.
− uimenu pour définir de nouveaux menus et sous-menus, avec les traitement associés,
− newaxes pour définir des zones de tracés dans lesquelles s’inscriront les tracés de fonctions tels que
les plot.
A chacun des objets définis dans l’interface graphique on peut attacher des traitements. Ceux-ci
peuvent être simplement passés comme chaînes de caractères dans la liste des propriétés de l’objet (pro-
priété « callback »).
59
60 Chapitre 4 - Construction d’interfaces
hpb=uicontrol(f,’style’,’pushbutton’,’position’,[5 10 80 20],..
’string’,’PushB / close’,’callback’,’close(f)’);
hrb=uicontrol(f,’style’,’radiobutton’,’position’,[110 175 80 16],..
’value’,1,’hor’,’left’,’string’,’RadioB’);
hcb=uicontrol(f,’style’,’checkbox’,’position’,[110 200 80 16],..
’value’,1,’hor’,’left’,’string’,’CheckBox’);
hsl=uicontrol(f,’style’,’slider’,’position’,[90 225 100 16],..
’min’,-5,’max’,5,’sliderstep’,1);
hsl.value=0;
//===== frame et controles
hfr=uicontrol(f,’style’,’frame’,’position’,[5 65 95 150],..
’backg’,[.9 .9 .9]);
htx=uicontrol(hfr,’style’,’text’,’position’,[5 124 85 20],..
’relief’,’raised’,’backg’,[0 1 0],’string’,’Texte statique’);
maliste=[’item 1’,’item 2’,’autre’];
montxt="zone d"+ascii(39)+"édition";
hed=uicontrol(hfr,’style’,’edit’,’position’,[5 100 85 20],..
’string’,montxt,’hor’,’left’)
hpu=uicontrol(hfr,’style’,’popupmenu’,’position’,[5 76 85 20],..
’string’,maliste,’relief’,’raised’)
hlb=uicontrol(hfr,’style’,’listbox’,’position’,[5 5 85 65],..
’string’,maliste)
//===== autres (version 5.4.0)
if vers5p4p0
hfr2=uicontrol(f,’style’,’frame’,’position’,[250 117 190 125],..
’backg’,[.9 .9 .9]);
him=uicontrol(hfr2,’style’,’image’,’position’,[7 5 176 115],..
’string’,’st3.jpg’);
noms=["Blabla";"Hups"]; prenoms=["Ge";"Mo"]; rangs=["1";"2"];
matable=[[’ ’,’nom’,’prenom’]; [rangs noms prenoms]];
htb=uicontrol(f,’style’,’table’,’position’,[110 10 180 100],..
’string’,matable);
end
//===== graphiques
a=newaxes(); a.box="on"; a.grid=[1 1];
a.axes_bounds=[0.65 0.55 .35 .40];
x=(0:2*%pi/100:2*%pi);
plot(x,sin(x))
Sous Windows 7 professionnel, avec Scilab 5.4.1 64 bits, l’interface s’affiche de la même manière (figure
Telecom-ParisTech – GB 61
4.2 ).
Figure 4.2 – Un exemple de fenêtre avec ses EC, sous Windows 7 professionnel
64 bits et Scilab 5.4.1
Commentaires :
1. Le tracé des différents objets peut prendre un temps non négligeable. Ceci cause un effet de « cas-
cade » qui peut être désagréable. Une solution est la suivante :
-->hf=figure(0,’visible’,’off’);
-->hf.visible="on";
L’affichage de toutes les feuilles du niveau suivant peut être faite par :
On peut visualiser les niveaux suivants, s’ils existent, de la même manière. La première commande
donne des informations sur la première feuille de la première branche Axes. Attention : cette branche
correspond à la figure que l’on a définie (sin(x)), tandis que f.children(9) correspond au cadre
de tracé attaché à la fenêtre et définie lors de la création de la fenêtre avec figure. Pour les menus
(uimenu), c’est la même chose. Le premier correspond au dernier affiché, ici le menu d’aide.
-->f.children(1).children(1)
ans =
Handle of type "Compound" with properties:
==========================================
parent: Axes
children: "Polyline"
visible = "on"
user_data = []
tag =
-->f.children(13).children(2)
ans =
Handle of type "uimenu" with properties:
========================================
Parent: uimenu
Children: []
Enable = "on"
Foregroundcolor = [0,0,0]
Label = &Imprimer...
Handle_Visible = "off"
Visible = "on"
Callback = printfigure([SCILAB_FIGURE_ID]);
Callback_Type = 0
Checked = "off"
Userdata = []
Tag =
3. Le paramètre booléen vers5p4p0 est utilisé pour le cas où l’on ne disposerait pas des EC image et
table (à partir de la version 5.4.0).
4. figure construit la fenêtre initiale avec une taille et une position données : le point haut gauche
est défini en x = 20, y = 40 pixels, la largeur est égale à 450 pixels et la hauteur 250. La couleur
du fond est définie par la propriété background. Scilab utilise un système de couleurs indexées. Ici
on a utilisé la couleur 7. On vérifiera :
-->color(’yellow’)
ans =
7.
-->cmap=get(sdf(),"color_map");
-->cmap(7,:)
ans =
1. 1. 0.
La première commande retourne l’index associé au jaune dans la table des couleurs utilisée dans la
figure par défaut (sdf() pour set default figure). La seconde récupère cette table dans cmap et
cmap(7,:) donne la composition en « rouge, vert, bleu » du jaune (chaque composante est comprise
entre 0 et 1).
Telecom-ParisTech – GB 63
5. Le premier objet graphique construit est un « bouton poussoir » qui provoque la fermeture de la
fenêtre. Ce dernier traitement est spécifié par la propriété « callback » close(f).
6. newaxes permet de définir une zone de tracé. Sa taille et son positionnement sont définis en « po-
sition et taille relative ».
7. Il peut y avoir des différences de comportement selon les versions de Scilab et les machines cibles :
prises en charge des codages d’images, emplacement de menus, etc. Matlab présente le même genre
de problème.
//===== interface2.sce
h = findobj(’figure_name’, ’interface2’)
if(~isempty(h)), messagebox(’interface2 existe deja’,"modal"), close(h), end
//===== controles
hpb=uicontrol(f,’style’,’pushbutton’,’position’,[5 10 40 20],..
’string’,’Sortir’,’callback’,’close(f)’);
getd(’./exemple1’)
f=figure();
f.position=[20,40,450,250]; f.figure_name="interface2";
f.Background=7; // yellow
fsize=f.position;
//===== controles
hpb=uicontrol(f,’style’,’pushbutton’,’position’,[fsize(3)-50 10 40 20],..
’string’,’Sortir’,’callback’,’close(f)’);
hfr=uicontrol(f,’style’,’frame’,’position’,[5 10 90 65],..
’backg’,[.9 .9 .9]);
hcbc=uicontrol(hfr,’style’,’radiobutton’,’position’,[5 10 80 20],..
’value’,1,’hor’,’left’,’string’,’cosinus’,’callback’,’fctcbc(a,hcbc,hcbs)’);
hcbs=uicontrol(hfr,’style’,’radiobutton’,’position’,[5 35 80 20],..
’value’,0,’hor’,’left’,’string’,’sinus’,’callback’,’fctcbs(a,hcbc,hcbs)’);
64 Chapitre 4 - Construction d’interfaces
//===== axes
a=newaxes(); a.box="on"; a.grid=[1 1];
a.axes_bounds=[0.2 0 .8 .9];
Les fonctions utilisées dans les callback sont enregistrées dans le répertoire ./exemple1 (commande
getd(’./exemple1’) dans le programme) :
//===== traitement du radiobutton cosinus
function fctcbc(a,hcb1,hcb2)
cbc=hcb1.value;
if cbc==1 then
hcb2.value=0; fctcalcul(a,%t)
else
hcb2.value=1; fctcalcul(a,%f)
end
endfunction
un grand nombre de handles que l’on doit passer aux fonctions qui en ont besoin soit en paramètres soit
en global. On peut aussi, comme le fait l’outil guide de Matlab, utiliser une structure pour y ranger
toutes les informations relatives aux objets manipulés et passer cette structure en paramètre de toutes
les fonctions.
La fonction mytrt utilisée dans les callback est enregistrée dans le répertoire ./exemple1 :
function mytrt(action)
global haa
select action
case ’fsin’ then
x=(0:2*%pi/100:2*%pi); y=sin(x);
case ’fcos’ then
x=(0:2*%pi/100:2*%pi); y=cos(x);
case ’fch’ then
x=(-2:4/100:2); y=cosh(x);
case ’fsh’ then
x=(-2:4/100:2); y=sinh(x);
end
sca(haa); haa.auto_clear="on"; plot(x,y), haa.tight_limits="on";
endfunction
Simulation
Scilab dispose d’un outil de simulation par schémas-blocs appelé Xcos et invoqué à partir du menu
« Applications ».
Les blocs réalisant des fonctions de base – horloges, filtres, oscilloscopes, amplificateurs, non-linéarités,
etc. – sont déposés sur le plan de travail et reliés entre eux. Les blocs sont dotés :
− d’entrées et sorties dites « régulières » à gauche et/ou à droite du bloc ;
67
68 Chapitre 5 - Simulation
entrées de contrôle
entrées sorties
régulières régulières
sorties de contrôle
Le fonctionnement des blocs est conditionné par les activations. Celles-ci peuvent être « continues »,
par exemple un intervalle de temps, ou « discrètes », ce sont alors des événements, par exemple délivrés
par une horloge.
Exemple 5.1 (Système à temps continu) Le système considéré est un simple intégrateur alimenté
par un signal sinusoïdal d’amplitude 1, de fréquence 1 Hz et de déphasage 0. Les paramètres de chaque
bloc sont accessibles en « double-cliquant » sur le bloc. La période de l’horloge « activant » l’oscilloscope
définit la finesse de tracé que l’on obtiendra à l’écran. Ici on prend 0,1. Cela signifie que toutes les 0,1 s la
valeur en entrée est lue et utilisée pour construire la courbe à afficher (constituée de segments de droite).
1
0,5
0
−0,5
−1
30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60
1
0,5
0
−0,5
−1
30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60
Pour obtenir la superposition des tracés de l’entrée et de la sortie, on peut utiliser un multiplexeur
(figure 5.5 ).
0,8
0,4
0
−0,4
−0,8
60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90
Le système est un retard pur alimenté par une sinusoïde, de fréquence 2π Hz, d’amplitude 1 et de
déphasage 0. L’horloge est définie avec une période de 0,1 s et un temps d’initialisation de 0,1 s. Le système
étant par nature à temps discret il nécessite une horloge. Le signal sinusoïdal est considéré comme « temps
discret ». Il hérite des propriétés du système (figures 5.6 et 5.7 ).
1
0,5
0
−0,5
−1
180 181 182 183 184
1
0,5
0
−0,5
−1
180 181 182 183 184
Figure 5.7 – Résultat d’exécution : si les couleurs des tracés sont données par
des nombres > 0, on obtient des tracés avec des segments, sinon (nombres < 0)
on obtient des points (peu visibles dans la réalité)
70 Chapitre 5 - Simulation
K
G(s) = 2 (5.1)
s2 + 2zωN s + wN
En double-cliquant sur le super-bloc une nouvelle fenêtre s’ouvre dans laquelle on définit le second
ordre « entre » l’entrée et la sortie (figure 5.9 ).
Le schéma correspond à une représentation d’état sous forme dite « compagnon », soit :
dy1 (t)
= y2 (t)
dt
dy2 (t)
= −ωN
2
y1 (t) − 2zωN y2 (t) + Kx(t)
dt
et y(t) = y1 (t).
La simulation donne le résultat de la figure 5.10 .
1
0,8
0,6
0,4
0,2
0
2
1,5
1
0,5
0
−0,5
−1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Figure 5.11 – Bloc d’un système du deuxième ordre ; on remarque que les noms
des paramètres, z, wn, K, apparaissent dans les blocs correspondants, ce qui a
nécessité de définir au préalable le contexte du schéma
Exemple 5.3 (Animation utilisant un schéma Xcos) On fait varier l’amortissement z et on visua-
lise la réponse indicielle. Le bloc END permet de définir sur le schéma la durée de la simulation.
importXcosDiagram("DirXcos1/tstordre2anim.zcos")
if verbose,
disp(typeof(scs_m), ’TYPE = ’) // le type est "diagram"
disp(scs_m.props, ’STRUCTURE = ’) // la structure
end
// execution
for z=(.1:.05:1.5)
chn=’z=’+string(z); disp(chn)
scs_m.props.context(4)=chn;
scicos_simulate(scs_m);
end
− « Simulation - Configurer » : Temps d’intégration final = 60 (il semble que la durée de simu-
lation soit la plus petite de celle définie ici et celle définie dans le bloc END).
Variables aléatoires
On note que l’ensemble des valeurs possibles de X se réduit à l’intervalle (a, b) et que la probabilité
d’appartenir à un intervalle (c, d) ⊂ (a, b) est égale à (d − c)/(b − a) et est donc proportionnelle à la
longueur de l’intervalle. Sa densité de probabilité est représentée à la figure 6.1 . Elle est constante sur
l’intervalle (a, b).
p X (x)
1
b−a
x
a b
73
74 Chapitre 6 - Variables aléatoires
On pourra vérifier à titre d’exercice que sa moyenne, son moment du second ordre et sa variance sont
donnés respectivement par :
∫ b
x a+b
E {X} = dx =
a b − a 2
∫ b 2
{ 2} x a + ab + b2
2
E X = dx =
a b−a 3
{ 2} 2 (b − a)2
var (X) = E X − E {X} =
12
Exemple 6.1 (loi uniforme sur (a, b)) On veut obtenir une v.a. X de loi uniforme sur (a, b), à partir
de la fonction Scilab rand qui donne une v.a. de loi uniforme sur (0, 1). A titre d’exercice on pourra
établir que la v.a. X = (b − a)U + a, où U est une variable uniforme sur (0, 1), est uniforme sur (a, b).
Pour engendrer 1 000 tirages d’une loi uniforme sur [−π, +π], taper :
-->U=rand(1,1000,"uniform");
π
3
2
1
0
−1
−2
−3
−π
0 100 200 300 400 500 600 700 800 900 1000
Le générateur uniforme est du type « pseudo-aléatoire ». L’état initial du générateur peut être défini
par rand(’seed’,n). Par défaut n = 0.
-->rand(’seed’,0)
-->rand(1,2)
ans =
0.2113249 0.7560439
-->rand(1,2)
ans =
0.0002211 0.3303271
-->rand(’seed’,0)
-->rand(1,2)
ans =
0.2113249 0.7560439
Pour avoir une initialisation moins prévisible, on peut utiliser n=getdate(’s’); rand(’seed’,n);.
Taper à la suite histplot(10,X). On obtient un diagramme (figure 6.3 ), appelé histogramme, qui
représente une estimation de la densité de probabilité représentée figure 6.1 .
0,18
0,14
0,1
0,06
0,02
0
−4 −3 −2 −1 0 1 2 3 4
1. un générateur doit être rapide, peu gourmand en espace mémoire et facilement portable d’un envi-
ronnement informatique à un autre ;
2. les séquences engendrées doivent être de longueur importante pour éviter tout phénomène de « bou-
clage » et donc de périodicité ;
3. on doit pouvoir répéter des séquences données, condition indispensable lorsqu’on est en phase de
mise au point de programmes ;
4. on doit pouvoir engendrer des générateurs indépendants à partir d’un seul et même générateur de
base. Ceci sous-entend que l’on puisse construire facilement sk+n à partir de sk .
Les séquences que l’on veut engendrer sont i.i.d. (indépendantes et identiquement distribuées). D’un
point de vue intuitif, si on considère l’ensemble fini Φp de toutes les séquences de longueur p construites
à partir d’un état initial donné, Φp doit « remplir » l’hypercuble (0, 1)p de manière uniforme. On devrait
pouvoir caractériser la qualité du générateur par l’écart qu’il y a entre une distribution expérimentale et
la distribution uniforme sur (0, 1)p . Cet écart doit évidemment pouvoir être évalué sans avoir à construire
toute la séquence.
En pratique les tests de générateurs sont bâtis sur des ensembles de programmes parmi lesquels
les tests de Dienhard (http://stat.fsu.edu/pub/diehard/), les tests du NIST pour les générateurs
utilisés en cryptographie (http://csrc.nist.gov/rng/), la librairie de tests « TestU01 » de l’université
de Montréal (http://www.iro.umontreal.ca/~simardr/testu01/tu01.html), etc.
Définition
Une v.a. X est dite gaussienne ou normale, si elle prend ses valeurs dans R et si sa fonction caracté-
ristique (expression A.14) a pour expression :
( )
1
ϕX (u) = exp jmu − σ 2 u2
2
76 Chapitre 6 - Variables aléatoires
où m est un paramètre réel et σ un paramètre positif. Si σ ̸= 0, on montre que la loi possède une densité
de probabilité qui a pour expression :
( )
1 (x − m)2
pX (x) = √ exp − (6.2)
σ 2π 2σ 2
p X (x)
m
x
6σ
Numériquement on vérifie que plus de 99% des valeurs tombent dans l’intervalle (m − 3σ, m + 3σ).
On parle alors d’intervalle de confiance à 99%. On en déduit une règle pratique dite règle des 3 sigma qui
énonce que l’amplitude crête d’une v.a. gaussienne est égale à ±3σ autour de sa moyenne. On entend par
là que la probabilité de « sortir » de cet intervalle est inférieure à 1%. Si on se contente d’un intervalle de
confiance à 95%, il faut prendre (m − 2σ, m + 2σ). Si au contraire on préfère un intervalle de confiance à
99,9%, il faut prendre (m − 4σ, m + 4σ).
Exemple 6.2 (Variable gaussienne (m, σ 2 )) Soit Y une v.a. gaussienne, centrée et de variance 1.
On peut vérifier que la v.a. X = σY + m a pour moyenne m et pour variance σ 2 . Nous verrons qu’une
conséquence directe de la définition générale d’un vecteur gaussien est que le caractère gaussien se conserve
par transformation linéaire. Pour avoir un échantillon de 1 000 valeurs d’une loi gaussienne de moyenne
4 et de variance 7, taper :
//===== histog1d.sce
clear; N=1000; m=4; sigma2=7;
X=sqrt(sigma2)*rand(1,N,’normal’)+m;
figure(1); plot(X,’.’); set(gca(),’grid’,[1 1])
figure(2); histplot(10,X);
L’échantillon des 1 000 tirages est donné figure 6.5 et l’histogramme correspondant figure 6.6 .
14
12
10
8
6
4
2
0
−2
−4
0 100 200 300 400 500 600 700 800 900 1000
0,14
0,1
0,06
0,02
0
−4 −2 0 2 4 6 8 10 12 14
Définition
Du fait de l’indépendance (définition A.7) des parties réelle U et imaginaire V , la loi conjointe du
couple (U, V ) a pour densité de probabilité :
( 2) ( 2)
1 u 1 v
pU V (u, v) = pU (u)pV (v) = √ exp − 2 × √ exp − 2
σ π σ σ π σ
( 2 )
1 u + v2
= exp −
πσ 2 σ2
En remarquant que |x|2 = u2 + v 2 , et en introduisant la notation pX (x) = pU V (u, v), on peut encore
écrire :
( )
1 |x|2
pX (x) = exp − (6.3)
πσ 2 σ2
L’expression 6.3 porte le nom de densité de probabilité d’une v.a. gaussienne complexe. On ajoute parfois
le terme circulaire qui rappelle que les courbes d’égale densité sont les cercles u2 + v 2 = constante.
Notons que :
{ } { } { }
E |X|2 = E {XX ∗ } = E {(U + jV )(U − jV )} = E U 2 + E V 2 = σ 2 (6.4)
− en comparant l’expression 6.3 à l’expression 6.2 donnant la densité de probabilité d’une loi gaus-
sienne réelle, on note qu’il y a disparition des facteurs 2 et de la racine carrée.
Exemple 6.3 (Variable aléatoire gaussienne complexe) Pour engendrer 1 000 échantillons d’une
variable aléatoire gaussienne complexe (voir expression 6.3), centrée et de variance 5, taper le programme
suivant (figure 6.7 ) :
//===== histoGC1d.sce
clear, close
varX=5; sigma=sqrt(varX);
U=sqrt(varX/2) * rand(1,1000,’normal’);
V=sqrt(varX/2) * rand(1,1000,’normal’);
X=U+%i*V;
//===== tracer
plot(real(X),imag(X),’.’); set(gca(),’grid’,[1 1])
cercle=sigma*fft([0 -1 zeros(1,100)]);
plot(real(cercle),imag(cercle),’r’); set(gca(),’isoview’,’on’)
6
5
4
3
2
1
0
−1
−2
−3
−4
−5
−6
−5 −4 −3 −2 −1 0 1 2 3 4 5
⋆ On montre que la loi de probabilité d’un vecteur gaussien de dimension n, de vecteur moyenne m
(de dimension n) et de matrice de covariance C (de dimension n × n) a pour fonction caractéristique :
( )
1 T
ϕX (u1 , . . . , un ) = exp jm u − u Cu
T
(6.5)
2
où x = (x1 , . . . , xn )T .
⋆ Si n variables conjointement gaussiennes ne sont pas corrélées, alors elles sont indépendantes.
En effet, si on fait C = σ 2 I dans l’expression 6.6, pX (x1 , . . . , xn ) = pX1 (x1 ) . . . pXn (xn ), et donc,
d’après A.12, les variables sont indépendantes.
mY = AmX + b et C Y = AC X AT
On dit que le caractère gaussien se conserve par transformation linéaire. Ce résultat est une consé-
quence de la définition 6.1.4 et de la propriété A.5.
− on considère N v.a. indépendantes et de même loi que X ; on effectue un tirage, ce qui donne la
réalisation x1 , . . ., xN ;
Si ∆i est un segment choisi assez petit autour du point x, on a pX (u) ≈ pX (x) et le second membre
est approximativement égal à pX (x) × δi où δi désigne la longueur de ∆i . On en déduit une formule
pratique pour estimer pX (x) :
ni
pX (x) ≈ (6.7)
N δi
où ni est le nombre de points observés dans l’intervalle ∆i .
Partant d’un échantillon de N valeurs, la procédure pour estimer la densité de probabilité en Nc
points, ou « classes », {x1 , . . . , xP } peut alors se résumer ainsi :
1. on partitionne l’intervalle des valeurs observées en Nc sous-intervalles ∆1 , . . . , ∆Nc , de longueurs res-
pectives δ1 , · · · , δNc , situés autour des points x1 , . . . , xNc . En général, on choisit des sous-intervalles
de même longueur et xk est pris au milieu du sous-intervalle ∆k , sauf éventuellement pour les deux
intervalles extrêmes ;
for k=1:Nc
idx=find((X>=xc(k))&(X<xc(k+1)));
ni(k)=length(idx); xcc(k)=(xc(k)+xc(k+1))/2;
xcc(k)=(xc(k)+xc(k+1))/2
end
ni(Nc)=ni(Nc)+1;
if bnorm then
ni=ni/N/delta;
end
if bplot then
plot2d3(xcc,ni), plot(xcc,ni,’o’)
end
endfunction
Le paramètre bnorm de myhist.sci joue le même rôle que le paramètre normalization de histplot.
Pour une valeur %t Il indique que l’on veut tracer la densité, sinon, pour %f, le nombre d’occurrences
dans chaque intervalle.
0,16
0,14
0,12
0,1
0,08
0,06
0,04
0,02
0
−4 −2 2 4 6 8 10 12 14 16
Le problème du choix de la valeur de Nc est un problème complexe. Ce que nous pouvons dire ici est
que Nc doit être grand pour que la densité de probabilité soit correctement estimée mais suffisamment
petit devant N de façon à ce que le nombre de points dans chaque sous-intervalle reste grand. On peut
prendre par exemple Nc = N 1/3 qui tend vers l’infini quand N → ∞ tend vers l’infini et qui est tel que
N/Nc tend aussi vers l’infini quand N → ∞.
La fonction hist de Matlab ne fonctionne pas comme histplot. Elle ne se contente pas de tracer un
histogramme mais retourne le nombre de tirages dans chaque intervalle et les centres de chaque intervalle.
Il faut ensuite estimer les densités (expression 6.8) et, éventuellement, faire tracer l’histogramme obtenu.
Scilab est doté de la fonction pr=binomial(p,n) qui retourne la suite P {X = k} dans n tirages
indépendants suivant une loi de Bernoulli :
( )
n k
P {X = k} = p (1 − p)n−k
k
∑−1
λ=N ∑−1
λ=N
pj (n + 1) = P { Xn+1 = j | Xn = λ} pλ (n) = aλ,j pλ (n) (6.10)
λ=0 λ=0
82 Chapitre 6 - Variables aléatoires
5
4 0,6
3 0,4
2
0,2
1
0 0
0 200 400 600 800 1000 0 1 2 3 4 5
1
0,8
0,6
0,4
0,2
0
0 1 2 3 4 5 6 7 8 9 10
0,2
0,15
0,1
0,05
0
0 1 2 3 4 5 6 7 8 9 10
[ ]
En posant pT (n) = p0 ... pN −1 et A = [aij ], on peut écrire :
∑
N −1
pT (n + 1) = pT (n) × A où 0 ≤ pk ≤ 1, 0 ≤ aij ≤ 1 et aij = 1 (6.11)
j=0
-->genmarkov([1 2 1],0)
ans =
1. 0. 0. 0.
0. 0.3181325 0.6818675 0.
0. 0.5711632 0.4288368 0.
0. 0. 0. 1.
Le graphe contient trois classes. La deuxième contient deux états et les probabilités de transition sont
tirées aléatoirement (figure 6.11 ).
Exemple 6.7 (Classes non connexes et états transitoires) Le deuxième paramètre d’appel de
genmarkov est le nombre d’états transitoires. Un état transitoire, ou source, est un état dans lequel
on ne peut revenir une fois que l’on en est sorti et qui donne accès à tous les autres états. Taper :
Telecom-ParisTech – GB 83
-->genmarkov([1 2 1],1)
ans =
1. 0. 0. 0. 0.
0. 0.0118626 0.9881374 0. 0.
0. 0.6980631 0.3019369 0. 0.
0. 0. 0. 1. 0.
0.0656237 0.3468243 0.3846394 0.1882441 0.0146684
Le graphe contient toujours trois classes. Il y a un état transitoire. Dès lors que l’on « en est sorti »
pour aller vers un autre état, on ne peut y revenir (figure 6.12 ).
Le troisième paramètre d’appel (flag) de genmarkov indique si l’on doit permuter les états.
-->P=genmarkov([3],0), ye=grand(10,"markov",P,2)
P =
0.3043490 0.3671631 0.3284879
0.4194912 0.2426225 0.3378863
0.2726937 0.3022184 0.4250879
ye =
1. 1. 2. 1. 3. 3. 3. 3. 3. 2.
FX(x)
1
U
pX(2)
pX(1)
pX(0) x
a0 a1 0 a2 a3
répartition. Nous avons représenté figure 6.13 la forme générale de la fonction FX (x). Sa valeur, en
∑k
x = ak , s’écrit FX (ak ) = n=0 pX (n).
Considérons alors une v.a. U de loi uniforme sur (0, 1) et soit Y la v.a. obtenue, à partir de U , par
inversion de la fonction de répartition, ce qui s’écrit :
[0, pX (0)[
alors Y = a0
[pX (0), pX (0) + pX (1)[ alors Y = a1
Si U ∈ .. (6.12)
.
[FX (ak−1 ), FX (ak )[ alors Y = ak , etc.
Loi de probabilité de la v.a. Y ainsi obtenue est précisément celle de la variable X cherchée. En effet
en utilisant le fait que U est uniforme, nous pouvons écrire successivement :
∫ FX (ak )
P {Y = ak } = P {U ∈ [FX (ak−1 ), FX (ak [} = du
FX (ak−1 )
= FX (ak ) − FX (ak−1 ) = pX (ak )
La variable Y construite suivant la procédure 6.12 suit donc la loi cherchée.
⋆ Soit la fonction bijective et dérivable x = f (u) et U une v.a. dont la loi a pour densité de probabilité
pU (u). Alors la v.a. X = f (U ) a pour densité de probabilité :
du pU (u) pU (g(x))
pX (x) = pU (u) = dx = ′ (6.13)
dx |f (g(x))|
du
où f ′ (u) = dx/du désigne la dérivée de f (u) et où u = g(x) désigne la fonction inverse de x = f (u), à
savoir telle que g(f (u)) = u.
où u = g(x) représente l’inverse de x = f (u). Choisissons pour g(x) la fonction F (x), où F (x) est
précisément la fonction de répartition de la v.a. dont on veut engendrer un échantillon. On a du dx =
F ′ (x) ≥ 0. En portant dans 6.14 et en notant que F (x) ∈ [0, 1], il vient pX (x) = F ′ (x), ce qui signifie
que la loi de X a pour densité de probabilité F ′ (x) qui est bien celle de la loi cherchée.
Ce résultat est mis à profit pour engendrer, à partir du générateur uniforme sur (0, 1), un échantillon
d’une variable aléatoire dont la densité de probabilité pX (x) est donnée. En voici l’algorithme :
Telecom-ParisTech – GB 85
∫x
1. On détermine la fonction u = −∞
pX (t)dt.
2. On détermine son inverse x = g(u).
3. Si U est un échantillon uniforme sur (0, 1), alors X = g(U ) est un échantillon dont la loi a pour
densité de probabilité pX (x).
6.4 Exercices
Exercice 6.1 (Loi de Poisson (indications page 146))
La v.a. X, à valeurs dans N, suit une loi de Poisson lorsque :
ak
P {X = k} = pX (k) = e−a (6.15)
k!
où a désigne une quantité positive appelée paramètre de la loi.
1. Déterminer la moyenne et la variance de X.
2. Déterminer, pour k ∈ N, la relation de récurrence qui donne pX (k) en fonction de pX (k − 1), ainsi que
celle donnant FX (k) = P {X ≤ k}.
3. En utilisant 6.12, écrire un programme qui engendre une v.a. de Poisson de paramètre a = 5, à partir
d’une v.a. U qui suit la loi uniforme sur (0, 1).
4. En utilisant la fonction myhist, vérifier le résultat obtenu.
où le paramètre λ ≥ 0.
1. Déterminer la moyenne et la variance de X.
2. En utilisant la fonction de répartition de X, déterminer une fonction X = g(U ) telle que X suive une
loi exponentielle de paramètre λ lorsque U suit une loi uniforme sur (0, 1).
3. En utilisant la fonction myhist, vérifier le résultat obtenu.
Exercice 6.3 (Loi de Rayleigh (indications page 149)) X suit la loi de Rayleigh si sa densité de
probabilité a pour expression :
( )
x x2
pX (x) = 2 exp − 2 1(x ∈ [0, +∞[) (6.17)
σ 2σ
√
1. vérifier que E {X} = σ π/2 ;
2. U suivant une loi uniforme sur (0, 1), déterminer la fonction X = g(U ) telle que X suive une loi de
Rayleigh ;
3. en utilisant la fonction myhist, vérifier le résultat obtenu.
1 ∑
N
S= Bn
N n=1
86 Chapitre 6 - Variables aléatoires
Modélisons la suite des erreurs par une suite de variables aléatoires Bn telles que Bn = 0 si les valeurs
en position n, dans la séquence originale et dans la séquence erronée, sont identiques et Bn = 1 si elles
sont différentes. La v.a. :
1 ∑
N
S= Bn (6.18)
N n=1
donne alors une estimation de la probabilité d’erreur inconnue p. Si on suppose que les v.a. Bn sont
indépendantes, on peut utiliser les résultats obtenus dans l’exercice 6.4. Pour estimer p avec une précision
ϵr de l’ordre de 10% et un intervalle de confiance de 95%, il faut partir d’une suite de longueur N ≈ 400/p.
Si on se contente d’un intervalle de confiance de 70%, la même précision ϵr = 0,1 est obtenue pour
N ≈ 100/p. C’est souvent en pratique la valeur qui est retenue pour calculer la longueur d’une séquence
de test. Notons que N p représente approximativement le nombre d’erreurs. Cela conduit à adopter la
règle suivante :
Pour estimer une probabilité d’erreur avec un précision de 10% et un niveau de confiance
de 70% il faut « voir passer » une centaine d’erreurs. Il faut donc effectuer l’estimation sur
une séquence dont la longueur est de l’ordre de 100/p.
Si la valeur de p cherchée est de l’ordre de 10−5 , il faut prendre N = 10 000 000. Une telle longueur
peut nécessiter un temps de simulation important, même sur une machine très rapide. Cette situation est
très courante dans le domaine des communications numériques.
Exercice 6.5 (Ellipse de confiance (indications page 150)) On note pX (x1 , x2 ) la densité de pro-
babilité d’un vecteur aléatoire gaussien de dimension 2, de moyenne m et de matrice de covariance C.
1. On pose :
∫
α = P {X ∈ ∆(s)} = pX (x1 , x2 )dx1 dx2
∆(s)
Ecrire un programme :
Exercice 6.6 (Chaîne de Markov (indications page 150)) On observe une suite d’états engendrés
par un graphe de Markov comme suite de N entiers ℓ ∈ {1, n}. On cherche à identifier la matrice de transition
A à partir de cette observation. L’idée est de chercher à maximiser la probabilité conditionnelle pcN d’obtenir
une telle suite connaissant les n2 coefficients aij . Cette quantité est appelée vraisemblance. La solution obtenue
est dite solution du maximum de vraisemblance.
1. Etant donné un état initial ℓ0 , donner pcN en fonction de ℓ0 et des aij . Exprimer le logarithme de cette
quantité, logarithme que l’on désigne par log-vraisemblance.
∑n
2. Le problème apparait alors comme un problème de maximisation sous la contrainte j=1 aij = 1. Ce
problème peut être résolu en introduisant un degré de liberté supplémentaire dans l’expression que l’on
cherche à maximiser. Cette méthode est désignée par méthode des multiplicateurs de Lagrange. On
construit le lagrangien augmenté L de la façon suivante :
∑
n
L ({aij }, λ)) = log (pcN ) + λ aij − 1 (6.19)
j=1
La résolution du système consiste à chercher un maximum de L qui est une fonction des aij et de λ.
Scilab a été doté dès le départ de nombreuses fonctionnalités relatives au domaine de l’automatique. Nous
en donnons dans ce chapitre les éléments de base en les rattachant aux concepts sous-jacents. On fournit
les programmes Scilab mais aussi les programmes MATLAB correspondant, pour mettre en évidence les
quelques différences qui existent entre les deux langages.
7.1.1 Définition
On considère les fonctions x(t) continues par morceaux telles que ∃ C et λ > 0 tels que |x(t)| <
C exp(λt). On suppose aussi qu’il existe α, 0 < α < 1, tel que limt→0 tα |x(t)| → 0. On dira que ces
fonctions appartiennent à l’espace L . Dans ces conditions on peut définir la transformée de Laplace de
x(t) par la fonction complexe X(p) de la variable complexe p par :
∫ ∞
X(p) = x(t)e−pt dt (7.1)
0
L’ensemble des valeurs de p telles que la TL existe est le domaine de convergence (DC) de X(p). Ce
dernier est de la forme Re(p) > λ.
La TL, telle que définie ici avec la borne inférieure de l’intégrale égale à 0, est l’outil privilégié de
résolution des équations différentielle linéaires à coefficients constants (EDLCC) lorsqu’on cherche des
solutions causales, ce qui est le cas dans le domaine de l’automatique.
Son utilisation ne s’arrête cependant pas à la résolution des EDLCC mais permet aussi de résoudre
certaines équations différentielles aux dérivées partielles ou autres équations différentielles non linéaires.
89
90 Chapitre 7 - Eléments d’automatique linéaire à temps continu
On peut remarquer que, si l’on pose p = 2πjf , et pour peu que la fonction x(t) soit causale (nulle
pour t < 0), on obtient la transformée de Fourier de x(t) (encore faut-il vérifier qu’elle existe, c’est-à-dire
que l’axe imaginaire appartient au domaine de convergence !) :
∫ ∞ ∫ ∞
−2πjf t
X(p) = x(t)e dt = x(t)e−2πjf t dt (7.2)
0 −∞
⋆ On supposera dans tout ce qui suit que les domaines de convergence sont toujours de la forme
Re(p) > λ et on admettra que cette condition est équivalente à dire que les fonctions correspondantes
sont causales, c’est-à-dire nulles pour t < 0. Le théorème de Paley-Wiener établit ce résultat.
4. exponentielle : exp(−at) → 1
p+a et 1
p+a → exp(−at)u(t) (u(t) est l’échelon unité ou fonction de
Heaviside) ;
9. théorèmes limites :
1
Exemple : on cherche l’original de (p+2)2 . On part de la propriété (8) de dérivation par rapport à p :
d 1 −1
= 2 → tu(t)
dp p p
d’où le résultat.
Telecom-ParisTech – GB 91
Exemples
1
1. Original de (p−1)(p+2) :
1/3 1/3
1
(p−1)(p+2) = p−1 − p+2
( t )
→ 1
3 e − e−2t u(t)
2p−1
= − p+1
(p+1)(p+2)
3 5
+ p+2
( )
→ −3e−t + 5e−2t u(t)
En appliquant la TL :
[ ]
L (p) = p2 Y (p) − py(0) − ẏ(0)
+ [pY (p) − y(0)] + Y (p)
= 2 [pX(p) − x(0)] + X(p)
soit :
2p + 1 py(0) + ẏ(0) − x(0)
Y (p) = X(p) +
p2 + p + 1 p2 + p + 1
P0 (p)
= G(p)X(p) + (7.4)
D(p)
en posant G(p) = N (p)/D(p).
On reconnaît dans l’expression 7.4 la solution composée :
− d’une solution particulière (partie forcée) – G(p)X(p) ;
− et de la solution générale de l’équation sans second membre (partie libre) – P0 (p)/D(p) – dépendant
des conditions initiales.
G(p) est une fraction rationnelle en p. Les racines du polynôme numérateur N (p) sont appelés les
zéros et celles du dénominateur D(p) les pôles.indexpoles@pôles
Lorsque les zéros et les pôles sont à partie réelle négative, on dit que le système est à minimum de
phase.
La stabilité
La notion de stabilité qui nous intéresse ici est la stabilité entrée bornée - sortie bornée (EBSB) : si
|x(t)| < A ⇒ |y(t)| < B.
Exemple 7.1 (Second ordre pur) Un système du second ordre pur a pour fonction de transfert :
2
ωN
G(p) = 2 (7.6)
p2 + 2zωN p + ωN
où z est le coefficient d’amortissement et ωN la pulsation propre. Il a d’autant plus d’intérêt que l’on se
réfère souvent à ce type de système pour caractériser le comportement de systèmes d’ordres plus élevés.
On dit qu’un système présente une résonance lorsque son gain complexe présente un maximum. Dans
le cas d’un système d’ordre quelconque ce maximum peut être local.
Récapitulatif :
√ √
0 < z < 22 2
2
<z<1 z≥1
oscillations oscillations pas d’oscillations
et résonance pas de pas de résonance
résonance
Résultats divers :
√
− pulsation du régime oscillant : ωo = ωN 1 − z 2 ;
− constante de temps de l’exponentielle décroissante : τ = 1/(zωN ). Le temps de réponse à 5% est
minimum pour z ≈ 0,707 ;
− dépassement relatif (dans la réponse à un échelon, dépassement du premier maximum par rapport
à la valeur limite) :
( )
−zπ
D = exp √
1 − z2
√
− à la résonance ωR = ωN 1 − 2z 2 et le module du gain :
1
|G(ωR )| = √
2z 1 − 2z 2
Le coefficient de surtension Q est défini comme |G(ωR )|/|G(0)|. Ici cela donne Q = 2z√1−2z
1
2
;
√
− la pulsation de coupure ω−3 à −3 dB est définie par G(ω−3 )/G(0) = 2/2 et l’on a ω−3 2
= ωR 2
+
√
4 4
ω−3 + ωR .
Telecom-ParisTech – GB 93
Premier ordre
Un système du premier ordre est modélisé de la façon suivante :
A dy(t)
G(p) = ↔ + ay(t) = Ax(t)
p+a dt
//===== ordre1.sce
// exec(’ordre1.sce’,-1)
clear
clf
den=poly([1,1],’s’,"coeff");
wlog=logspace(-1,1,100); jw=wlog*%i;
mp=1 ./ horner(den,jw);
subplot(211),
plot2d("ln",wlog,20*log10(abs(mp)));
h=gca(); h.grid=[1 1];
phi=atan(imag(mp),real(mp))*180/%pi;
subplot(212), plot2d("ln",wlog,phi);
h=gca(); h.grid=[1 1];
Il existe une fonction bode dans Scilab, fonction qu’il est évidemment préférable d’utiliser. Le
programme précédent explique cependant simplement comment on peut effectuer les calculs et les
affichages.
%===== ordre1.m
clear
clf
den=[1,1];
wlog=logspace(-1,1,100); jw=wlog*1i;
%===== module
mp=1 ./ polyval(den,jw);
mpdB=20*log10(abs(mp));
mx=max(mpdB); mn=min(mpdB);
d=(mx-mn)*.05;
subplot(211), semilogx(wlog,mpdB);
set(gca,’ylim’,[mn-d,mx+d]), grid
%===== phase
phi=atan2(imag(mp),real(mp))*180/pi;
subplot(212), semilogx(wlog,phi);
grid;
Comme le gain est exprimé en décibels, les diagrammes de gain associés aux pôles et aux zéros
s’ajoutent simplement. Il en est de même de la phase puisqu’on a une somme des différents arguments.
p+2
G(p) =
(p + 1)(p + 4)
p+2
Figure 7.2 – Diagramme de Bode de (p+1)(p+4)
◦ Donner la réponse impulsionnelle du système G(p) : on peut partir de l’original de H(p) = (p+1)(p+4)
1
,
soit h(t) = 3 exp(−t) − 3 exp(−4t). Comme on multiplie par p + 2, cela correspond à une dérivation et à
1 1
Deuxième ordre
Reprenons l’expression 7.6.
2
ωN
G(p) = 2
p2 + 2ωN p + ωN
d2 y(t) dy(t)
↔ 2
+ 2zωN 2
+ ωN 2
y(t) = ωN x(t)
dt dt
Le comportement en fréquences d’un second ordre est illustré par le diagramme de Bode pour plusieurs
valeurs de l’amortissement.
Programme Scilab ordre2.sce :
//===== ordre2.sce
// exec(ordre2.sce,-1)
clear, clf
wn=1; z=[.1 .3 .5 sqrt(2)/2 1 2];
wlog=logspace(-1,1,100); jw=wlog*%i;
for k=1:length(z)
mcof=[wn*wn,2*z(k)*wn,1];
den=poly(mcof,’s’,"coeff");
mp=1 ./ horner(den,jw);
subplot(211)
plot2d("ln",wlog,20*log10(abs(mp)));
h=gca(); h.grid=[1 1];
phi=atan(imag(mp),real(mp))*180/%pi;
subplot(212)
plot2d("ln",wlog,phi);
h=gca(); h.grid=[1 1];
end
Figure
√ 7.3 – Diagrammes de Bode de 1/(p2 + 2zp + 1) pour z = 0.1, 0.3, 0.5,
2/2, 1 et 2
mcof=[1,2*z(k)*wn,wn*wn];
mp=1 ./ polyval(mcof,jw);
mpdB=20*log10(abs(mp));
subplot(211), semilogx(wlog,mpdB);
grid on, hold on
phi=atan2(imag(mp),real(mp))*180/pi;
subplot(212), semilogx(wlog,phi);
grid on, hold on
end
%===== ordre2nyq.m
clear,clf
wn=1; z=[.1 .3 .5 sqrt(2)/2 1 2];
Npts=200;
wlog=logspace(-1,1,Npts); jw=wlog*1i;
mp=zeros(length(z),Npts);
for k=1:length(z)
mcof=[1,2*z(k)*wn,wn*wn];
mp(k,:)=1 ./ polyval(mcof,jw);
end
mp=mp.’; plot(real(mp),imag(mp))
limx=get(gca,’xlim’); limy=get(gca,’ylim’);
hold on, plot(limx,[0 0]),
plot([0 0],limy),
plot(real(mp(:,1)),imag(mp(:,1)),’.’)
hold off, grid, axis(’square’)
−0.5
−1
−1.5
−2
−2.5
−3
−3.5
−4
−4.5
−5
−3 −2 −1 0 1 2 3
2
Figure
√ 7.4 – Diagrammes de Nyquist de 1/(p + 2zp + 1) pour z = 0.1, 0.3,
0.5, 2/2, 1 et 2
Le diagramme de Nyquist est essentiellement utilisé pour discuter de la stabilité d’un système en
boucle fermée alors qu’il ne reflète que le contenu fréquentiel de la fonction de transfert en boucle ouverte.
Telecom-ParisTech – GB 97
0.2
10 dB 4 dB 0 dB −4 dB −10 dB
6 dB 2 dB −2 dB −6 dB
0.15
0.1
20 dB
0.05 −20 dB
−0.05
−0.1
−0.15
−0.2
−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4
1/8
2p+1
Figure 7.5 – Diagramme de Nyquist de (p+2)(p+4)
2p+1
Diagramme de (p−2)(p+4)
0.4
2 dB −2 dB −6 dB −10 dB
4 dB −4 dB
6 dB 0 dB
0.3
10 dB
0.2
0.1 20 dB
−20 dB
0
−0.1
−0.2
−0.3
−0.4
−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4
−1/8
2p+1
Figure 7.6 – Diagramme de Nyquist de (p−2)(p+4)
p
Diagramme de p2 +0,5p+1
1
Diagramme de p(p2 +0,5p+1)
1 1 1
≈ ≈ (−0,5ε − j)
p(p2 + 0,5p + 1) jε(0,5jε + 1) ε
1
2 dB 0 dB
0.8 4 dB −2 dB
superposition
0.6 6 dB des tracés
0.4 10 dB −4 dB
−6 dB
0.2 −10 dB
20 dB
0
−20 dB
−0.2
−0.4
−0.6
−0.8
−1
−1 −0.5 0 0.5 1 1.5 2
p
Figure 7.7 – Diagramme de Nyquist de p2 +0,5p+1
10
8
6
4 0 dB
2 2 dB −2 dB −4 dB
4 dB 6 dB 10 dB
0
−10 dB
−2 −6 dB
−4
−6
−8
−10
−2.5 −2 −1.5 −1 −0.5 0
1
Figure 7.8 – Diagramme de Nyquist de p(p2 +0,5p+1)
Exercice 7.1 (Etude d’un troisième ordre) (indications p. 152) On considère le système de fonction
de transfert G(p) :
1
G(p) = (7.7)
(p2 − 1)(p + 2)
1. donner sa réponse impulsionnelle ;
2. donner sa réponse indicielle à conditions initiales nulles sans refaire de décomposition en éléments
simples ;
3. dessiner le diagramme de Bode de G(p) :
4. dessiner le diagramme de Nyquist de G(p).
Telecom-ParisTech – GB 99
25 0.5
0
357 3
20 1
−1
15
354 2.3 6
3
10
6 −3
5 350
12 10
0 340 20 −6
−5 320 40
−12
−10
300 60
−15 280 80
260 240 220 200 160 140 120 100 −18
25 0.5
0
357 3
20 1
−1
15
354 2.3 6
3
10
6 −3
5 350
12 10
340 20 −6
0
−5 320 40
−12
−10
300 60
−15 280 80
260 240 220 200 160 140 120 100 −18
1. suive de consigne : on veut, dans tous les cas, que la grandeur pilotée suive la consigne qui est
définie ;
2. rejet des perturbations : on veut aussi que les perturbations éventuelles (la porte qui s’ouvre, le
petit caillou sur la trajectoire) soient “corrigées” sans intervention extérieure ;
Le contour de Bromwich englobe en principe les pôles sur l’axe imaginaire, ceux-ci étant considérés
comme instables. Ce n’est cependant pas une obligation. Dans le cas contraire on considère les pôles sur
l’axe imaginaire comme pôles stables (voir exemple 7.3).
Indications : considérons la fonction de transfert rationnelle G(p) :
(p − a)N0 (p)
G(p) =
D(p)
Telecom-ParisTech – GB 101
Lorsque p parcourt B, la variation de phase due au seul terme (p − a) est de −2π (figure 7.13 ). Si a
est un pôle, cette variation est 2π. Pour les pôles ou zéros en dehors du contours B, la variation de phase
est nulle. On déduit de cela que, lorsque p parcourt B, G(p) tourne autour de l’origine Np (G) − Nz (G)
fois dans le sens direct autour de l’origine où Np (G) et Nz (G) sont respectivement le nombre de pôles et
le nombre de zéros de G(p) dans le demi-plan droit.
Une condition de stabilité EBSB en boucle fermée est que les pôles de H(p) = G(p)/(1+G(p)) doivent
être à partie réelle négative. Ceci se traduit par “les zéros de 1 + G(p)” ne sont pas dans B. Or, lorsque
p parcourt B, 1 + G(p) tourne Np (1 + G) − Nz (1 + G) fois dans le sens direct autour de l’origine. Or
Np (1 + G) = Np (G) et Nz (1 + G) doit être nul. La condition de stabilité s’écrit alors : le lieu de 1 + G(p)
doit tourner autour de l’origine Np (G) fois dans le sens direct. De façon équivalente le lieu de G(p) doit
tourner autour du point (−1, 0) Np (G) fois dans le sens direct. (−1, 0) est appelé point critique.
Exemple : diagramme de Nyquist de la fonction de transfert
4k(p − 2)
p2 + 5p + 4
avec k > 0, (figure 7.14 pour k = 1) obtenu par le programme Matlab explenyquist51.m.
%===== explnyquist51.m
% utilisation de la toolbox control
num=[1 -2]*4; den=[1 5 4];
g2p=tf(num,den); tf(g2p)
nyquist(g2p), grid
En Scilab, on aurait :
//===== nyquiststab.sce
num=poly([-2 1]*4,’p’,"coeff");
den=poly([4 5 1],’p’,"coeff");
monsysteme=syslin(’c’,num,den);
nyquist(monsysteme)
1. si le gain k est > 1/2 (c’est pour ω = 0 que l’on a le gain maximum), le lieu de Nyquist tourne une
fois, dans le sens inverse, autour du point critique. Le système en BF est donc instable ;
2. Si k est < 1/2, le lieu de Nyquist ne tourne pas autour du point critique. Le système en BF est
stable ;
2(p − 2) 2(p − 2)
= 2
p2 + 5p + 4 + 2(p − 2) p + 7p
2
2 dB 0 dB −2 dB
1.5
4 dB −4 dB
1
6 dB −6 dB
0.5 −10 dB
10 dB
20 dB −20 dB
point 0
critique
−0.5
−1
−1.5
−2
−2 −1.5 −1 −0.5 0 0.5 1
4k(p−2)
Figure 7.14 – Diagramme de Nyquist de p2 +5p+4 , pour k = 1
p+1
p(p + 4)
0.1
2 0
1
0 0.001
0
−1
−2
0 0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.2
p+1
Figure 7.15 – Diagramme de Nyquist de p(p+4)
Le diagramme de Nyquist (figure 7.15 ) présente une asymptote en x = 3/16. On peut écrire :
1 p 1 3
G(p) ∼ (1 + p)(1 − + θ(p2 )) = + + θ(p)
p→0 4p 4 4p 16
3/16
0
−1
−2
p+1
Figure 7.17 – Fermeture du diagramme de Nyquist de p(p+4)
Le nombre de pôles à partie réelle positive est donné par le nombre de changements de signe des
termes de la première colonne.
Dans le cas où le tableau de Routh possède un élément nul dans la première colonne alors :
− si la ligne correspondante contient un ou plusieurs éléments non-nuls, D(p) possède au moins
une racine dans le demi-plan droit ouvert ;
− si tous les éléments de la ligne sont nuls alors :
– D(p) a au moins une paire de racines imaginaires pures,
– ou D(p) possède une paire de racines réelles de signes opposés,
– ou D(p) possède quatre racines complexes conjuguées deux à deux et de parties réelles de
signes opposés deux à deux.
104 Chapitre 7 - Eléments d’automatique linéaire à temps continu
Exemple 7.4 (Moteur commandé par l’induit) Asservissement de position à l’aide d’un moteur à
courant continu commandé par l’induit :
θ(p) 1 α
G(p) = ≈ ( JR
)=
V (p) Kp 1 + K2 p
p(1 + βp)
kG(p) kα
H(p) = =
1 + kG(p) βp2 + p + kα
1,5
Exemple 7.5 (Marges de stabilité) Considérons G(p) = p2 +0,5p+1 (figure 7.18 ).
4
0 dB
−2 dB
2 2 dB
4 dB −4 dB
1
6 dB −6 dB
10 dB −10 dB
0
−1
−2
−3
−4
−1.5 −1 −0.5 0 0.5 1 1.5 2
− critères temporels en général définis pour une réponse indicielle : temps de réponse, dépassement,
retards, etc. A ces critères sont reliés les notions d’erreurs de position, vitesse, etc.
− proportionnel-dérivé (PD) :
( )
τd p
K(p) = k 1 + (7.10)
1 + τNd p
avec pour forme standard :
1 + aτ p
K(p) = ka (7.11)
1 + τp
avec a > 1, ka > 0, τ > 0.
Utilisation du gain
Examinons la réponse indicielle en faisant varier la valeur de k (figure 7.19 ).
Un gain élevé donne une réponse plus rapide mais avec beaucoup d’oscillations.
1.6
1.2
0.8
0.4
0
0 5 10 15 (s)
20
15
10
5
0
60
30
0
(rad/s)
Exercice 7.2 (Paramètres du compensateur PD) (indications p. 154) Justifier toutes les valeurs et
relations que l’on vient de donner.
En pratique on essaie plusieurs valeurs pour ωm en examinant par exemple la réponse à un échelon
comme critère.
60
40 système
20
système + compensateur
0
compensateur
−20
−40
50
compensateur
0
−50
−100 système + compensateur
système
−150
−200
25
système
20
15
10
−5
−10
système + compensateur
−15
1.4
système
1.2
0.8
système + compensateur
0.6
0.4
0.2
0
0 5 10 15 20 25
intégral :
1 + τp
K(p) = kr
τp
clear, clf
wn=1; z=[.1 .3 .5 sqrt(2)/2 1 2];
t=linspace(0,14,100);
for k=1:length(z)
dcof=[wn*wn,2*z(k)*wn,1];
den=poly(dcof,’s’,"coeff");
ncof=wn*wn;
num=poly(ncof,’s’,"coeff")
monsysteme=syslin(’c’,num,den);
y=csim(’step’,t,monsysteme);
plot(t,y)
h=gca(); h.grid=[1 1];
end
!lss A B C D X0 dt !
monsys(2) = A matrix =
0. 1.
- 1. - 0.2
monsys(3) = B matrix =
0.
1.
monsys(4) = C matrix =
1. 0.
monsys(5) = D matrix =
0.
0.
0.
monsys(7) = Time domain =
[]
- 0.2 - 1.
1. 0.
1. 0.
B =
Telecom-ParisTech – GB 109
0.
1.
A =
0. 1.
- 1. - 0.2
110 Chapitre 7 - Eléments d’automatique linéaire à temps continu
Chapitre 8
Résolution d’équations
Ecrire un programme calculant les racines - données par myrts – de ce polynôme, à l’aide de la méthode
de Newton.
111
112 Chapitre 8 - Résolution d’équations
Le principe du calcul est le suivant : on se donne une valeur initiale z = x0 + jy0 . On fait ensuite
varier z de ∆z = ∆x + j∆y, ∆x et ∆y étant fournis par les formules de Newton pour faire en sorte que
le P (z) se rapproche de l’origine (figure 8.2 ). Le test d’arrêt est donné par |∆x| + |∆y| < ε.
1. Au cours du calcul z n est évalué par récurrence. On pose z n = (x + jy)n = Xn + jYn et les Xn et
Yn sont obtenus par :
∑D ∑D ∑D
2. On note P (z) = U + jV = n=0 a(n)z n = n=0 a(n)Xn + j n=0 a(n)Yn et :
∂U ∑D
∂V ∂V ∑D
∂U
= na(n)Xn−1 = et = na(n)Yn−1 = − (8.3)
∂x n=1
∂y ∂x n=1
∂y
∂U ∂U ∂V ∂V
−U = ∆x + ∆y et −V = ∆x + ∆y
∂x ∂y ∂x ∂y
U ∂U
∂x + V ∂x
∂V
U ∂V − V ∂U
∆x = − ( ) 2 ( )2 et ∆y = ( ∂x)
∂x
( ∂V )2 (8.4)
∂U ∂U 2
∂x + ∂V
∂x ∂x + ∂x
Sa solution par fsolve dans sa version la plus simple est donnée par :
Telecom-ParisTech – GB 113
// ----- testsolve01.sce
// avec estimation du jacobien
deff(’[y]=mysyst(x)’,’y=[x(1)^2 - x(1)*x(2)/2 - 1; x(1)*x(2)+2* x(2)^2-2]’);
[xsol,v]=fsolve([20;20],mysyst);
disp(xsol) // solution
disp(v) // verification (v=mysyst(xsol))
disp(info) // code d’arret
Le vecteur solution est xsol. Le jacobien utilisé dans la résolution est estimé. Il peut être donné dans
l’appel à fsolve :
[ ]
2x1 − x22 − x21
J= (8.6)
x2 x1 + 4x2
// ----- testsolve02.sce
// avec jacobien
deff(’[y]=mysyst(x)’,’y=[x(1)^2 - x(1)*x(2)/2 - 1; x(1)*x(2)+2* x(2)^2-2]’);
deff(’[y]=msjac(x)’,’y=[2*x(1)-x(2)/2, -x(1)/2 ; x(2), x(1)+4*x(2)]’);
[xsol,v,info]=fsolve([20;20],mysyst,msjac);
disp(xsol), // solution
disp(v), // verification
1
G(p) = (8.7)
1 + τp
On peut utiliser la fonction bilin ou, plus simplement, la fonction cls2dls de la façon suivante :
//===== tpsc2tpsd.sce
// simulation ar passage temps continu --> temps discret
function [myentr,etat]=f(t)
f0=0.5; y=sin(2*%pi*f0*t);
myentr=sign(y);
endfunction
// systeme lineaire
p=poly(0,’p’); num=1; tau=0.6; den=1+tau * p;
mysys=syslin(’c’,num,den); // systeme lin. temps continu
// systeme lineaire temps discret
T=.03; t=(0:T:7);
mysysd=cls2dls(tf2ss(num/den),T); //representation d’état
[D,N,P]=ss2tf(mysysd); // forme fonction de transfert
num=coeff(D*P+N); num=num($:-1:1);
den=coeff(P); den=den($:-1:1);
y=filter(num,den,myentr);
clf, plot(t,y), set(gca(),’grid’,[1 1])
On pourra constater que cette méthode est moins satisfaisante – du moins lorsqu’on fait des simulations
– que celle utilisant csim ou ode dès qu’il y a des discontinuïtés (on applique ici un signal « créneau »,
comme pour l’exemple qui suit).
Exemple 8.2 (Utilisation de la fonction csim) On applique à l’entrée d’un filtre RC un signal « cré-
neau » et on désire en afficher la sortie. La fonction de transfert du filtre est
1 1
G(p) = = (8.8)
1 + RCp 1 + τp
//===== repcren.sce
function [myentr,etat]=f(t)
f0=0.5; y=sin(2*%pi*f0*t);
myentr=sign(y);
endfunction
// systeme lineaire
p=poly(0,’p’); num=1; tau=0.6; den=1+tau * p;
mysys=syslin(’c’,num,den); // systeme lin. temps continu
// simulation
t=(0:.03:7);
etat0=sqrt(tau)/2; // y/etat=sqrt(1/tau)
[y,etat]=csim(f,t,mysys,etat0);
// traces
//clf
myentr=f(t); plot(t,myentr,’r’,t,y)
a=gca(); a.grid=[1 1];
0.8
0.6
0.4
0.2
−0.2
−0.4
−0.6
−0.8
−1
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7
Dans le programme on a défini un état initial qui donne une sortie y0 égale à 1/2 à l’instant initial. Ici
on a un premier ordre et l’obtention du scalaire liant la sortie à l’état peut être fait de la façon suivante :
√
est obtenue en définissant l’état par x(t) = τ y(t).
Telecom-ParisTech – GB 115
avec a, b, c et d > 0.
// ----- testode05.sce
// points fixes [0;0] et [c/d;a/b] (omeg^2=ac)
a=1; b=1; c=1; d=1;
function xdot=f(t, x), xdot(1)=a*x(1)-b*x(1)*x(2); xdot(2)=-c*x(2)+d*x(1)*x(2); endfunction
xinit=[3/2 1.1 1.1 1 1;3 1.3 1.1 2 4];
t0=0; t=[0:0.1:2.35*%pi];
for k=1:5
x0=xinit(:,k);
y=ode(x0,t0,t,f);
plot(y(1,:),y(2,:))
end
a=gca(); a.data_bounds=[0,0;4.5,4.5]; a.grid=[1 1];
4.5
3.5
2.5
1.5
0.5
0
0 0.5 1.5 2.5 3.5 4.5
//===== RK4.sce
function ydot=f(t, y),ydot=y^2-y*sin(t)+cos(t),endfunction
t=[0:h:%pi]; Lt=length(t);
y0=0; t0=0; h=0.1; t=0:h:%pi;
y=ode(’rk’,y0,t0,t1,f)
subplot(211), plot(t,y); set(gca(),’grid’,[1 1])
y1=y;
//===== resolution par RK4 standard
hs2=h/2; hs6=h/6;
y(1)=y0;
for k=1:Lt-1
k1=f(t(k),y(k));
k2=f(t(k)+hs2,y(k)+hs2*k1);
116 Chapitre 8 - Résolution d’équations
k3=f(t(k)+hs2,y(k)+hs2*k2);
k4=f(t(k)+h,y(k)+h*k3);
// on pondere les pentes estimees
y(k+1)=y(k)+(k1+2*k2+2*k3+k4)*hs6;
end
plot(t,y,’r’)
y2=y;
//===== resolution par RK4 - regle des 3/8
y(1)=y0; hs3=h/3; dhs3=2*hs3; hs8=h/8;
for k=1:Lt-1
k1=f(t(k),y(k));
k2=f(t(k)+hs3,y(k)+k1*hs3);
k3=f(t(k)+dhs3,y(k)-k1*hs3+k2*h);
k4=f(t(k)+h,y(k)+k1*h-k2*h+k3*h);
// on pondere les pentes estimees
y(k+1)=y(k)+(k1+3*k2+3*k3+k4)*hs8;
end
plot(t,y,’o’)
subplot(212), plot(y1’-y2’), plot(y1’-y’,’r’);
set(gca(),’grid’,[1 1])
title(’Ecart par rapport à ode de Scilab: bleu RK4, rouge RK4(3/8)’)
Chapitre 9
Les extensions
Scilab propose plusieurs façons de construire des fonctions écrites en d’autres langages (« C », Fortran,
« C++ », Java). Ces fonctions peuvent être appelées à partir de programmes selon plusieurs méthodes.
Matlab propose ce même type d’extension, avec les .mex.
Nous allons dans ce qui suit décrire les plus simples de ces méthodes.
export PATH=/usr/bin:$PATH
3. Pour plus de clarté on crée un répertoire, ishigami, dans lequel on range la fonction en « C » :
#include <math.h>
void ishigami(int *nx, double *x, int *np, double *p, int *ny , double *y)
{
double a,b,s1,s2;
a = p[0]; b = p[1];
117
118 Chapitre 9 - Les extensions
s1 = sin(x[0]); s2 = sin(x[1]);
y[0] = s1 + a * s2 * s2 + b * x[2] * x[2] * x[2] * x[2] * s1;
}
4. puis la fonction Scilab d’appel ishigami.sci de la fonction précédente à l’aide d’un call :
function y = ishigami(x,p)
nx = size(x,"c");
np = size(p,"c");
ny = 1;
y = call("ishigami",nx ,1,"i",x ,2,"d",np ,3,"i" ,..
p ,4,"d",ny ,5,"i","out" ,[1,ny],6,"d");
endfunction
-->ilib_for_link("ishigami","ishigami.c",[],"c");
Génère un fichier loader
Génère un Makefile
ilib_gen_Make : Configure : Génère le Makefile.
ilib_gen_Make : Copie les fichiers de compilation (Makefile*, libtool...) vers TMPDIR
ilib_gen_Make : Copie ishigami.c vers TMPDIR
ilib_gen_Make : Modification du Makefile dans TMPDIR.
Exécute le Makefile
Génère un fichier cleaner
!loader.sce !
!libishigami.dylib !
!ishigami.sci !
!ishigami.c !
!cleaner.sce !
// This file is released under the 3-clause BSD license. See COPYING-BSD.
// Generated by builder.sce : Please, do not edit this file
// ----------------------------------------------------------------------------
//
ishigami_path = get_absolute_file_path(’loader.sce’);
//
// ulink previous function with same name
[bOK, ilib] = c_link(’ishigami’);
if bOK then
ulink(ilib);
end
//
link(ishigami_path + ’libishigami’ + getdynlibext(), [’ishigami’],’c’);
// remove temp. variables on stack
clear ishigami_path;
clear bOK;
clear ilib;
// ----------------------------------------------------------------------------
13.44513863477450144046
8. Un certain nombre de problèmes peuvent surgir lors de cette manipulation. En dehors des erreurs
habituelles de langage, il peut y avoir quelques difficultés avec les chemins d’accès définis dans $PATH
et avec les librairies installées pour la création des bibliothèques dynamiques. Ainsi, sur Mac OS
X, l’outil Xcode est maintenant installé dans le répertoire /Developer et les différentes librairies
et déclarations utiles dans des frameworks. Les chemins d’accès aux compilateurs, déclarations et
autres bibliothèques sont donc légèrement différents de ceux d’Unix et peuvent causer quelques
soucis...
#define __USE_DEPRECATED_STACK_FUNCTIONS__
# include "stdlib.h"
# include "stack-c.h"
# include "api_scilab.h"
(1). http://forge.scilab.org/index.php/p/docsciextensions/timeline/all/
120 Chapitre 9 - Les extensions
# include "Scierror.h"
# include "localization.h"
// recuperation et verification des arguments
int sci_ishigami(char *fname);
void ishigami(int *nx,double *x,int *np,double *p,int *ny,double *y);
// y = ishigami ( x , p )
// Computes the Ishigami function
int sci_ishigami(char *fname) {
double *x;
double *p;
double *y;
int nRowsX,nColsX;
int nRowsP,nColsP;
int nRowsY,nColsY;
SciErr sciErr;
int *piAddr = NULL;
int iType = 0;
CheckRhs(2,2) ;
CheckLhs(0,1) ;
// Get 1st argument : x
sciErr = getVarAddressFromPosition(pvApiCtx,1,&piAddr);
if(sciErr.iErr) //========== verification
{ printError(&sciErr,0);
return 0; }
sciErr = getVarType(pvApiCtx,piAddr,&iType);
if(sciErr.iErr) //========== verification
{ printError (&sciErr,0);
return 0; }
if(iType != sci_matrix) //========== verification
{ Scierror(204 ,_("%s: Wrong type for input argument #%d: Matrix expected .\n"),fname,1);
return 0; }
sciErr = getMatrixOfDouble(pvApiCtx,piAddr,&nRowsX,&nColsX,&x);
if(sciErr.iErr) //========== verification
{ printError(&sciErr,0);
return 0; }
CheckDims(1,nRowsX,nColsX,1,3);
// Get 2nd argument : p
sciErr = getVarAddressFromPosition(pvApiCtx,2,&piAddr);
if(sciErr.iErr) //========== verification
{ printError (&sciErr,0);
return 0; }
sciErr = getVarType(pvApiCtx,piAddr,&iType);
if(sciErr.iErr) //========== verification
{ printError (&sciErr,0);
return 0; }
if(iType != sci_matrix) //========== verification
{ Scierror(204,_("%s: Wrong type for input argument #%d: Matrix expected.\n"),fname,2);
return 0; }
sciErr = getMatrixOfDouble(pvApiCtx,piAddr,&nRowsP,&nColsP,&p);
if(sciErr.iErr) //========== verification
{ printError (&sciErr,0);
return 0; }
CheckDims(2,nRowsP,nColsP,1,2);
// Create output argument y in Scilab
nRowsY = 1;
nColsY = 1;
sciErr = allocMatrixOfDouble(pvApiCtx,Rhs+1,nRowsY,nColsY,&y);
if(sciErr.iErr) //========== verification
{ printError (&sciErr,0);
return 0; }
// Compute y
ishigami(&nColsX,x,&nColsP,p,&nColsY,y);
// Let Scilab know that Rhs + 1 is the 1st (and only) output argument
LhsVar (1) = Rhs+1;
Telecom-ParisTech – GB 121
return 0;
}
// traitement effectif
void ishigami(int *nx,double *x,int *np,double *p,int *ny,double *y)
{
double a, b, s1 , s2;
a = p [0];
b = p [1];
s1=sin(x [0]);
s2=sin(x [1]);
y[0] = s1 + a*s2*s2 + b*x [2]* x [2]* x [2]* x [2]* s1;
}
gateway_path = get_absolute_file_path("builder.sce");
libname = "ishigamigateway";
namelist = ["ishigami" "sci_ishigami"];
files = ["sci_ishigami.c"];
ldflags = ""; cflags = "";
libs = [];
tbx_build_gateway(libname,namelist,files,gateway_path,libs,ldflags,cflags);
clear tbx_build_gateway;
-->gateway_path = get_absolute_file_path("builder.sce");
-->libname = "ishigamigateway";
-->files = ["sci_ishigami.c"];
-->libs = [];
-->tbx_build_gateway(libname,namelist,files,gateway_path,libs,ldflags,cflags);
Génère un fichier gateway
Génère un fichier loader
Génère un Makefile
ilib_gen_Make : Copie les fichiers de compilation (Makefile*, libtool...) vers TMPDIR
ilib_gen_Make : Copie libishigamigateway.c vers TMPDIR
ilib_gen_Make : Copie sci_ishigami.c vers TMPDIR
ilib_gen_Make : Modification du Makefile dans TMPDIR.
Exécute le makefile
Génère un fichier cleaner
-->clear tbx_build_gateway;
-->TMPDIR
TMPDIR =
/private/var/folders/T3/T3uNZ+-NF74VI8zuXVInHk+++TQ/-Tmp-/SCI_TMP_774_QwujBr
122 Chapitre 9 - Les extensions
-->exec loader.sce;
-->x = [1 2 3]; p = [7. 0.1];
-->y = ishigami(x,p)
-->exec loader.sce;
Bibliothèque partagée chargée.
Édition de liens effectuée.
-->exec loader.sce;
Bibliothèque partagée chargée.
Édition de liens effectuée.
-->x = [1 2 3]; p = [7. 0.1];
-->y = ishigami(x,p)
y =
13.445139
#include <api_scilab.h>
return 0;
}
On commence par tester le nombre de paramètres. En cas d’erreur le contrôle est rendu à Scilab.
Les appels :
remplacent CheckLhs et CheckRhs qui sont maintenant obsolètes (fonctions utilisées dans l’exemple
précédent).
2. On crée dans le dossier tstdatatype un dossier destiné à recevoir les fonctions que l’on construit à
l’aide de l’API. Celui-ci est nommé sci_gateway/c/ et on enregistre la fonction sci_mafonction.c
construite. Cette dernière teste, partiellement, le type de la donnée fournie en paramètre.
#include "api_scilab.h"
sciprint("\n\n");
sciprint("\tType: ");
switch(iType)
{
case sci_matrix :
sciprint("double\n");
break;
case sci_ints :
{
char pstSigned[] = "signed";
char pstUnsigned[] = "unsigned";
char* pstSign = pstSigned;
int iPrec = 0;
printError(&sciErr, 0);
return 0;
}
if(isVarComplex(pvApiCtx, piAddr))
{
sciprint("\tComplex: Yes\n");
}
sciprint("\tDimensions: ");
if(isVarMatrixType(pvApiCtx, piAddr))
{
sciErr = getVarDimension(pvApiCtx, piAddr, &iRows, &iCols);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
sciprint("%d x %d", iRows, iCols);
}
return 0;
}
files=["sci_mafonction.c"];
WITHOUT_AUTO_PUTLHSVAR = %t;
ilib_build(’build_lib’,[’mafonction’,’sci_mafonction’],files,[]);
-->files=["sci_mafonction.c"];
-->WITHOUT_AUTO_PUTLHSVAR = %t;
-->ilib_build(’build_lib’,[’mafonction’,’sci\_mafonction’],files,[]);
Génère un fichier gateway
Génère un fichier loader
Génère un Makefile
ilib_gen_Make : Copie les fichiers de compilation (Makefile*, libtool...) vers TMPDIR
ilib_gen_Make : Copie libbuild_lib.c vers TMPDIR
ilib_gen_Make : Copie sci_mafonction.c vers TMPDIR
ilib_gen_Make : Modification du Makefile dans TMPDIR.
Exécute le makefile
Génère un fichier cleaner
4. On charge ensuite la librairie dynamique contenant la fonction à l’aide du loader construit par
ilib_for_link.
-->exec(’loader.sce’);
Telecom-ParisTech – GB 125
5. Si cela s’avère nécessaire utiliser cleaner.sce avant de relancer builder. Si l’on s’y prend mal on
peut avoir aussi à décharger la librairie libbuild_lib.dylib :
–>mafonction(2);
Type: double
Dimensions: 1 x 1
–>mafonction(’chaine’);
Type: strings
Dimensions: 1 x 1
126 Chapitre 9 - Les extensions
Chapitre 10
Exercices divers
10.1 Divers
Exercice 10.1 (Projection sur un écran) (indications p. 154)
Le problème posé est celui de la représentation d’un objet « 3D » sur un écran. L’idée de départ consiste à
« projeter » l’objet sur un écran placé entre celui-ci et l’œil de l’observateur (figure 10.1 ).
P O
y
C Dr
x
Ds
On choisit un système de référence et on suppose que l’écran est orthogonal à l’axe des x. Etant donné
un point M (xM , yM , zM ), le point projeté sur l’écran est P (xP , yP , zP ), avec xP = Dr − Ds . L’œil C de
l’observateur est en (Dr , 0, 0). On définit δ :
Ds
δ= ⇒ yP = δ × yM , zP = δ × zM
Dr − xM
Application : on considère un objet 3D défini par la fonction newimg. Celle-ci définit un filtre désigné
par DoG (Difference of Gaussians).
function [tx,ty,tz,xx,yy]=newimg()
ty = linspace (-8, 8, 21)’; tx = ty;
[xx, yy] = meshgrid (tx,ty);
zz=(-xx .^ 2 - yy .^ 2);
tz = exp(zz/4)/4-exp(zz/10)/10; // (DoG)
tz=40*tz;
endfunction
127
128 Chapitre 10 - Exercices divers
On ne cherche pas à obtenir une vue réaliste de l’objet. On se contentera de projeter les points qui le
définissent sans se soucier des « facettes » qui peuvent le composer.
1. Ecrire une fonction qui projette l’objet défini sur l’écran (figure 10.2 ). On prendra Dr = 20 et Ds = 12.
Son synopsis est le suivant :
function [pos2D,lm]=projconique(Ds,Dr,tb3N)
//!==================================================!
//! Dr = distance object reference origin - observer !
//! Ds = distance from the screen to the observer !
//! tb3N = array(3,1:N) [[x1;y1;z1],...,[xN;yN;zN]] !
//!==================================================!
y
x
Dr
Ds
function vxp=rotx(vp,phix)
//!=========================================!
//! phix = rotation around x-axis (degrees) !
//! vp=(3,N)-matrix, vxp=(3,N)-matrix !
//!=========================================!
3. Ecrire un programme qui déplace l’objet 3D (rotation et translation) et projette son image sur l’écran.
10.2 Communications
Exercice 10.2 (Codage/décodage sur un canal de communication (indications p. 157))
Un canal de communication peut être représenté de façon très simplifiée par le schéma de la figure 10.3 . Le
Telecom-ParisTech – GB 129
codage de chaque symbole binaire bk donne un vecteur binaire sk émis sous forme de symboles +1 et −1 (s̃k ).
Au cours de la transmission ces symboles sont soumis à des perturbations modélisées par un bruit additif, nk .
+
+
Les bits reçus r̃k , remis en forme, sont transmis au décodeur pour correction des erreurs éventuelles... si
possible.
Considérons le codeur schématisé figure 10.4 . Ce codeur est dit convolutionnel car il réalise, pour chaque
suite {sk (n)}, k = 1, 2, 3 la convolution de la suite bn par une suite {gk (n)}. Ici, {g0 (n)} = {1, 0, 0},
{g1 (n)} = {1, 0, 1} et {g2 (n)} = {1, 1, 1}.
Le « train » de bits émis est de la forme {..., s2 (n − 1), s1 (n − 1), s0 (n − 1), s2 (n), s1 (n), s0 (n), ...}. Le
fonctionnement du codeur peut être représenté, entre autres, par un graphe d’état (figure 10.5 ).
bn-1bn-2 bnbn-1
bn/s2s1s0
bn/s2s1s0 00 0/000 00
0/000 1/111 1/111
00 10
10 0/110 10
1/011
0/100 1/001 1/001
1/011 0/110
1/101 11 01 11 1/101 11
0/010 0/100
0/010
01 01
A chaque bit bn est associé un vecteur de trois bits s0 (n), s1 (n) et s2 (n). On a donc introduit de la
redondance pour pouvoir éventuellement corriger la suite reçue. On a quatre états dont on a choisi le codage
pour simplifier la programmation.
La séquence reçue est constituée de blocs de trois bits. Notons b(n|k) le bit reconstruit à l’instant n
connaissant les bits reçus r0 (k), r1 (k) et r2 (k). On peut écrire :
bn|n = r0 (n)
b = r1 (n) + r2 (n)
n−1|n
bn−2|n = r0 (n) + r1 (n)
130 Chapitre 10 - Exercices divers
bn+1|n+1 = r0 (n + 1)
b = r1 (n + 1) + r2 (n + 1)
n|n+1
bn−1|n+1 = r0 (n + 1) + r1 (n + 1)
bn+2|n+2 = r0 (n + 2)
b = r1 (n + 2) + r2 (n + 2)
n+1|n+2
bn|n+2 = r0 (n + 2) + r1 (n + 2)
fonction majorité
1. Ecrire un programme qui effectue la simulation du codeur décrit précédemment. On prendra une suite
aléatoire de bits {bk } engendrée par la fonction grand. Cette suite est ensuite codée. La suite d’entrée
et la suite résultante {sk } seront rangées dans un fichier appelé codedseq.sod.
2. Ecrire un programme qui « bruite » la suite {sk } (on choisira un taux d’erreur de l’ordre du 1 à 2 %)
puis effectue le décodage tel que décrit précédemment. Comparer les suites d’entrée et reconstruite.
Exercice 10.3 (Algorithme de Viterbi (indications p. 159)) Reprenons le codeur de l’exercice 10.2.
Partant de l’état (00), avec une suite d’entrée 0 1 1 0 1, on obtient une séquence émise 000 111 011 010 001
(figure 10.7 ).
0 1 1 0 1
a1a2 b0a1 b1b0 b2b1 b3b2 b4b3
r2r1r0
00 000 00 000 00 000 00 000 00 000 00
110 110 110
En pratique, lorsque les séquences à coder sont très longues, on traite ces dernières par blocs. Ainsi, dans
le cas de la transmission de voix dans les téléphones utilisant la norme GSM (utilisée en particulier sur les
premiers téléphones portables), la taille des blocs est de 189 bits.
Supposons que la suite reçue soit 000 110 111 010 000 (correspondant au vecteur d’erreur 000 001 100
000 001). Partant de l’état initial que l’on s’est donné, on marque les états avec la distance de Hamming
minimale entre l’état courant et l’état initial et avec l’état précédent sur le chemin le plus court. Considérons
la figure 10.8 . On a noté A, B C, D les quatre états du codeur.
Telecom-ParisTech – GB 131
triplets reçus
a1a2 b0a1 b1b0 b2b1 b3b2 b4b3
000 110 111 010 000
A 00 000 00 000 00 000 00 000 00 000 00
r2r1r0
(0,A) (2,A) 110 (5,A) 110 (4,B) 110 (4,A)
B 111 111 01 111 01 111 01 111 01
(4,C) 001 (3,C) 001 (2,D) 001 (4,D)
100 100 100 100
C 10 10 010 10 010 10 010 10
(3,A) 011 (1,A) 011 (2,A) 011 (5,B) 011 (3,B)
D 11 101 11 101 11 101 11
(5,C) (2,C) (3,C) (5,D)
Partant de (0, 0), la distance entre le triplet reçu et le triplet porté sur la treillis est de 0 sur le chemin de
A à A et 3 sur le chemin de A à C. L’état précédent sur le chemin le plus court est A. On marque donc les
deux états A et C au deuxième pas avec (0, A) et (3, A) respectivement. On recommence au pas suivant. Le
triplet reçu est 110. On augmente les distances A → A de 2, A → C de 1, C → B de 1 et C → D de 2.
Les distances deviennent donc 2, 4, 1, 5 et l’état précédent sur le plus court chemin A, C, A, C. On itère le
procédé jusqu’à la fin de la séquence.
Arrivés au terme du traitement, tous les états du treillis sont marqués. On choisit au dernier pas l’état
dont la distance à l’état initial est le plus court (distance donnant le nombre d’erreurs trouvées) et il suffit de
remonter jusqu’à l’état initial en utilisant le marquage. On reconnait là un algorithme de recherche de plus
court chemin dans un graphe orienté.
Ecrire un programme effectuant une simulation du décodage de Viterbi tel que décrit dans ce paragraphe.
Ns
I≈ (ymax − ymin )(xmax − xmin ) + ymin (xmax − xmin ) (10.2)
N
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0 0,5 1 1,5 2 2,5 3 3,5 4
Ith=5*(xmax-xmin)-(xmax^2-xmin^2)-(xmax^3-xmin^3)/3+(xmax^4-xmin^4)/8;
plot(x,px,’k’), set(gca(),’grid’,[1 1])
ymin=min(px); ymax=max(px);
plot([0 4],[ymin ymin],’-r’,[0 4],[ymax ymax],’-r’)
db=get(gca(),’data_bounds’); // = [0,-4;4,13]
plot([xmin xmin],[0 db(2,2)],’-r’)
plot([xmax xmax],[0 db(2,2)],’-r’)
//===== tirages
N=10000;
U=[xmin+(xmax-xmin)*grand(1,N,"def"); ymin+(ymax-ymin)*grand(1,N,"def")];
if verbose, plot(U(1,:),U(2,:),’.b’), end
x=U(1,:); px=myfuncx(x); y=U(2,:);
idx=find(y <= px); Ns=length(idx);
I=(Ns/N*(ymax-ymin)+ymin)*(xmax-xmin);
str=msprintf("Valeur = %10.7f, pour %10.7f",I,Ith)
disp(str)
Il y a une incertitude quant aux valeurs exactes de ymin , ymax , xmin et xmax (à cause du pas de calcul
pour la fonction et des erreurs, faibles, introduites dans le codage des valeurs).
La loi des grands nombres dit que, étant donné une suite {Yi } i.i.d., on a :
∫
1 ∑ n→∞
n +∞
Yi −→ E {Y1 } = yp(y)dy (10.7)
n i=1 −∞
Ici on fait un tirage d’une suite {ξi } i.i.d. et on suppose Yi = f (ξi ). On peut écrire :
∫ +∞
1 ∑
{ξi } → I = f (x)p(x)dx ≈ f (ξi ) (10.8)
−∞ N i
La procédure d’acceptation rejet permet de tirer les échantillons d’une loi donnée en utilisant une
loi auxiliaire. Cette méthode peut s’avérer plus efficace que le tirage direct à partir de la distribution
donnée. Une alternative est l’échantillonnage d’importance (IS pour Importance Sampling) qui effectue
un tirage suivant une loi auxiliaire et affecte des poids dépendant de la loi recherchée. Un avantage de
l’IS est que les échantillons de la distribution auxiliaire (on dit aussi instrumentale) peuvent être utilisés
pour différentes lois-cible.
Paradoxalement il peut ne pas être optimal de tirer les échantillons sous la vraie distribution. Nous
allons le voir dans la suite.
function myboxplot(x,w)
x=gsort(x,’g’,’i’);
Lx=length(x); Q=round(Lx/4);
xm=median(x); [m,k]=min(abs(x-xm));
xLQ=x(max(1,k-Q)); xHQ=x(min(Lx,k+Q));
wH=xHQ + w*(xHQ - xLQ); wL=xLQ - w*(xHQ - xLQ);
plot([-1 +1],[xm xm],’r’)
plot([-4 +4],[xLQ xLQ],’:r’,[-1 +1],[xLQ xLQ],’b’)
plot([-4 +4],[xHQ xHQ],’:r’,[-1 +1],[xHQ xHQ],’b’)
plot([-1 -1],[xLQ xHQ],’b’,[1 1],[xLQ xHQ],’b’)
plot([-.5 +.5],[wH wH],’b’,[-.5 .5],[wL wL],’b’)
plot([0,0],[xHQ,wH],’b’,[0,0],[xLQ,wL],’b’)
plot([-4 +4],[wH wH],’:r’,[-4 +4],[wL wL],’:r’)
idxH=find(x>wH); idxL=find(x<wL);
if ~isempty(idxH), plot(zeros(1:length(idxH)),x(idxH),’xr’), end
if ~isempty(idxL), plot(zeros(1:length(idxL)),x(idxL),’xr’), end
set(gca(),’auto_ticks’,[’off’,’on’])
endfunction
Ecrire un programme qui met en œuvre ce dernier calcul. Comparer avec la méthode de Monte-Carlo
directe (utiliser la fonction myboxplot).
∂ 2 y(t, x) 1 ∂ 2 y(t, x)
2
= 2 (équation de d’Alembert) (10.13)
∂x c ∂t2
où 1/c2 = ρ/T avec ρ la masse linéïque et T une constante de tension. On suppose que les points évoluent
selon l’axe y seulement.
→
− −
→
Figure 10.10 – Chaque élément de corde est soumis aux forces T 1 et T 2
L’équation 10.13 peut être retrouvée de la façon suivante : comme il n’y a pas de mouvement selon
x, |T1 cos(α)| = |T2 cos(β)| = T . Selon y, le bilan des forces s’écrit :
∂ 2 y(t, x)
T2 sin(β) − T1 cos(α) = ρ∆x
∂t2
2
T2 sin(β) T1 cos(α) ρ∆x ∂ y(t, x)
⇒ − =
T T T ∂t2
ρ∆x ∂ 2 y(t, x)
⇒ tan(β) − tan(α) = (10.14)
T ∂t2
Telecom-ParisTech – GB 135
tan(β) − tan(α) apparaît comme la variation de la tangente ∂y/∂x entre x et x + ∆x, soit :
∂2y
tan(β) − tan(α) = ∆x (10.15)
∂x2
d’où l’équation 10.13.
La solution de cette équation est somme d’une onde yg (t, x) « se déplaçant » vers la « gauche » et
d’une onde yd (t, x) « se déplaçant » vers la « droite ». Ces deux ondes se déplacent à la vitesse c :
( x) ( x)
y(t, x) = yg t − + yd t + (10.16)
c c
On peut en effet vérifier que le changement de variable α = t − x
c et β = t + x
c conduit à l’équation :
∂ 2 yα,β ∂yα,β
= 0 ⇒ = cte = g(β)
∂α∂β ∂β
( x) ( x)
⇒ yα,β = G(β) + D(α) = yg t − + yd t +
c c
10
8
4
2
0
−2
−4
−0.3 −0.2 −0.1 0 0.1 0.2 0.3
L’onde de départ se partage en deux ondes identiques yd et yg . Le terme « DoG » signifie « différence de
gaussiennes ». Dans le cadre du traitement d’image un filtrage DoG est de type passe-bas, mais préserve mieux
les transitions qu’un filtre passe-bas simple.
136 Chapitre 10 - Exercices divers
Annexes
Définition A.1 Une v.a. X est dite discrète si l’ensemble des valeurs possibles est au plus dénombrable.
Si on note {a0 , . . . , an , . . .}, où n ∈ N, l’ensemble de ces valeurs, la loi de X est caractérisée par la
suite :
pX (n) = P {X = an } (A.1)
qui représente la probabilité pour que X soit égale à l’élément an . Ces valeurs vérifient 0 ≤ pX (n) ≤ 1 et
∑
n≥0 pX (n) = 1. On en déduit la probabilité pour que la v.a. X soit comprise entre a et b :
∑ ∑
P {X ∈]a, b]} = pX (n) = pX (n)1(an ∈]a, b])
n∈I n≥0
où I est l’ensemble des indices n tels que an soit compris entre a et b, ce qui s’écrit I = {n ≥
0 tel que an ∈]a, b]}. La fonction définie pour tout x ∈ R par :
∑
FX (x) = P {X ≤ x} = pX (n) (A.2)
{n:an ≤x}
est appelée la fonction de répartition de la v.a. X. Elle est monotone croissante et vérifie FX (−∞) = 0
et FX (+∞) = 1. Elle se présente (voir figure A.1) comme une fonction en « marches d’escalier » dont
les sauts, situés aux points d’abscisse an , ont une hauteur égale à l’amplitude pX (n).
Définition A.2 soit X et Y deux v.a. discrètes à valeurs dans {a0 . . . an . . . } et {b0 . . . bk . . . } respec-
tivement. La loi de probabilité conjointe est donnée par la suite des quantités positives :
137
138 Annexes
FX(x)
1
U
pX(2)
pX(1)
pX(0) x
a0 a1 0 a2 a3
Propriété A.1 Soit X et Y deux v.a. discrètes à valeurs respectivement dans {a0 . . . an . . .} et
{b0 . . . bk . . .} et dont la loi de probabilité conjointe est caractérisée par pXY (n, k). On a :
∑
+∞
pX (n) = P {X = an } = pXY (n, k) (A.4)
k=0
∑
+∞
pY (k) = P {Y = bk } = pXY (n, k) (A.5)
n=0
On désigne pX (n) et pY (k) par les termes de loi marginale de X et loi marginale de Y respectivement.
Définition A.3 On dit qu’une v.a. X est continue si elle prend ses valeurs dans R et si, quels que soient
a et b, la probabilité pour X d’appartenir à l’intervalle ]a, b] s’écrit :
∫ b
P {X ∈]a, b]} = pX (x)dx (A.6)
a
∫ +∞
où pX (x) est une fonction positive ou nulle (pas nécessairement inférieure à 1) qui vérifie −∞ pX (x)dx =
1. pX (x) s’appelle la densité de probabilité de la loi de X. La fonction définie pour tout x ∈ R par :
∫ x
FX (x) = P {X ≤ x} = pX (u)du (A.7)
−∞
est appelée la fonction de répartition de la variable aléatoire X. Elle est monotone croissante et vérifie
FX (−∞) = 0 et FX (+∞) = 1. On note que pX (x) représente aussi la dérivée de FX (x) par rapport à x.
Définition A.4 soit X et Y deux v.a. à valeurs dans R × R. Elles sont dites continues si, quel que soit
le domaine ∆ de R2 , la probabilité pour le couple (X, Y ) d’appartenir à ∆ est donnée par :
∫∫
P {(X, Y ) ∈ ∆} = pXY (x, y)dxdy (A.8)
∆
Propriété A.2 Soit X et Y deux v.a. continues dont la loi de probabilité conjointe est caractérisée par
pXY (x, y). Alors les lois de X et de Y ont pour densités de probabilité marginales :
∫ +∞
pX (x) = pXY (x, y)dy (A.9)
−∞
∫ +∞
pY (y) = pXY (x, y)dx (A.10)
−∞
Telecom-ParisTech – GB 139
On désigne respectivement pX (x) et pY (y) par les termes de densités de probabilité marginale de X
et de Y .
Un cas particulier où interviennent deux v.a. réelles (X, Y ) est celui d’une v.a. complexe Z = X = jY .
On peut aussi avoir le cas mixte où l’une des deux variables aléatoires est discrète et l’autre continue,
ce qui conduit à la définition qui suit.
Définition A.5 Soit X une v.a. à valeurs dans {a0 . . . an . . .} et Y une variable aléatoire à valeurs dans
R. Alors, quels que soient an d’une part et a et b d’autre part, la probabilité :
∫ b
P {X = an , Y ∈]a, b]} = pXY (n, y)dy (A.11)
a
∑ ∫
où la fonction pXY (n, y), n ∈ {0 . . . k . . .}, y ∈ R, est positive ou nulle et vérifie n≥0 R pXY (n, y)dy = 1.
Définition A.6 On dit que les v.a. X et Y sont indépendantes si et seulement si la loi conjointe est le
produit des lois marginales. Cela s’écrit (en nous limitant aux cas précédents) :
où les lois marginales sont obtenues à partir des formules A.4, A.5, A.9 et A.10.
Insistons sur le fait que, connaissant pXY (x, y), on peut répondre à la question de savoir si X et Y
sont ou non indépendantes. Il suffit de calculer les lois marginales et de vérifier si l’on a pXY (x, y) =
pX (x)pY (y). Si c’est le cas, X et Y sont indépendantes.
De façon plus générale, on a la définition suivante :
Définition A.7 on dit que les v.a. (X1 , . . . , Xn ) sont indépendantes dans leur ensemble si et seulement
si leur loi de probabilité conjointe est le produit des lois marginales. Ceci s’écrit :
pX1 X2 ···Xn (x1 , x2 , . . . , xn ) = pX1 (x1 )pX2 (x2 ) . . . pXn (xn ) (A.12)
où les lois marginales s’obtiennent comme les intégrales de dimension (n − 1) calculées à partir de
pX1 X2 ...Xn (x1 , x2 , . . . , xn ).
En pratique le résultat qui suit nous donne le moyen de vérifier simplement l’indépendance de v.a. :
Si pX1 X2 ...Xn (x1 , x2 , . . . , xn ) est un produit de n fonctions positives de la forme f1 (x1 )f2 (x2 ) . . . fn (xn ),
alors les variables sont indépendantes.
⋆ Attention, si n v.a. sont indépendantes deux à deux, cela n’implique pas nécessairement qu’elles
soient indépendantes dans leur ensemble.
140 Annexes
∏
n
ϕX1 ···Xn (u1 , · · · , un ) = ϕXk (uk )
k=1
Notons que la fonction caractéristique {ϕXk (uk}) de la loi marginale de Xk se calcule directement à
partir de A.14. En effet on a ϕXk (uk ) = E ejuk Xk = ϕX1 ···Xn (0, · · · , 0, uk , 0, · · · , 0).
Indications : il vient :
{ }
E {X} = 0 × p0 + 1 × p1 = p1 et E X 2 = 02 × p0 + 12 × p1 = p1
puis :
enfin :
Définition A.11 on appelle moyenne de la v.a. X le moment d’ordre 1 à savoir E {X}. Si la moyenne
est nulle on dit que la v.a. est centrée. On appelle variance de la v.a. X la quantité positive définie par :
{ } { }
var (X) = E (X − E {X})2 = E X 2 − (E {X})2
Propriété A.3 Soit X une v.a. de moyenne E {X} et de variance var (X). Alors ∀δ > 0 :
Définition A.12 Soit (X, Y ) (1) deux v.a., on appelle covariance entre X et Y la quantité définie par :
On dit que X et Y ne sont pas corrélées si cov(X, Y ) = 0 soit encore E {XY ∗ } = E {X} E {Y ∗ }. On
appelle coefficient de corrélation la quantité définie par :
cov(X, Y )
ρ(X, Y ) = √ √ (A.18)
var (X) var (Y )
L’application de l’inégalité de Schwarz entraîne que −1 ≤ ρ(X, Y ) ≤ 1.
(1). Sauf cas particulier, les variables aléatoires considérées dans la suite sont réelles. Toutefois les définitions concernant
la moyenne et la covariance se généralisent sans exception en considérant une v.a. complexe et en conjuguant la deuxième
variable. C’est ce que nous indiquons par une étoile (∗) dans le cas scalaire et par l’exposant H dans le cas vectoriel.
142 Annexes
Définition A.13 Soit {X1 , . . ., Xn } n v.a. de moyennes respectives E {Xi }. On appelle vecteur moyenne
le vecteur de dimension n dont les composantes sont les moyennes E {Xi }. On appelle matrice de cova-
riance la matrice C de dimension n × n dont l’élément générateur est Cij = cov(Xi , Xj ) pour 1 ≤ i ≤ n
et 1 ≤ j ≤ n.
le vecteur aléatoire dont les n composantes sont les variables aléatoires Xk , le vecteur-moyenne s’écrit :
E {X1 }
E {X} = ...
E {Xn }
et la matrice de covariance :
{ } { }
H
C = E (X − E {X})(X − E {X})H = E XX H − E {X} E {X} (A.19)
Notons que les éléments diagonaux d’une matrice de covariance représentent les variances respectives des
n v.a. ; ils sont donc positifs. Si les n v.a. ne sont pas corrélées, leur matrice de covariance est diagonale.
Propriété A.4 Toute matrice de covariance est positive, ce qui signifie que, quel que soit le vecteur a,
on a aH Ca ≥ 0.
∑N { 2}
En effet considérons la v.a. Y = k=1 ak (Xk − E {Xk }). On a bien entendu
{ 2 } E |Y | ≥ 0 (en tant
qu’espérance mathématique d’une v.a. positive). Exprimons maintenant E |Y | . Il vient :
{N }
{ 2} ∑ ∑
N
∗ ∗
E |Y | = E ak (Xk − E {Xk }) am (Xm − E {Xm })
k=1 m=1
∑
N ∑
N
= ak E {(Xk − E {Xk })(Xm − E {Xm })∗ } a∗m
k=1 m=1
∑
N ∑
N
= ak ck,m a∗m = aH Ca ≥ 0
k=1 m=1
Propriété A.5 Soit {X1 , . . . , Xn } n v.a. de vecteur moyenne E {X} et de matrice de covariance C X et
soit {Y1 , . . . , Yq } q v.a. obtenues par la transformation linéaire :
Y1 X1
.. ..
. = A . + b
Yq Xn
où A et b sont respectivement une matrice et un vecteur non aléatoires de dimension ad hoc. Alors :
E {Y } = AE {X} + b
CY = AC X AH
La première expression est une conséquence directe de la linéarité de l’intégrale. On en déduit que
Y − E {Y } = A(X − E {X}). Etablissons la deuxième expression :
{ }
C Y = E (Y − E {Y })(Y − E {Y })H
{ }
= AE (X − E {X})(X − E {X})H AH = AC X AH
Telecom-ParisTech – GB 143
Définition A.14 Soit {X1 , . . . , Xn } n v.a.. On dit qu’elles forment une suite blanche si var (Xi ) = σ 2
et si cov(Xi , Xj ) = 0 pour i ̸= j. Leur matrice de covariance s’écrit donc :
C = σ2 I n
Propriété A.6 Si les variables aléatoires {X1 , . . . , Xn } sont indépendantes, elles ne sont pas corrélées
et donc leur matrice de covariance est diagonale. En général la réciproque est fausse.
function [x,rho,k]=jacobimethod(A,b,x0,stcr0,maxit)
//=================================================!
// [x,rho,eltime]=JACOBIMETHOD(A,b,x0,stcr0,maxit) !
// Systeme Ax+b !
// x0 = initial state !
// stcr0 = critere d’arret |x(n+1)-x(n)|>stcr0 !
// maxit = max. iteration number !
// x = solution of Ax=b !
// rho = spectral radius !
// k = loop number !
//=================================================!
n=size(A,1);
U=-triu(A,1); L=-tril(A,-1); N=U+L;
D=diag(A); Dm1=1 ./ D; Mm1=diag(Dm1);
rho=max(abs(spec(Mm1*N)));
if rho>=1 then error(’the method is not convergent’); end
//===== loop
x=x0; stcr=1; k=0;
while stcr>stcr0 & k<maxit
xp=(N*x+b).*Dm1;
stcr=max(abs(xp-x));
x=xp; k=k+1;
end
endfunction
-->[x,rho,k]=jacobimethod(A,b,x0,stcr0,maxit)
k =
53.
rho =
0.5
x =
0.
1.3333333
2.6666667
-->A*x
ans =
1.
2.
3.
La vitesse de convergence est définie par la plus grande valeur propre (en module) :
144 Annexes
-->rho=max(abs(spec(Mm1*N)));
0.11102230246252
0.22204460492503
0.22204460492503
Appel de la fonction :
Fonction :
function L=CHOfact(A,L,N0)
//===== CHOfact.sci ===========================!
// LUREC stores in L a lower triangular matrix !
// so that A=L*L^H (Cholesky factorization) !
// with A hermitian definite positive !
//=============================================!
// SYNOPSIS: L=CHOFACT(A,L,N0) !
// N0=size(A,1) !
// A = symmetric definite positive !
// L = used as an input allows !
// the recursivity (initial value []) !
// EXAMPLE: A=rand(4,4,’normal’); A=A*A.’; !
// N0=size(A,1); L=[]; !
// L=CHOfact(A,L,N0); !
//=============================================!
N=size(A,1); if N==0, return, end
Lp=zeros(N,1); Lp(1)=sqrt(A(1,1));
Lp(2:N)=A(2:N,1)/Lp(1); vec=Lp(2:N);
L=[L,[zeros(N0-N,1);Lp]];
B=A(2:N,2:N)-(vec * vec’);
L=CHOfact(B,L,N0);
endfunction
//===== opelog1.sce
N=4; // dimensions des vecteurs v1 et v2
v1=grand(N,1,"uin",0,1);
v2=grand(N,1,"uin",0,1);
x=max(v1 .* v2); // attention: ce n’est pas un produit scalaire
xlog=x==1;
disp([v1,v2]), disp(x), disp([v1==1,v2==1]), disp(xlog)
//===== opelog2.sce
N=4; // dimensions des vecteurs v1 et v2
v1=grand(N,1,"uin",0,1); v1=v1==1;
v2=grand(N,1,"uin",0,1); v2=v2==1;
x=or(v1 & v2);
disp([v1,v2]), disp(x)
3. produit de matrices :
function C=boolmatrixmul(A,B)
[nla,nca]=size(A); [nlb,ncb]=size(B);
C=zeros(nla,ncb); C=C==0;
for ml=1:nla
for mc=1:ncb
C(ml,mc)=or(A(ml,:)’ & B(:,mc));
end
end
endfunction
T F T
F F F
T T T
B =
T F
F T
T T
-->funcprot(0), getd(), C=boolmatrixmul(A,B)
ans =
1.
C =
T T
F F
T T
adb=get(gca(),’data_bounds’)+[-1,-1;1,1];
set(gca(),’data_bounds’,adb), set(gca(),’grid’,[1 1])
set(gca(),’axes_reverse’,["off","on","off"])
valc0=3; valc=pixc(cr,cc);
pixc=colorfill(pixc,cr,cc,nbr,nbc,valc,valc0,verbose,nbf);
if ~(verbose) then
disp(pixc0), disp(pixc)
//========== avec une image
scf(2);
146 Annexes
valc est la valeur lue au point cc=6; cr=3;, soit 0. Chaque zéro de la zone « connexe » est ensuite
remplacé par un « trois » (valc0).
Fonction de coloriage :
function pixcs=colorfill(pixc,cr,cc,nbr,nbc,valc,valc0,verbose,nbf)
pixc(cr,cc)=valc0; pixcs=pixc;
ng=neighbours(cr,cc,nbr,nbc);
indng=ng(:,1)+(ng(:,2)-1)*nbr; pv=pixc(indng); // pixels voisins
idx=find(pv==valc); // voisins de meme couleur
if verbose
scf(1); plot(cc,cr,’*b’), xpause(100000)
end
if isempty(idx) then return, end
for n=1:length(idx)
k=idx(n); alpha=fix((indng(k)-1)/nbr); cc=alpha+1;
cr=indng(k)-nbr*alpha;
pixcs=colorfill(pixc,cr,cc,nbr,nbc,valc,valc0,verbose,nbf);
pixc=pixcs;
end
endfunction
0
1 2 3
//===== Cpoisson.sce
clear, clf
//===== echantillon de loi uniforme
N=2000; U=rand(1,N,’uniform’); Umax=max(U);
//===== Construction fonction de repartition
a=5; pX(1)=exp(-a); // proba(X=0)
FX(1)=pX(1); k=1;
while ((FX(k)<Umax)&(k<N))
pX(k+1)=a * pX(k) / k; // calcul de pX(x)
FX(k+1)=FX(k) + pX(k+1); k=k+1;
end
nmax=k;
//===== Generation de X
X=zeros(1,N);
for n=1:nmax-1, ind=find((FX(n)<=U)&(U<FX(n+1))); X(ind)=n; end
//===== Valeurs extremes
ind=find(U<FX(1)); X(ind)=zeros(1,length(ind));
ind=find(U>=FX(nmax)); lind=length(ind);
X(ind)=nmax * ones(1,length(ind));
//===== Verification
subplot(211), plot(FX,’o’), set(gca(),’grid’,[1 1])
//===== Estimation de pX
for k=0:nmax-1, pXe(k+1)=length(find(X==k))/N; end
subplot(212), plot((0:nmax-1),pXe,’o’), set(gca(),’grid’,[1 1])
plot((0:nmax-1),pX,’:’,(0:nmax-1),pX,’xr’)
0,8
0,6
0,4
0,2
0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
0,15
0,1
0,05
0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
∫ +∞ { }
1. En intégrant par parties, on trouve E {X} = λ 0
xe−λx dx = 1/λ. De même E X 2 = 2/λ2 . Et
donc var(X) = 1/λ2 .
∫x
2. La fonction de répartition de X a pour expression u = 0 λe−λt dt = 1 − e−λx . En « inversant" on
obtient x = − log(1−u)/λ. Par conséquent la variable X = − log(1−U )/λ suit une loi exponentielle
si U suit une loi uniforme sur (0, 1). Comme U et (1 − U ) ont même loi, on peut aussi prendre tout
simplement X = − log(U )/λ.
3. Le pas lk, pour estimer la densité de probabilité, est déterminé à partir de la moyenne.
1,6
1,2
0,8
0,4
0
0 0,5 1 1,5 2 2,5 3 3,5 4 4,5 5
1. On a :
∫ +∞ ( ) ∫ +∞ ( ) √
x2 x2 x2 π
E {X} = exp − dx = exp − dx = σ
0 σ2 2σ 2 0 2σ 2 2
2. Il vient :
∫ x ( ) ( )
t t2 x2
u= exp − 2 dt = 1 − exp − 2
0 σ2 2σ 2σ
√
En résolvant par rapport √ à x, on obtient x = σ −2 log(1 − u). Par conséquent, si U suit une loi
uniforme sur (0, 1), X = σ −2 log(1 − U )√suit une loi de Rayleigh. Comme U et 1 − U ont la même
loi, il revient au même de prendre X = σ −2 log(U ).
3. Taper le programme :
//===== Crayleigh.sce
clear; clf, getd()
N=3000; U=rand(1,N); X=sqrt(-2*log(U));
//===== histogramme
Nc=20; [ni,xcc]=myhist(Nc,X,%t,%t);
//===== Loi de Rayleigh theorique
lk=(max(X)-min(X))/Nc; maxx=max(X);
pointsx=(0:lk:maxx); pth=pointsx .* exp(-pointsx .* pointsx /2);
plot(pointsx,pth,’-r’); set(gca(),’grid’,[1 1])
La figure A.5 montre la courbe théorique d’une densité de probabilité d’une loi de Rayleigh et
l’histogramme des valeurs obtenues par le générateur.
0,6
0,5
0,4
0,3
0,2
0,1
0
0 0,5 1 1,5 2 2,5 3 3,5 4
{ }
1. E {Bn } = 1 × Pr(Bn = 1) + 0 × Pr(Bn = 0) = p. De même E Bn2 = p et donc var (Bn ) = p − p2 =
p(1 − p).
2. Les variables aléatoires étant supposées indépendantes, elles sont a fortiori non corrélées et on a,
pour k ̸= n, E {Bk Bn } = E {Bk } E {Bn } = p2 .
150 Annexes
{ } 1 ∑∑ 1 ∑ { 2} 1 ∑
N N N
E S2 = 2
E {B B
n k } = 2
E Bn + 2 E {Bn Bk }
N n=1 N n=1 N
k=1 n̸=k
1 N (N − 1) 2 p(1 − p)
= p+ p = p2 +
N N2 N
{ }
En conclusion m = E {S} = p et σ 2 = var (S) = E S 2 − E2 {S} = pq/N .
4. On a successivement ε2r = 4σ 2 /m2 = 4(1−p)/N p ≃ 4/N p si on suppose que p ≪ 1, soit N ≈ 4/(pε2r ).
Pour εr = 0,1, on obtient N = 400/p.
5. Les inégalités 6.12 montrent que pour obtenir une variable aléatoire B qui suit une loi de Bernoulli
de paramètre p, à partir d’une variable aléatoire U uniforme sur (0, 1), il faut prendre B = 0 si
0 ≤ U < (1 − p) et 1 sinon. Ce résultat est obtenu, dans le programme qui suit, par l’instruction
B=(U>q) où q = 1 − p.
//===== Cbernou.sce
p=0.1; q=1-p;
epsilon=.1; N=fix(q/(p*epsilon^2));
U=rand(1,N,’uniform’); B=(U>q);
disp(mean(double(B),2))
On remarquera la conversion de type (double(B)) pour pouvoir faire le calcul de la moyenne (mean).
1. En utilisant le changement de variable indiqué Y = C−1/2 (X−m) puis, en passant aux coordonnées
polaires, il vient successivement :
∫ ( )
1 1
α = √ exp − (x − m)T C −1 (x − m) dx1 dx2
∆(s) 2π det(C) 2
∫ ( )
1 1 2
= exp − (y1 + y2 ) dy1 dy2
2
{(y1 ,y2 )∈R2 :y12 +y22 <s} 2π 2
∫ √s ∫ 2π ∫ s/2
1
e−r /2 rdrdθ = e−u du = 1 − e−s/2
2
=
2π 0 0 0
//===== Cellconf.sce
clear, getd(), clf()
N=200; alpha=0.95; s=-2*log(1-alpha); Nth=fix((1-alpha)*N);
C=[2.3659 -0.3787;-0.3787 0.6427];
y=rand(2,N,’normal’); x=sqrtm(C)*y;
//===== trace
ellipse([0 0],inv(C),s); set(gca(),’grid’,[1 1])
plot(x(1,:),x(2,:),’+’); set(gca(),’data_bounds’,[-6 -4;6 4]);
//===== affichage
normy = ones(1,2) * (y .* y);
nb=length(find(normy>s));
xstring(2,3,msprintf(’Nth=%g N=%g’,Nth,nb))
−1
−2
−3
−4
−6 −5 −4 −3 −2 −1 0 1 2 3 4 5 6
pcN = P { XN = ℓN | XN −1 = ℓN −1 } ...P { X1 = ℓ1 | X0 = ℓ0 } P {X = ℓ0 }
∏
N
= aℓ(N −1),ℓ(N ) ...aℓ(0),ℓ(1) pℓ0 (0) = pℓ0 (0) aℓ(k−1),ℓ(k)
k=1
∑
N ∑
n ∑
n
log pcN = log aℓ(k−1),ℓ(k) + log pℓ0 (0) = Nα,β log aα,β + log pℓ0 (0)
k=1 α=1 β=1
On en déduit :
N
a∗α,β = ∑n α,β
β=1 Nα,β
L’estimation de la matrice de transition revient donc à faire du comptage pour chacun des couples
(α, β). L’estimateur du maximum de vraisemblance est un estimateur par moyenne.
Le programme tstmarkov.sce effectue l’estimation de la matrice A, estimation notée Ae :
//===== tstmarkov.sce
A=[0 , 1 , 0 , 0 , 0;
3/4 , 0 , 1/4 , 0 , 0;
0 , 1/3 , 1/3 , 1/3 , 0;
1/4 , 1/4 , 1/4 , 0 , 1/4;
1/3 , 0 , 0 , 2/3 , 0];
//===== generation suite des etats
N=10001; initstate=1;
152 Annexes
Figure A.7 – Diagramme de Bode, obtenu sous Scilab, les fréquences étant
données en Hz
Les tracés des diagrammes de Bode et Nyquist peuvent être obtenus par un programme Scilab tel que
exercice.sce.
//===== exercice.sce
clear
s=poly(0,’s’);
G=[1/(s^3 + 2*s^2 - s - 2)];
monsysteme=syslin(’c’,G);
figure(0); clf(), nyquist(monsysteme)
figure(1); clf(), bode(monsysteme)
154 Annexes
√
1. ωm = 1
aτ × 1
τ = τ
1
√
a
;
1 + aτ p
K(p) = ka
1 + τp
1 − a + a + aτ p
= ka
1 + τp
( )
1−a
= ka +a
1 + τp
Lorsque p parcourt l’axe imaginaire, le lieu obtenu est un cercle. (1 − a)/(1 + τ p) est en effet un
cercle que l’on translate de a (figure A.9).
a−1 1 + sin(φmax )
sin(φmax ) = ⇒a=
a+1 1 − sin(φmax )
1√
3. Connaissant ωm et a, τ = ωm a
.
1. Projection : les valeurs minima et maxima données dans lm sont utilisées pour cadrer la projection
sur l’écran (figure A.10 obtenue par le programme tstproj3D.sce).
function [pos2D,lm]=projconique(Ds,Dr,tb3N)
//!===================================================!
//! Dr = distance object reference origin - observer !
//! Ds = distance from the screen to the observer !
//! tb3N = array(3,N) [[x1;y1;z1],...,[xN;yN;zN]] !
//! pos2D = coordonnees de la projection dans le plan !
//!===================================================!
delta=Ds ./ (Dr-tb3N(1,:,:));
pos2D = [tb3N(2,:,:) .* delta ; tb3N(3,:,:) .* delta];
minxp=min(pos2D(1,:)); maxxp=max(pos2D(1,:));
minyp=min(pos2D(2,:)); maxyp=max(pos2D(2,:));
lm=[minxp,minyp;maxxp,maxyp];
endfunction
Telecom-ParisTech – GB 155
−1
−8 −7 −6 −5 −4 −3 −2 −1 0 1 2 3 4 5 6 7 8
2. Les rotations autour des axes d’un angle φx , φy ou φz sont représentées par les trois matrices :
1 0 0 cos φy 0 sin φy cos φz − sin φz 0
Rx = 0 cos φx − sin φx , Ry = 0 1 0 , Rz = sin φz cos φz 0
0 sin φx cos φx − sin φy 0 cos φy 0 0 1
qui donnent les coordonnées des points transformés dans le système d’axes choisi.
Fonctions de rotation :
function vxp=rotx(vp,phix)
//!=========================================!
//! phix = rotation around x-axis (degrees) !
//! vp=(3,N)-matrix, vxp=(3,N)-matrix !
//!=========================================!
phix=phix * %pi / 180;
Rx=[1 0 0;...
0 cos(phix) -sin(phix);...
0 sin(phix) cos(phix)];
vxp=Rx*vp;
endfunction
function vyp=roty(vp,phiy)
//!=========================================!
//! phiy = rotation around y-axis (degrees) !
//! vp=(3,N)-matrix, vyp=(3,N)-matrix !
//!=========================================!
phiy=phiy * %pi / 180;
Ry=[cos(phiy) 0 sin(phiy);...
0 1 0;...
-sin(phiy) 0 cos(phiy)];
vyp=Ry*vp;
endfunction
function vzp=rotz(vp,phiz)
//!=========================================!
//! phiz = rotation around z-axis (degrees) !
//! vp=(3,N)-matrix, vzp=(3,N)-matrix !
//!=========================================!
phiz=phiz * %pi / 180;
Rz=[cos(phiz) -sin(phiz) 0;...
sin(phiz) cos(phiz) 0;...
0 0 1];
vzp=Rz*vp;
endfunction
//===== tstproj3D.sce
xrate=2.5; sapert=12;
//===== image manipulee
[tx,ty,tz,xx,yy]=newimg();
L=length(tx);
figure(0), surf(tx, ty, tz)
a=gca(); a.axes_reverse=["on","on","off"];
//==========
pos2D=[]; txm=max(tx); Dr=xrate*txm; Ds=sapert;
tb3=zeros(3,L,L); tb3(1,:,:)=xx; tb3(2,:,:)=yy; tb3(3,:,:)=tz;
tb3N=matrix(tb3,3,L*L);
//===== projection conique
figure(1)
[pos2D,lm]=projconique(Ds,Dr,tb3N);
hh=plot(pos2D(1,:),pos2D(2,:),’.’);
a=gca(); a.data_bounds=lm; a.grid=[1 1];
//===== translation + rotation autour de Ox
vxp=rotx(tb3N-2,30);
[pos2D]=projconique(Ds,Dr,vxp);
figure(2)
plot(pos2D(1,:),pos2D(2,:),’.’)
set(gca(),’grid’,[1 1])
−1
−2
−3
−4
−5
−6
−8 −7 −6 −5 −4 −3 −2 −1 0 1 2 3 4 5 6
1. relation de récurrence ;
yn
xn+1 = xn −
yn′
2. Programme :
// ----- exonewton.sce
function xnp1=recn(xn,mp,mpdot)
yn=horner(mp,xn);
ydotn=horner(mpdot,xn);
xnp1=xn-yn/ydotn;
endfunction
myrts=[1,sqrt(2),3]; mypol=poly(myrts,’x’);
Telecom-ParisTech – GB 157
mycoef=coeff(mypol); mdeg=length(mycoef);
mycoefd=mycoef(2:mdeg).*[1:mdeg-1];
mpoldot=poly(mycoefd,’x’,’c’)
xt=linspace(0.5,3.5);
plot(xt,horner(mypol,xt)); a=gca(); a.grid=[1 1];
//... en cours
function [xc,yc,cErr,poss,k,dv]=CalcXY(pol,x0,y0,teps,nblps,verbose)
deg=length(pol)-1; P=zeros(1,deg+1); P(:)=pol;
pp=poly(P,’z’,"coeff"); ppd=poly([1:deg] .* P(2:$),’z’,"coeff");
df=1; dv=1; poss=zeros(nblps,4);
k=1; xk=x0; yk=y0;
Pz=horner(pp,x0+%i*y0); Uk=real(Pz); Vk=imag(Pz);
if verbose then
poss(k,:)=[x0,y0,Uk,Vk];
end
while (dv>teps) & (k<nblps)
Pk=horner(ppd,xk+%i*yk); dUsdx=real(Pk); dVsdx=imag(Pk);
den2=dUsdx * dUsdx + dVsdx * dVsdx;
Dxk=-(Uk * dUsdx + Vk * dVsdx)/den2; Dyk=(Uk * dVsdx - Vk * dUsdx)/den2;
dv=abs(Dxk)+abs(Dyk);
xk=xk+Dxk; yk=yk+Dyk; // x(k+1), y(k+1)
Pz=horner(pp,xk+%i*yk); Uk=real(Pz); Vk=imag(Pz); // U(k+1), V(k+1)
k=k+1;
if verbose then poss(k,:)=[xk,yk,Uk,Vk]; end
end
xc=xk; yc=yk;
if (dv<teps) then
cErr=0; // no error
else
cErr=1; // max counter reached
end
endfunction
//===== tsttierencode.sce
clear, getd()
N=1000;
158 Annexes
y
3
2,5
2
1,5
1
0,5
0
−0,5 x
1,8 1,9 2 2,1 2,2 2,3 2,4 2,5 2,6 2,7 2,8 2,9 3 3,1 3,2
V
8
2
0
U
−5 −4,5 −4 −3,5 −3 −2,5 −2 −1,5 −1 −0,5 0
bn=grand(1,N,"uin",0,1);
Rnt = tierencode(bn);
save(’codedseq.sod’,’bn’,’Rnt’)
Fonction de codage :
function Rnt=tierencode(bn)
//===== transitions
prcodes=[[0;0;0],[1;1;0],[1;0;0],[0;1;0],[1;1;1],[0;0;1],[0;1;1],[1;0;1]];
N=length(bn); Rn=zeros(3,N); // coded sequence
Sn=zeros(1,N); // numero etat
for k=1:N-1
kn=4*bn(k)+Sn(k);
Rn(:,k)=prcodes(:,kn+1);
Sn(k+1)=floor(kn/2); // transition
end
Rnt=matrix(Rn,1,3*N);
endfunction
2. Programme de décodage :
//===== decoderexple.sce
clear, load(’codedseq.sod’)
P=3; Nc=length(Rnt); N=Nc/P;
nberr=10; // nombre d’erreurs
idxerr=grand(1,nberr,"uin",1,Nc);
serr=zeros(1,Nc); serr(idxerr)=1;
Rnte=modulo(Rnt+serr,2); // received seq. with errors
//=====
for k=1:N-P+1
idxd=P*(k-1)+1; idxf=idxd+P*P-1;
bl=matrix(Rnte(idxd:idxf),P,P)’;
b0=bl(1,3); //===== b(n|n)
b1=modulo(bl(2,1)+bl(2,2),2); //===== b(n|n+1)
b2=modulo(bl(3,2)+bl(3,3),2); //===== b(n|n+2)
b(k)=max([b0*b1,b0*b2,b1*b2]); //===== majority function
end
Vérification :
Telecom-ParisTech – GB 159
-->max(b-bn(1:N-2)’)
ans =
0.
//===== decoderv.sce
clear
verbose=%f; ptest=%f;
//==== Test sequence
if ptest,
Rnte=[0 0 0 1 1 0 1 1 1 0 1 0 0 0 0];
else
Ns=189; Rnte=grand(1,Ns,"uin",0,1);
end
P=3; N=length(Rnte)/P;
prcodes=[[0;0;0],[1;1;0],[1;0;0], [0;1;0],[1;1;1],[0;0;1], [0;1;1],[1;0;1]];
pstate=[1 3 1 3;2 4 2 4];
ostate=zeros(4,N-P+2); wght=zeros(4,1); st=[];
//===== level 1
idxd=1; idxf=3;
bl=Rnte(idxd:idxf)’*ones(1,2);
delta=sum(modulo([[0;0;0] [1;1;1]]+bl,2),’r’);
wght=wght+[delta(1);0;delta(2);0];
ostate(:,1)=[1;0;1;0]; st=[st wght];
//===== level 2
idxd=4; idxf=6;
bl=Rnte(idxd:idxf)’*ones(1,4);
delta=sum(modulo([[0;0;0] [1;0;0] [1;1;1] [0;1;1]]+bl,2),’r’);
wght=[wght(1)+delta(1); wght(3)+delta(2); wght(1)+delta(3); wght(3)+delta(4)];
st=[st wght]; ostate(:,2)=[1;3;1;3];
//===== level 3 et autres
for k=3:N
idxd=P*(k-1)+1; idxf=idxd+2; bl=Rnte(idxd:idxf)’ * ones(1,8);
delta=sum(modulo(prcodes+bl,2),’r’); // distance/transition
[td,ti]=min(matrix(delta+[wght’ wght’],2,4),’r’);
wght=td’; st=[st wght]; ostate(:,k)=pstate(ti+[0:2:6]);
end
//===== backtracking...
mpath=zeros(1,N+1); rseq=mpath; mbits=zeros(1,N);
[mmin,idx]=min(st(:,$));
idxm=idx(1); mpath(N+1)=idxm;
for k=N:-1:1
mpath(k)=ostate(idxm,k); mbits(k)=floor((idxm-1)/2); idxm=ostate(idxm,k);
end
if verbose,
disp(st,’st=’), disp(ostate,’ostate=’)
disp(mpath,’mpath=’), disp(mbits,’mbits=’)
end
0. 2. 5. 4. 4.
0. 4. 3. 2. 4.
3. 1. 2. 5. 3.
0. 5. 2. 3. 5.
ostate=
1. 1. 1. 2. 1.
0. 3. 3. 4. 4.
1. 1. 1. 2. 2.
0. 3. 3. 3. 4.
160 Annexes
mpath=
1. 1. 3. 4. 2. 3.
mbits=
0. 1. 1. 0. 1.
− st(i,k), i = 1 à 4, k = 1 à N , donne les distances entre l’état (0, 0) à l’état courant i au pas k sur
le chemin le plus court entre (0, 0) et i ;
− ostate(i,k) , i = 1 à 4, k = 1 à N , donne l’état précédent sur le plus court chemin entre (0, 0) et
i au pas k (0 s’il n’y en a pas) ;
1. On a :
∫ +∞ ∫ +∞
1
1[α,+∞) √ e−u /2 du
2
I(α) = = (A.20)
α −∞ 2π
(a) Valeur théorique calculée par Scilab : on rappelle que la fonction d’erreur erf(x) et la fonction
d’erreur complémentaire erfc(x) ont pour expression :
∫ x
2
e−u du
2
erf(x) = √ (A.21)
π 0
∫ +∞
2
e−u du
2
erfc(x) = 1 − erf(x) = √ (A.22)
π x
∫ +∞ √
1 1
e−u
2
⇒ I(α) = √ /2
du = erfc(α/ 2) (A.23)
2π α 2
∑
(b) Calcul direct : si on fait un tirage de variables aléatoires normales de loi N (0, 1), i f (ξi )
est égal au nombre NX>α d’échantillons qui sont > α. Si α est grand, ce dernier n’est plus
suffisant pour assurer une bonne précision.
NX>α
I(α) ≈ (A.24)
N
//===== IS_direct.sce
clear, getd()
alpha=3; N=10000;
Ialphath=0.5 * erfc(alpha/sqrt(2)); // valeur theorique
scr=msprintf(’Valeur theorique I(alpha) = %15.6g’,Ialphath); disp(scr)
Lruns=200; P1_direct=zeros(Lruns,1);
for ii=1:Lruns
x=grand(N,1,"nor",0,1);
P1_direct(ii)=sum(x>alpha)/N; // valeur integrale
end
clf, myboxplot(P1_direct,1.5)
scr=msprintf(’Valeur mesuree I(alpha) = %15.6g’,mean(P1_direct)); disp(scr)
-->exec(’IS_direct.sce’, -1)
0,0022 outliers
0,002
0,0018
0,0016
(75%)
0,0014
médiane
0,0012
(25%)
0,001
0,0008
0,0006
0,0004
outliers
2. f (x) est la fonction de Heaviside retardée 1[α,+∞) . Moyenne et variance sont données par :
E {f (X1 )} = I(α)
{ } 2
γ2 = var(f (X1 )) = E f 2 (X1 ) − E {(f (X1 )}
∫ +∞
= f 2 (u)p(u)du − I 2 (α) = I(α) − I 2 (α)
α
I(α)−I 2 (α)
La variance de l’erreur commise sur le calcul de l’intégrale est alors v 2 = N .
√
La quantité ε/ N peut être vue comme une erreur relative. Cette erreur est d’autant plus grande
que α est grand.
(a) Le tirage suivant la loi de Cauchy se fait à partir d’une loi uniforme sur −π/2, +π/2 par :
function X=genecauchy(N,verf,nh,xn)
// verf = booleen. Si %t, trace histogramme et densite theorique
// trace de -xn a +xn avec nh classes
if argn(2)<4, xn=30; end
if argn(2)<3, nh=max(10,N/100); end
if argn(2)<2, verf=%f; end
//===== generation de la suite
U=rand(N,1); X=tan(%pi*U-(%pi/2));
if verf then
//===== histogramme
idx=find((X>-xn) & (X<xn)); N=length(idx);
[ni,xh] = myhist(nh,X(idx),%t,%t);
//===== densite theorique
px=1 ./ (1+xh .*xh)/%pi; plot(xh,px,’xr’);
set(gca(),’grid’,[1 1])
end
endfunction
162 Annexes
//===== IS_cauchy.sce
//===== Importance sampling =======================
// Calcule \int_{\alpha}^{+\infty} p(x)dx avec p(x)=N(0,1)
// a l’aide d’une distribution de Cauchy
//=================================================
clear, getd()
alpha=3; N=10000; dpitdemi=sqrt(2/%pi);
Ialphath=0.5 * erfc(alpha/sqrt(2)); // valeur theorique
scr=msprintf(’Valeur theorique I(alpha) = %15.6g’,Ialphath); disp(scr)
//=====
Lruns=200; P1_direct=zeros(Lruns,1);
P1_IS_with=zeros(Lruns,1); P1_IS_cauchy=zeros(Lruns,1);
for ii=1:Lruns
xi=genecauchy(N);
//===== poids d’importance p(xi)/q(xi)
pimport=exp(-xi.*xi/2) .* (1+xi.*xi);
P1_IS_cauchy(ii)= (xi>alpha)’ * pimport; // sum(f(xi)*p(xi)/q(xi))
end
P1_IS_cauchy=P1_IS_cauchy/N/dpitdemi; clf, myboxplot(P1_IS_cauchy,1.5)
scr=msprintf(’Valeur mesuree I(alpha) = %15.6g’,mean(P1_IS_cauchy));
disp(scr)
0,0022
0,002
0,0018
0,0016
0,0014
0,0012
0,001
0,0008
0,0006
0,0004
//===== equdalembert.sce
lambda=1/sqrt(2*%pi); // pour information
c=10; // idem
tpause=50000;
X=0.003; xmax=.75; l1=round(xmax/X);
x=[-l1:l1]*X; Lx=length(x);
fg0=zeros(1,Lx); fd=fg0; fg=fg0;
T=1/10000; t=[-l1:l1]*T; Lt=Lx;
//===== DoG initialization
Telecom-ParisTech – GB 163
xcmax=0.3; l2=round(xcmax/X);
xc=[-l2:l2]*X; Lxc=length(xc); xc2=xc .* xc;
sigma1=10*X; sigma2=15*X;
f1=lambda*exp(-xc2/sigma1/sigma1/2)/sigma1;
f2=lambda*exp(-xc2/sigma2/sigma2/2)/sigma2;
yd=f1-f2; yg=yd;
//=====
ad1=l1+1-l2:l1+1+l2; fg(ad1)=yg;
ad2=l1+1-l2:l1+1+l2; fd(ad2)=yd;
plot(x,fg+fd); hh=gce(); xpause(tpause), delete(hh)
a=gca(); a.grid=[1 1];
fd=fg0; fg=fg0;
//=====
for idxg=-1:-1:-l1+l2+1
idxd=-idxg;
ad1=l1+1+idxg-l2:l1+1+idxg+l2; fg(ad1)=yg;
ad2=l1+1+idxd-l2:l1+1+idxd+l2; fd(ad2)=yd;
plot(x,fg+fd); hh=gce(); xpause(tpause), delete(hh)
fd=fg0; fg=fg0;
end
LCp2 + RCp + 1
G(p) = I(p)/U (p) =
(RCp + 1)Lp
fermeture ? fermeture ?
−9 Hz
1,5
1
−15,8
0,5
−58,1
0
58,1
−0,5
−1 15,8
−1,5
9
−0,06 −0,04 −0,02 0 0,02 0,04 0,06 0,08 0,1 0,12
3. Le diagramme de Nyquist est donné par la figure A.16. Expliquer précisément son tracé.
2. Donner l’expression de la fonction de transfert H(p) en boucle fermée correspondant à la figure A.17.
d2 y(t) dy(t)
+3 + 2y(t) = x(t) (A.28)
dt2 dt
On note X(p) et Y (p) les transformées de Laplace de x(t) et y(t). On se donne y(0+ ) et ẏ(0+ ) les
conditions initiales sur y et sa dérivée ẏ = dy/dt respectivement.
1. ẏ → pY (p) − y(0+ ) ;
Telecom-ParisTech – GB 165
2. on pose x(t) = dy
dt . On a dx/dt → pX(p) − x(0+ ). Or, X(p) = pY (p) − y(0+ ) et x(0+ ) = dy
dt (0+ ).
On en déduit :
d2 y
→ p2 Y (p) − py(0+ ) − ẏ(0+ )
dt2
√
4. Lest pôles√sont en −1 et −2. Le système est stable. La pulsation propre est ωN = 2 et 2zωN = 3
→ z = 3/ 2/2.
1. Impédance Z(p) ;
1
(R + Cp )Lp (RCp + 1)Lp
Z(p) = 1 =
Lp + R + Cp LCp2 + RCp + 1
LCp2 + RCp + 1
G(p) = (A.29)
(RCp + 1)Lp
10−6 p2 + 10−3 p + 1
G(p) = (A.30)
(10−3 p + 1)10−2 p
5
0
−5
−10
−15
−20
−25
(Hz)
0
−20
−40
−60
−80
−9 Hz
1,5
1
−15,8
0,5
−58,1
0
58,1
−0,5
−1 15,8
−1,5
9
−0,06 −0,04 −0,02 0 0,02 0,04 0,06 0,08 0,1 0,12
Le produit des racines est égal à k/2 > 0 et la somme (k − 1)/2. Si k > 1, les racines sont à partie
réelle positive et le système est instable.
0,5
80 252
119
0
−2,59 point critique
−0,5
40
−4,52
−1,2 −1 −0,8 −0,6 −0,4 −0,5 0
20
44,6 73,4 119 252 Hz
0
−20
4,52
−40
2,59
−80
−3,5 −3 −2,5 −2 −1,5 −1 −0,5 0 0,5
Si on choisit le contours de Nyquist indiqué figure A.20, la fermeture se fait “à gauche”. Le pôle
en p = 0 est considéré comme instable et il est unique. Pour n’avoir qu’un tour autour du point
critique, il faut que k < 1.
Telecom-ParisTech – GB 167
Création de l’interface :
function [f,hsl,hpb,htxt,hcbx]=createIF(z)
global a
bl=550;
f=figure(0); f.visible=’off’;
f.position=[20,40,650,450]; f.children.visible=’off’;
f.figure_name="SecondOrdre"; f.Background=7;
hsl=uicontrol(f,’style’,’slider’,’position’,[620 50 16 370],...
’min’,z($),’max’,z(1),’sliderstep’,[.01 .1],...
’callback’,"traitsl(hsl,htxt,wn,jw)");
hsl.value=0;
a=newaxes(); a.box=’on’; a.grid=[1 1];
a.axes_bounds=[0 0 .85 .95]; a.margins=[.05 .05 .05 .05];
hpb(1)=uicontrol(f,’style’,’pushbutton’,...
’position’,[bl 20 50 20],...
’string’,’close’,’callback’,"close()");
hpb(2)=uicontrol(f,’style’,’pushbutton’,...
’position’,[bl 45 50 20], ’string’,’draw’,...
’callback’,"calculs(jw,z,wn,hcbx)"); //
hpb(3)=uicontrol(f,’style’,’pushbutton’,...
’position’,[bl 70 50 20], ’string’,’clear’,...
’callback’,"c=a;delete(a.children);a=c;");
htxt=uicontrol(f,’style’,’text’,...
’position’,[bl 95 50 20], ’string’,’’);
hcbx=uicontrol(f,’style’,’checkbox’,...
’position’,[bl 120 20 20],’value’,0);
f.visible=’on’;
endfunction
hh=gce();
xpause(200000) // microsecondes
if (hcbx.value==0) & (k~=lz), delete(hh), end
k=k+1;
end
endfunction
//===== testbinomial.sce
clear
N=1000; p=0.3; //P(X=0)=q, P(X=1)=p=1-q
Nt=100; // nombre de tirages
xn=rand(Nt,N,’u’); xb=zeros(Nt,N);
idxp=find(xn<p); xb(idxp)=1;
Lones=sum(xb,2); // nbre de 1 pour chaque tirage
//===== histogramme
clf, subplot(211);
nc=20; // nombre de classes de l’histogramme
histplot(nc,Lones), // ()normalization=%t)
title(’normalisé’), set(gca(),’grid’,[-1 1])
//===== repartition estimee
mx=max(Lones); mn=min(Lones); S=[mn:(mx-mn)/nc:mx];
[ind,occ]=dsearch(Lones,S);
subplot(212); plot2d2(S(2:$),cumsum(occ)/Nt)
title(’Fonction de répartition estimée’)
//===== loi théorique
ons=ones(S);
Telecom-ParisTech – GB 169
[p1,p0]=cdfbin(’PQ’,fix(S),N*ons,p*ons,(1-p)*ons)
plot(S,p1,’r’), plot(S,p1,’or’)
set(gca(),’grid’,[1 1])
legend(’estimé’,’théorique’)
normalisé
0.035
0.03
0.025
0.02
0.015
0.01
0.005
0
270 280 290 300 310 320 330 340 350
Fonction de répartition estimée
1
estimé
théorique
0.8
0.6
0.4
0.2
0
270 280 290 300 310 320 330 340 350
Paramètres :
1. configuration (menu simulation/configurer, figure A.23) des paramètres de calcul (résolution d’équa-
tion différentielle, figure A.24) :
5. oscilloscope : ymin = −1.5, Ymax = 1.5, période de rafraîchissement = 3, buffer size = 100.
L’exécution donne lieu à un certain nombre de messages. La boîte de dialogue de la figure A.25 donne
des informations sur le système différentiel résolu par Xcos.
Un certain nombre de messages sont fournis dans la fenêtre de commande indiquant une « édition de
liens » avec une bibliothèque dynamique. Il faut donc que Scilab puisse trouver un compilateur C et les
outils associés... si ceux-ci ne sont pas installés, il ne pourra pas y avoir exécution. Sur Mac OS X, cela
marche avec Xcode installé.
Telecom-ParisTech – GB 171
1.5
0.5
−0.5
−1
−1.5
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3
[2] Consortium Scilab. Introduction to discrete probabilities with Scilab. Digiteo, Domaine de Voluceau -
Rocquencourt - BP 105 - 78153 Le Chesnay Decex France.
[3] Consortium Scilab. Introduction to Scilab. Digiteo, Domaine de Voluceau - Rocquencourt - BP 105 -
78153 Le Chesnay Decex France.
[4] Consortium Scilab. Optimization in Scilab. Digiteo, Domaine de Voluceau - Rocquencourt - BP 105
- 78153 Le Chesnay Decex France.
[5] Consortium Scilab. Scilab is not naive. Digiteo, Domaine de Voluceau - Rocquencourt - BP 105 -
78153 Le Chesnay Decex France.
[6] Jean-Philippe Chancelier Stephen L. Campbell and Ramine Nikoukhah. Modeling and Simulation in
Scilab/Scicos. Springer Science, Springer Science+Business Media, Inc., 233 Spring Street, New York,
NY 10013, US, 2006.
173
174 Annexes
Index
175
176 Annexes