5. Diverses autres notions MATLAB/Octave

5.1 Dates et temps

5.1.1 Généralités

De façon interne, MATLAB/Octave gère les dates et le temps sous forme de nombres (comme la plupart des autres langages de programmation, tableurs...). L' "origine du temps", pour MATLAB/Octave, a été définie au 1er janvier de l'an 0 à minuit, et elle est mise en correspondance avec le nombre 1 (vous pouvez vérifier cela avec datestr(1.0001)). Chaque jour qui passe, ce nombre est incrémenté de 1, et les heures, minutes et secondes dans la journée correspondent donc à des fractions de jour (partie décimale du nombre exprimant le temps).

On obtient la liste des fonctions relatives à la gestion du temps avec helpwin timefun ou au chapitre "Timing Utilities" du manuel Octave.

5.1.2 Fonctions retournant la date et heure courante

Fonction Description
date_string = date Retourne la date courante sous forme de chaîne de caractère au format 'dd-mmm-yyyy' (où mmm est le nom du mois en anglais abrégé aux 3 premiers caractères)

Ex: date retourne 08-Apr-2005

date_num = now Retourne le nombre exprimant la date et heure locale courante (donc le nombre de jours -et fractions de jours- écoulés depuis le 1er janvier 0000). Passez au préalable la commande format long si vous voulez afficher ce nombre en pleine précision.

Ex:
rem(now,1) (partie décimale) retourne donc l'heure locale courante sous forme de fraction de jour, et datestr(rem(now,1),'HH:MM:SS') retourne l'heure courante sous forme de chaîne !
floor(now) (partie entière) retourne donc le numéro de jour relatif à la date courante, et datestr(floor(now)) la même chose que la fonction date

date_vec = clock Retourne la date et heure courante sous forme d'un vecteur-ligne date_vec de 6 valeurs numériques [annee mois jour heure minute seconde]. Est identique à datevec(now).
Pour avoir des valeurs entières, faire fix(clock).

Ex: clock retourne le vecteur [2005 4 8 20 45 3] qui signifie 8 Avril 2005 à 20h 45' 03"

5.1.3 Fonctions de conversion

Fonction Description
date_string =

a) datestr(date_num {,'format'})
    datestr(date_num {,code})

b) datestr(date_vec {,'format'})
    datestr(date_vec {,code})

Convertit en chaîne de caractères la date et heure spécifiée par :
a) la date numérique date_num
b) le vecteur date_vec

Le formatage peut être défini par un format ou un code (voir help datestr pour plus de détails).
Parmi les symboles qui peuvent être utilisés et combinés dans un formats, mentionnons :
  - dd, dddd, ddd : numéro du jour, nom du jour, nom abrégé
  - mm, mmmm, mmm : numéro du mois, nom complet, nom abrégé
  - yyyy, yy : année à 4 ou 2 chiffre
  - HH : heures ; MM : minutes
  - SS : secondes ; FFF : milli-secondes
En l'absence de format ou de code, c'est un format 'dd-mmm-yyyy HH:MM:SS' qui est utilisé par défaut

Si le paramètre date_num est compris entre 0 et 1, cette fonction retourne des heures/minutes/secondes.

Ex:
datestr(now) ou datestr(now,'dd-mmm-yyyy HH:MM:SS') retournent '08-Apr-2005 20:45:00'
datestr(now,'ddd') retourne 'Fri' (abréviation de Friday) (voir aussi la fonction weekday ci-dessous)

date_num =

a) datenum(date_string {,'format'})

b) datenum(date_vec)
c) datenum(annee,mois,jour {,heure,min,sec})

Retourne le nombre exprimant la date et heure spécifiée par :
a) la chaîne date_string ; il peut être nécessaire d'indiquer le format pour aider au décodage de la chaîne (voir second exemple ci-dessous)
b) le vecteur date_vec
c) les nombres annee, mois, jour, { heure, min et sec }

Ex :
datenum('08-Apr-2005 20:45:00') et datenum(2005,4,8,20,45,0) retournent le nombre 732410.8645833334
datenum('2005/04/8 20:45') retourne une erreur ;
    le format est ici nécessaire pour décoder, donc faire datenum('2005/04/8 20:45', 'yyyy/mm/dd HH:MM')

date_vec =                   ou
    [annee mois jour heure min sec] =

a) datevec(date_string {,'format'})

b) datevec(date_nun)

Retourne un vecteur ligne de 6 valeurs numériques définissant l'annee, mois, jour, heure, min et sec à partir de :
a) la chaîne date_string ; il peut être nécessaire d'indiquer le format pour aider au décodage de la chaîne (voir second exemple ci-dessous)
b) la date numérique date_num

Pour avoir des valeurs entières, faire fix(datevec(date)).

Ex:
datevec('08-Apr-2005 20:45:03') et datevec(732410.8646180555) retournent le vecteur [2005 4 8 20 45 3]
datevec('2005/04/8 20h 45min 03sec', 'yyyy/mm/dd HHh MMmin SSsec') idem

5.1.4 Fonctions utilitaires

Fonction Description
calendar
calendar(annee, mois)
calendar(date)

mat = calendar(...)

Affiche le calendrier du mois courant, ou du mois contenant la date spécifiée (sous forme de chaîne de caractère ou de nombre), ou du mois/annee spécifié (sous forme de nombres)

Affectée à une variable, cette fonction retourne une matrice mat 6x7 contenant les numéros de jour du mois correspondant.

Ex: calendar(2005,4) ou calendar('8-Apr-2005') affichent :

	  	  Apr 2005
     S     M    Tu     W    Th     F     S
     0     0     0     0     0     1     2
     3     4     5     6     7     8     9
    10    11    12    13    14    15    16
    17    18    19    20    21    22    23
    24    25    26    27    28    29    30
     0     0     0     0     0     0     0
(les 2 premières lignes, ici en gras, ne se trouvent pas dans la matrice 6x7 si vous appelez cette fonction calendar en l'affectant à une variable)
[numero_jour   nom_jour] =

weekday(date_string)
weekday(date_num)

Retourne le numero_jour (nombre) et nom_jour (chaîne) (respectivement: 1 et Sun, 2 etMon, 3 et Tue, 4 et Wed, 5 et Thu, 6 et Fri, 7 et Sat) correspondant à la date spécifiée (passée sous forme de chaîne date_string, ou de nombre date_num). Si cette fonction est affectée à une seule variable, retourne le numero_jour.
Voir aussi, plus haut, la fonction datestr avec le format 'ddd'.

Ex: [no nom]=weekday(732410.8646180555) et [no nom]=weekday('08-Apr-2005 20:45:03') retournent les variables No=6 et Nom='Fri'

eomday(annee, mois) Retournent le nombre de jours du mois/annee (spécifié par des nombres)

Ex: eomday(2005,4) retourne 30 (i.e. il y a 30 jours dans le mois d'avril 2005)

datetick('x|y|z',format) Sur l'axe spécifié (x, y ou z) d'un graphique, remplace au niveau des labels correspondants aux lignes de quadrillage (tick lines), les valeurs numériques par des dates au format indiqué
Sous Octave, implémenté depuis la version 3.2.0

5.1.5 Fonctions de timing et de pause

Pour mesurer plus précisément le temps CPU consommé par les différentes instructions et fonctions de votre code MATLAB/Octave, voyez en outre les fonctions de "profiling" décrites au chapitre "Interaction, debugging, profiling..."), sous-chapitre "Profiling".

Fonction Description
pause(secondes)
sleep(secondes)

pause

Se met en attente durant le nombre de secondes spécifié.

Passée sans paramètre, la fonction pause attend que l'utilisateur frappe n'importe quelle touche au clavier.

Ex: dans un script, les lignes suivantes permettent de faire une pause bien explicite :
disp('Frapper n''importe quelle touche pour continuer... ') ; pause ;

cputime Retourne le nombre de secondes de processeur consommées par MATLAB/Octave depuis le début de la session ("CPU time"). Sous Octave cette fonction a encore d'autres paramètres de sortie (voir help cputime)

Ex: t0 = cputime; A=rand(1000,1000); B=inv(A); dt = cputime-t0 : génération d'une matrice aléatoire A de dimension 1000 x 1000, inversion de celle-ci sur B, puis affichage du temps comsommé au niveau CPU pour faire tout cela (env. 8 secondes sur un Pentium 4 à 2.0 GHz, que ce soit sous MATLAB ou Octave)

tic
   instructions MATLAB/Octave...
ellapse_time = toc
La fonction tic démarre un compteur de temps, et la fonction toc l'arrête en retournant (sur la variable ellapse_time spécifiée) le temps écoulé en secondes

Ex: l'exemple ci-dessus pourrait être aussi implémenté ainsi : tic; A=rand(1000,1000); B=inv(A); dt = toc

etime(t2,t1) Retourne le temps, en secondes, séparant l'instant t1 de l'instant t2. Ces 2 paramètres sont au format clock (donc vecteur-ligne [annee mois jour heure minute seconde])

Ex: l'exemple ci-dessus pourrait être aussi implémenté ainsi : t1 = clock; A=rand(1000,1000); B=inv(A); dt = etime(clock,t1)

5.2 Résolution d'équation non linéaire

Les fonctions fzero('fonction',x0) ou fsolve('fonction',x0) permettent de trouver, par approximations successives en partant d'une valeur donnée x=x0, la(les) racine(s) d'une fonction non linéaire y=f(x), c'est-à-dire les valeurs x1, x2, x3... pour lesquelles f(x)=0 .

Remarque : sous MATLAB, la fonction fzero est standard, mais la fonction fsolve est implémentée dans la toolbox "Optimisation".

Illustrons l'usage de cette fonction par un exemple :

Étape Réalisation
1) Soit la fonction de 3e degré :
      y = - 0.5*x^3 - x^2 + 15*x - 8
On doit donc trouver les solutions x1, x2... pour f(x)=0, donc : - 0.5*x^3 - x^2 + 15*x - 8 = 0
2) Commençons par définir cette équation sous forme d'une fonction MATLAB/Octave

(voir chapitre "Fonctions")

Réaliser le M-file appelé fct_deg3.m contenant par conséquent le code suivant :
function [Y]=fct_deg3(X)
  Y = - 0.5 * X.^3 - X.^2 + 15*X - 8
return
3) Puis graphons rapidement cette fonction (autour de -20 ≤ x ≤ 20) pour estimer graphiquement une valeur approximative x0 de départ

(voir l'usage de la fonction fplot au chapitre "Graphiques 2D")

Le code fplot('fct_deg3(x)',[-20 20]) produit le graphique ci-dessous :

4) Zoomons autour de la solution (qui a l'air de se trouver vers 1 et 4) en rétrécissant l'intevalle à 0 ≤ x ≤ 5 Le code fplot('fct_deg3(x)',[0 5]) ; grid('on') produit le graphique ci-dessous (sauf les étiquettes x1 et x2 que nous avons ajoutées manuellement) :

5) Choisissons la valeur de départ x0 = 5, et recherchons la première solution Entrons x1=fzero('fct_deg3',5) ou x1=fsolve('fct_deg3',5)
Après une série d'itérations, Octave retourne : x1 = 4.2158
On peut vérifier que c'est bien une solution en entrant fct_deg3(x1) qui retourne bien 0 (ou une valeur infiniment petite)
6) Choisissons la valeur de départ x0 = 0, et recherchons la seconde solution Entrons x2=fzero('fct_deg3',0) ou x2=fsolve('fct_deg3',0)
Après une série d'itérations, Octave retourne : x2 = 0.56011
On peut vérifier que c'est bien une solution en entrant fct_deg3(x2) qui retourne bien 0 (ou une valeur infiniment petite)




Documentation CC BY-SA 4.0 / J.-D. BONJOUR () / EPFL-ENAC-IT / Rév. 20-11-2015       ↵ Table des matières