Download - Slides octave1

Transcript
Page 1: Slides octave1

Introduction a Octave

Rodolphe Charrier

UFRSTUniversite du Havre

M1 Math-Info MATIS

Rodolphe Charrier Introduction a Octave

Page 2: Slides octave1

Apercu et environnement I

GNU Octave est le logiciel libre offrant actuellement lameilleure compatibilite avec le logiciel commercial de calculnumerique Matlab.

Version 3.2 sous linux Ubuntu (existe aussi sur Mac etWindows).

Octave est :un langage interprete converti en P-code (pseudo codeMatlab),utilisable en ligne de commande ou par execution descripts stockes dans des ”M-files” (extension ”.m”),dote de fonctionnalites de haut niveau - developpement”rapide”.

Rodolphe Charrier Introduction a Octave

Page 3: Slides octave1

Apercu et environnement II

Octave est un langage de programmation associe une richecollection d’algorithmes numeriques :

algebre lineaire et matricielpolynomes et fonctions rationnellesinterpolation et approximationoptimisation lineaire, quadratique et non lineaireEDO / EDPControle classique et robusteTraitement du signalStatistiquesGraphisme 2D/3D...

Rodolphe Charrier Introduction a Octave

Page 4: Slides octave1

Apercu et environnement III

Octave est fourni ici avec l’IDE QtOctave qui permet l’edition descripts, leur execution et debuggage, les requetes en ligne decommande, l’aide en ligne, des menus de fonctions dediees,etc . . .

Le lancement de QtOctave depuis le menu programmed’Ubuntu lance automatiquement Octave dans une console etun editeur integre.

Rodolphe Charrier Introduction a Octave

Page 5: Slides octave1

Apercu et environnement IV

Rodolphe Charrier Introduction a Octave

Page 6: Slides octave1

Obtenir de l’aide I

Dans la console d’Octave :

doc fonction ou help fonction lance une aide surla fonction specifiee,

la commande lookfor mot-cle recherche l’occurrencedu mot-cle dans toutes les premieres lignes des textesd’aide

l’option lookfor -all mot-cle cherche dans tout letexte de l’aide.

Une des manieres les plus completes d’obtenir de l’aide estd’ouvrir le menu Help/Octave Help de QtOctave. Unefenetre dediee s’ouvre alors.

Rodolphe Charrier Introduction a Octave

Page 7: Slides octave1

Obtenir de l’aide II

Dans cette aide, on trouve aussi des exemples de codes et desdemonstrations.

Enfin une aide dynamique est aussi disponible dans le menuHelp de QtOctave.

Rodolphe Charrier Introduction a Octave

Page 8: Slides octave1

Obtenir de l’aide III

Elle ouvre une fenetre complementaire qui fournit desinformations interessantes a la saisie dans l’une quelconquedes fenetres ouvertes.

Rodolphe Charrier Introduction a Octave

Page 9: Slides octave1

Modes d’utilisation - console, editeur, batchprocessing I

Octave s’utilise dans une fenetre console, au travers d’uneboucle du type

lecture-evaluation-resultat

Taper les lignes de commandes suivantes successivement.Que constatez-vous?

>>> s="Hello World!";>>> disp(s);>>> s

Les fleches ↑ et ↓ permettent une navigation dans l’historiquedes commandes.La touche <TAB> lance un systeme de completion facilitant lasaisie.

Rodolphe Charrier Introduction a Octave

Page 10: Slides octave1

Modes d’utilisation - console, editeur, batchprocessing II

Rodolphe Charrier Introduction a Octave

Page 11: Slides octave1

Modes d’utilisation - console, editeur, batchprocessing III

Execution de fichiers de scripts / commandes

A partir de l’editeur integre a QtOctave ou d’un editeur externe,on peut construire un fichier de commandes avec l’extension”.m”.

On pourra executer ce script par l’une des methodessuivantes :

depuis le menu Run/Run de la fenetre d’edition deQtOctave,par la commande Octave source("nomDuScript.m")dans le dossier du script,en tapant directement le nom du script (sans extension)depuis le dossier du script dans la console de commande.

Rodolphe Charrier Introduction a Octave

Page 12: Slides octave1

Modes d’utilisation - console, editeur, batchprocessing IV

Mode batch

On peut lancer Octave en mode batch :pour disposer d’un environnement simplifie (sansfenetrage),pour lancer en externe des fichiers de scripts

Commande de base :octave --silent monScript.m >Resultats.txtlance le script sur Octave (sans afficher les messagesd’ouverture Octave), quitte automatiquement apres executionet recupere eventuellement le resultat dans le fichierResultats.txt.

Rodolphe Charrier Introduction a Octave

Page 13: Slides octave1

Modes d’utilisation - console, editeur, batchprocessing V

On peut egalement rendre executable un script en rajoutant enen-tete la ligne suivante donnant le chemin d’acces absolu aubinaire Octave :

#!usr/bin/octave --silent

puis l’executer dans un terminal de commande avec lasequence suivante :

$ chmod u+x script.m$./script.m > Resultats.txt

Rodolphe Charrier Introduction a Octave

Page 14: Slides octave1

Elements de base - types de donnees, variables,operations I

Tout est matrice dans Octave!

Malgre cette remarque, nous allons commencer par decrire destypes de donnees simples (des matrices 1x1) avant de passeraux aspects plus generaux de traitement de matrices.

Rodolphe Charrier Introduction a Octave

Page 15: Slides octave1

Elements de base - types de donnees, variables,operations II

Reels

Les reels sont codes sur 64 bits (double precision) avec 16chiffres significatifs au maximum dans l’intervalle :[10−308,10+308]

la fonction de conversion single() permet de ramener aune simple precision,

!4! : certains operateurs arithmetiques rendent desentiers lorsqu’ils sont en presence d’entiers et de reels.⇒Utiliser la fonction double( )pour convertir les entiersen reels.

Rodolphe Charrier Introduction a Octave

Page 16: Slides octave1

Elements de base - types de donnees, variables,operations III

Entiers

Les entiers sont obtenus via des fonctions de conversion versun encodage en 8, 16, 32 ou 64 bits :

int8, int16, int32, int64 pour les entiers signes

uint8, uint16, int32, uint64 pour les entiers nonsignes.

Rodolphe Charrier Introduction a Octave

Page 17: Slides octave1

Elements de base - types de donnees, variables,operations IV

Nombres complexes

i, imaginaire pur dont le carre vaut -1,partie reelle (reel) + i partie imaginaire (reel),des fonctions specifiques manipulent les nombrescomplexes :

>>> z1=5+6iz1 = 5 + 6i>>> real(z1)ans = 5>>> imag(z1)ans = 6>>> conj(z1)ans = 5 - 6i

Rodolphe Charrier Introduction a Octave

Page 18: Slides octave1

Elements de base - types de donnees, variables,operations V

Noms de variables

Un nom de variable sous Octave commence par une lettre puispar au choix :

des lettres de l’alphabet en minuscules ou majuscules,avec differenciation de ces deux types (”case sensitive”)des nombres de 0 a 9un caractere

Le nombre de caracteres utilisables est limite a 63 caracteressur Matlab/Octave.Les variables une fois creees resident en memoire dans le”Workspace” d’Octave.

Rodolphe Charrier Introduction a Octave

Page 19: Slides octave1

Elements de base - types de donnees, variables,operations VI

Manipulation de variables numeriques

L’operateur d’affectation est represente par un seul signe =(== designe l’operateur booleen de comparaison).

>>> x=1x= 1>>> x=x*2x= 2

Tester l’usage du point-virgule ;.Exemples d’operateurs arithmetiques :

xˆ2 ou x ∗ ∗2 designe l’elevation au carrex/y = xy−1

x\y = x−1y

Rodolphe Charrier Introduction a Octave

Page 20: Slides octave1

Elements de base - types de donnees, variables,operations VII

Commentaires et lignes de continuation

Un commentaire commence par le caractere %,Un bloc entier est encadre par %{ et %} ,Une ligne se terminant par ... sera prolongee par la lignesuivante.

Exemples :

>>> % c’est un commentaire>>> x = 1 ...>>> + 2 ...>>> + 3x= 6

Rodolphe Charrier Introduction a Octave

Page 21: Slides octave1

Elements de base - types de donnees, variables,operations VIII

Fonctions mathematiques elementaires

Rodolphe Charrier Introduction a Octave

Page 22: Slides octave1

Elements de base - types de donnees, variables,operations IX

La plupart de ces fonctions prennent un argument et enretourne un autre. Elles sont ”vectorisees”, c’est-a-dire qu’ellesmanipulent des matrices.Exemple : Tester les commandes ci-dessous

>>> x = cos(2)>>> y = sin (2)>>> xˆ2 + yˆ2>>> ans*2>>> z=sin([x y])

La variable ans stocke l’evaluation de l’expression courante etest reutilisable.

Rodolphe Charrier Introduction a Octave

Page 23: Slides octave1

Elements de base - types de donnees, variables,operations X

Variables mathematiques predefinies

Dans Matlab/Octave, plusieurs variables mathematiques sontpredefinies :

Rodolphe Charrier Introduction a Octave

Page 24: Slides octave1

Elements de base - types de donnees, variables,operations XI

Booleens

Les booleens sont des variables qui peuvent prendre deuxvaleurs, false ou 0, et true ou 1 (ou dans certains cas deconditions logiques toute valeur differente de 0) .0perateurs booleens :

Rodolphe Charrier Introduction a Octave

Page 25: Slides octave1

Elements de base - types de donnees, variables,operations XII

fonctions logiques :

Rodolphe Charrier Introduction a Octave

Page 26: Slides octave1

Elements de base - types de donnees, variables,operations XIII

Chaınes de caracteres

Elles sont delimitees sous Matlab/Octave par des apostrophes :

>>> x = ’coucou’x = coucou

Une chaıne de caracteres est un vecteur ligne ce qui expliqueque la concatenation se fasse par la mise entre crochets [ ] :

>>> [’bonjour ’ ’tout le monde’]ans = bonjour tout le monde

Rodolphe Charrier Introduction a Octave

Page 27: Slides octave1

Elements de base - types de donnees, variables,operations XIV

La fonction de concatenationstrcat(chaine1,chaine2,...) supprime les espacesblancs.Cf. doc Octave pour les fonctions de manipulation.

Une specificite d’Octave par rapport a Matlab est d’accepteregalement les chaınes declarees entre guillemets integrant descaracteres speciaux :

\t pour la tabulation\n pour le passage a la ligne.

Ainsi executer la commande :>>> disp("Ce texte \n s’affiche sur 2 lignes avec une \ttabulation")

Rodolphe Charrier Introduction a Octave

Page 28: Slides octave1

Matrices et vecteurs I

Construction d’une matrice :

delimitee par des crochets ouvrant [ et fermant ],

elements d’une meme ligne sont separes par des blancsou des virgules,

points virgules ; pour separer les lignes.

Rodolphe Charrier Introduction a Octave

Page 29: Slides octave1

Matrices et vecteurs II

ExemplesExecuter les commandes successives suivantes dans laconsole Octave :>>> A = [ 1 1 1; 2 4 8; 3 9 27]%renvoie la taille de la matrice :>>>size(A)>>> y = [1 + i, - 3 * i, -1]%vecteur transpose de y :>>>y’% matrice transposee de A :>>> A’%renvoie d’un element de A :>>> A(2,2)%renvoie la deuxieme ligne de A :>>> A(2,:)% renvoie les deuxieme et troisieme lignes de A :>>>A(2:3,:)

Rodolphe Charrier Introduction a Octave

Page 30: Slides octave1

Matrices et vecteurs III

Generation automatique% Generation d’un vecteur ligne genere par serie lineaire.% L’increment est en position milieu pour chaque vecteur ligne% t peut etre un nombre decimal>>>x=1:1:3>>>u=1:0.5:3% generation d’une matrice a l’aide de 3 vecteurs lignes :>>>B=[1:1:3 ; 1:3:9 ; 9:-1:7]%vecteur ligne genere par la fonction linspace :>>>v=linspace(-1,3,5)

Rodolphe Charrier Introduction a Octave

Page 31: Slides octave1

Matrices et vecteurs IV

Construction de matrices specifiquesTester les fonctions de construction de matrices suivantes etretrouver leur specificite :(On reprendra la matrice A et les variables precedentes)>>> I = eye(4,4)>>> Y = diag(y)>>> a = diag(A)>>> J = zeros(3,4)>>> K = ones(3,4)>>> B=triu(A)>>> C= tril(A)>>> R = rand (3,4)

Rodolphe Charrier Introduction a Octave

Page 32: Slides octave1

Visualiser un graphe simple I

On va construire le graphe de la fonction

y = e−x sin(4x) pour x ∈ [0,2π]

On commence alors par creer un maillage de l’intervalle [0,2π]avec la fonction linspace :

-->x=linspace(0,2*pi,101);

x est alors un vecteur de 101 valeurs pour donner 100intervalles.

On calcule ensuite les valeurs de la fonction pour chaquecomposante du vecteur x :

>>>y=exp(-x).*sin(4*x);

Rodolphe Charrier Introduction a Octave

Page 33: Slides octave1

Visualiser un graphe simple II

La notation pointee de l’operateur arithmetique permet detraiter l’operation element par element sur les matrices.

Le trace du graphique se fait alors par l’instruction plot :

>>>plot(x,y)>>>title(’y=exp(-x)*sin(4x)’) % le titre du trace

L’instruction permet de tracer une courbe passant par les pointsdont les coordonnees sont donnees dans les vecteurs x pourles abscisses, et y pour les ordonnees. Les points sont reliespar des segments de droites.

Rodolphe Charrier Introduction a Octave

Page 34: Slides octave1

Visualiser un graphe simple III

Rodolphe Charrier Introduction a Octave

Page 35: Slides octave1

Ecrire et executer un script I

L’ecriture de scripts Octave/Matlab (”M-files”) peut se faire dansl’editeur de QtOctave et peut etre execute depuis cetenvironnement dans le menu Run de l’editeur.Voici un petit exemple que l’on nommera ”script1.m” :% mon premier script Octavea = input(’ Rentrer la valeur de a : ’);b = input(’ Rentrer la valeur de b : ’);n = input(’ Nb d’intervalles n : ’);% calcul des abscissesx = linspace(a,b,n+1);% calcul des ordonneesy = exp(-x).*sin(4*x);% representation graphiqueplot(x,y);xlabel(’x’); % label sur les abscissesylabel(’y’); % label sur les ordonneestitle(’y=exp(-x)*sin(4x)’);

Rodolphe Charrier Introduction a Octave

Page 36: Slides octave1

Entrees-sorties-fichiers I

Principales fonctions (tire de http://enacit1.epfl.ch/cours_matlab/mfiles.html#entrees_sorties) :

Rodolphe Charrier Introduction a Octave

Page 37: Slides octave1

Entrees-sorties-fichiers II

Saisie clavierUne saisie au clavier utilise la commande input.Tester les saisies ci-dessous

>>> n=input(’entrer la dimension n’)>>> A=input(’entrer une matrice’)>>> nomfichier=input(’Donner le nom du fichier’,’s’)

Analyse automatique du type entre.Lorsque c’est une chaıne de caracteres, on rajoute ’s’ enparametre.

Rodolphe Charrier Introduction a Octave

Page 38: Slides octave1

Entrees-sorties-fichiers III

Affichage sur la sortie standardLa commande disp n’affiche qu’une seule variable/chaıne decaractere a la fois.

>>> A=[1, 2; 3, 4]>>> disp(A)

L’instruction ”fprintf” qui est en fait celle qui est heritee dulangage C (ici en absence d’identifiant de fichier, c’est la sortiestandard qui est utilisee).Ex :

>>> a=64; b=sin(a);>>> fprintf(’le sinus de %2.f \n est %f ’,a,b)le sinus de 64est 0.920026

Noter le format des nombres.

Rodolphe Charrier Introduction a Octave

Page 39: Slides octave1

Entrees-sorties-fichiers IV

Manipulation de donnees matricielles dans des fichiers

dlmread met les donnees lues dans une matrice (aveceventuellement un delimiteur).Ecrire quelques donnees en lignes et colonne dans unfichier donnees.txt puis executer le script suivant :>>> M=dlmread(’donnees.txt’);>>> disp(M);>>> M2=dlmread(’donnees.txt’," ",[0,0,4,4])

La derniere instruction renvoie la sous-matrice des valeurscomprises entre l’element (0,0) et l’element (4,4), leseparateur un espace blanc.dlmwrite ecrit les donnees d’une matrice dans unfichier :>>> dlmwrite(’donnees.txt’, M, "-append");

Le dernier argument (”-append”) signale une ecriture en finde fichier.

Rodolphe Charrier Introduction a Octave

Page 40: Slides octave1

Entrees-sorties-fichiers V

Lecture formatee dans un fichierSoit le fichier texte ’data.txt’ suivant :101 Martin Cahier 2 3.50102 Charrier Crayon 5 2.95

Procedure de lecture sur un fichier : boucle qui termine avec lesignal de fin de fichier rendu par la fonction feof.% fopen : le mode d’ouverture est indique par le second argument% ’r’ lecture; ’w’ ecriture; ’a’ ajout en fin)data_id = fopen(’data.txt’, ’r’) ;no = 1 ;while not(feof(data_id))% lecture des elements 1 a 1 (dernier argument de fscanf)

No_client(no) = fscanf(data_id,’%u’,1) ;Nom{no,1} = fscanf(data_id,’%s’,1) ;Article{no,1} = fscanf(data_id,’%s’,1) ;Nb_articles(no) = fscanf(data_id,’%u’,1) ;Prix_unit(no) = fscanf(data_id,’%f’,1) ;no = no + 1 ;

endstatus = fclose(data_id) ;

Rodolphe Charrier Introduction a Octave

Page 41: Slides octave1

Entrees-sorties-fichiers VI

Rem : les chaınes de caracteres sont stockees dans destableaux cellulaires (cf. doc).

Principaux types de format :

%u et %d designent respectivement un entier positif(naturel) et un entier relatif (positif ou negatif)

%f designe les flottants

%s designe les chaınes de caracteres

Rodolphe Charrier Introduction a Octave

Page 42: Slides octave1

Entrees-sorties-fichiers VII

Ecriture formatee dans un fichier

On ecrit dans un fichier precedemment ouvert en ecriture viafprintf.Tester le script suivant (si vous ne precisez aucun file id, onecrit sur la sortie standard) :>>> a=0:0.1:1;>>> b=sin(a);>>> fprintf(file_id, ’%1.2f %1.4f \n’,[a;b]);

Les formats peuvent integrer des specifications d’affichage (icinombre avant et apres la virgule pour les flottants)

Rodolphe Charrier Introduction a Octave

Page 43: Slides octave1

La programmation en Scilab I

If - instructions conditionnelles

Ecrire et executer le script suivant et modifier les valeurs de npour tester :n=2;if (n==1)disp(’un’);elseif (n==2)disp(’deux’);elsedisp(’autre’);endif

On peut enchaıner plusieurs tests avec elseif.La condition logique de selection ne necessite pas deparentheses. Il peut s’agir d’une matrice sur laquelle on verifieque tous les elements ne sont pas faux (differents de 0).

Rodolphe Charrier Introduction a Octave

Page 44: Slides octave1

La programmation en Scilab II

Switch - alternatives

switch ncase{1}disp(’un’);case{2}disp(’deux’);otherwisedisp(’autre’);endswitch

Seule l’instruction qui suit directement le case est executee sila comparaison est vraie.otherwise est facultatif et sera effectue si tous les testsprecedents ont echoues.

Rodolphe Charrier Introduction a Octave

Page 45: Slides octave1

La programmation en Scilab III

Boucle for

On utilise un index qui decrit un ensemble de valeurs, generesouvent avec l’operateur deux-points ”:” .L’iterateur de la boucle for peut etre plus generalement unematrice, pour laquelle chaque iteration renvoie un vecteurcolonne. Tester le script ci-dessous :for i=1:2:5

disp(i)endfor% sur une matricefor n=[1 5 2;4 4 4]nendfor

Rodolphe Charrier Introduction a Octave

Page 46: Slides octave1

La programmation en Scilab IV

RemarqueQuand cela est possible, on remplacera la boucle for par uneoperation matricielle, c’est a dire ”vectorisee” pour un gain enperformance.

Rodolphe Charrier Introduction a Octave

Page 47: Slides octave1

La programmation en Scilab V

Boucle While

Une boucle ”while” repete une sequence d’instructions demaniere conditionnee a la verification d’une expressionbooleenne.Tester le script ci-dessous qui calcule la somme des 10premiers entiers :s=0; i=1;while (i<=10)

s=s+ii=i+1

endwhile

Tester cette autre facon de faire :>>>sum(1:10)Comparez en augmentant le nombre utilise.

Rodolphe Charrier Introduction a Octave

Page 48: Slides octave1

La programmation en Scilab VI

Break-Continue

break permet de sortir definitivement d’une boucle.continue permet de sortir de l’iteration courante d’uneboucle.

Comparer l’execution des deux scripts qui suivent.Break :s=0; i=1;while (true)

if (i>10)break

endifs=s+ii=i+1

endwhile

Rodolphe Charrier Introduction a Octave

Page 49: Slides octave1

La programmation en Scilab VII

Continue :s=0; i=0;while (i<=10)

if (modulo(i,2)==0)i=i+1continue

endifs=s+ii=i+1

endwhile

Rodolphe Charrier Introduction a Octave

Page 50: Slides octave1

Les fonctions I

La demarche essentielle qui permet d’elaborer desprogrammes en Scilab, est basee sur la decompositionfonctionnelle.

De nombreuses fonctions predefinies sont disponiblesdans Octave.Un meme script peut comporter plusieurs fonctions quipeuvent s’appeler uniquement au sein du script.

Remarque

Pour appeler une fonction a l’exterieur du script ou elle estdefinie, celle-ci devra etre declaree en premiere ligne du scriptet porter imperativement le meme nom que le fichier du script.

Rodolphe Charrier Introduction a Octave

Page 51: Slides octave1

Les fonctions II

Declaration - appel d’une fonction

Syntaxe de declaration d’une fonction :function [arg_sortie, ...]=ma_fonction(arg_entree, ...)

Les arguments sont passes par valeur a la fonction et non parreference.

L’appel ulterieur de la fonction se fait par la syntaxe suivante :% si un seul argument de sortievar_out=ma_fonction(var_in1, var_in2,...);% si plusieurs arguments de sortie[var_out1, var_out2...]=ma_fonction(var_in1, var_in2,...);

Les variables declarees dans la fonction ont une portee localea la fonction. Pour les rendre visibles de l’exterieur de lafonction, il faudra les declarer precedee du mot-cle global.

Rodolphe Charrier Introduction a Octave

Page 52: Slides octave1

Les fonctions III

Exemple

Fonction predefinie : decomposition LU d’une matrice(executer les lignes d’instructions suivantes puis utiliser ”help”pour comprendre ce qu’elles font)

>>>A=rand(3,3);>>>[L,U]=lu(A)>>>[L,U,P]=lu(A)

Rodolphe Charrier Introduction a Octave

Page 53: Slides octave1

Les fonctions IV

Ecriture de fonctions

1 Declarer la fonction (nom arguments d’entree / sortie),2 utiliser des commentaires pour renseigner l’aide en ligne :

premiere ligne de commentaire immediatement apres ladeclaration, la ”H1-line” (utilisee par les commandes d’aidehelp ou lookfor)autres commentaires. . .

3 declaration des variables globales ou statiques s’il y en a(les variables statiques sont immuables et declarees par lemot-cle persistent),

4 ecriture du code proprement dit de la fonction etcommentaires associes,

5 penser a affecter des valeurs a chaque argument de sortie,6 fin de fonction signalee par le mot-cle endfunction.

Rodolphe Charrier Introduction a Octave

Page 54: Slides octave1

Les fonctions V

Exemple

Ecriture d’une fonction renvoyant un vecteur (a tester) :function [somme,produit]=fsomprod(a,b)%FSOMPROD somme et produit de 2 nombres, vecteurs ou matrices% Usage: [S,P]=FSOMPROD(V1,V2)% Retourne matrice S contenant la somme de V1 et V2,% et matrice P contenant le produit de V1 et V2% element par element%if (nargin˜=2) % donne le nombre d’arguments d’entree% message d’erreur si on a pas 2 arguments

error(’cette fonction attend 2 arguments’);endifif (˜ isequal(size(a),size(b)))

error(’les 2 arg. n’ont pas la meme dimension’);endifsomme=a+b;produit=a.*b; % produit element par element !endfunction % sortie de la fonction

Rodolphe Charrier Introduction a Octave

Page 55: Slides octave1

Les fonctions VI

Fonctions recursives

Ecrire la fonction ci-dessous dans un fichier ”facto.m” et fairedes tests d’execution sous Octave en se placant dans le memedossier que le script.function p=facto(n)

if n<=1p=1;

elsep=n*facto(n-1);endif

endfunction

Rodolphe Charrier Introduction a Octave

Page 56: Slides octave1

Utiliser une fonction comme argument d’une autrefonction I

Pointeurs sur des fonctions

Une fonction est elle-meme une variable du type ”function”.@ suivi du nom de la fonction donne un pointeur sur lafonction.Usage : comme entree d’une autre fonctionex : quad (integration) ou lsode (resolution de systemedynamique)

L’exemple suivant montre l’integration d’un sin sur [0, π] :>>>f1 = @sin;>>>quad (f1, 0, pi)ans = 2>>> feval(f1,pi/4)ans = 0.70711>>> f1(pi/4)ans = 0.70711

Rodolphe Charrier Introduction a Octave

Page 57: Slides octave1

Utiliser une fonction comme argument d’une autrefonction II

Fonctions anonymes

Syntaxe de generation d’une fonction anonyme :@(liste d’arguments) expression

Executer ces quelques exemples tires de la doc Octave :>>> f = @(x) x.ˆ2; % permet egalement de definir f>>> quad(f,0,10)>>> quad (@(x) sin (x), 0, pi) % en fonction anonyme>>> a = 1; b = 2; % les parametres sont values>>> quad (@(x) betainc (x, a, b), 0, 0.4)

Rodolphe Charrier Introduction a Octave

Page 58: Slides octave1

Utiliser une fonction comme argument d’une autrefonction III

Construction dynamique de fonctions

Definition d’une fonction ”in-line” par une chaine de caracteres :>>> f = inline("xˆ2 + 2");>>>f(2)ans = 6

Conversion de chaıne de caracteres en expression evaluableou en instructions executables : fonction evalfonction = input(’Quelle est la fonction y=fct(x) a tracer ?’,’s’);min_max = input(’Indiquez [xmin xmax] : ’);x = linspace(min_max(1),min_max(2),100);eval(fonction,’error(’’fonction incorrecte’’)’);plot(x,y);

La fonction feval, comme fplot (cf. diapo suivante), prendun pointeur de fonction en entree.

Rodolphe Charrier Introduction a Octave

Page 59: Slides octave1

Graphisme I

http://enacit1.epfl.ch/cours_matlab/graphiques.html

Complements (a tester)

fplot prend un pointeur de fonction ou une fonction”in-line” en entree :function [y]=sigmoid(x)y=1./(1 + exp(-20 .* (x - 0.25)));endfunction%fplot(@sigmoid, [0, 1], ’r’);

ezplot trace une fonction parametree en 3D par le memeparametre :>>>ezplot3(’t*sin(t)’,’t*cos(t)’,’t’,[0,10*pi]);

Rodolphe Charrier Introduction a Octave

Page 60: Slides octave1

Modelisation et systemes differentiels I

Matlab/Octave permet de resoudre numeriquement desequations differentielles par approximation.

Soit une equation avec une condition initiale (probleme deCauchy) :

du(t)dt

= f (t ,u(t))

u(t0) = u0

(1)

ou u : R→ Rn, u0 ∈ Rn et f : R× Rn → Rn.

Rodolphe Charrier Introduction a Octave

Page 61: Slides octave1

Modelisation et systemes differentiels II

La fonction lsode est la fonction Octave qui va permettre decalculer une solution numerique, c’est a dire de l’integrer sur unintervalle demarrant en t0, en partant du vecteur colonne u0.

Pour cela, il faut commencer par definir la fonction f duprobleme de Cauchy decrit ci-dessus (1). On la definit commeune fonction Octave classique :

function [f] = SecondMembreEDO(u,t)// on decrit ici les composantes de f

endfunction

Rodolphe Charrier Introduction a Octave

Page 62: Slides octave1

Modelisation et systemes differentiels III

Remarque

Meme si la fonction f est autonome (c’est a dire independantede t), il faudra quand meme mettre t comme second argumentde f (ou toute autre variable definissant le parametred’evolution).

Rodolphe Charrier Introduction a Octave

Page 63: Slides octave1

Modelisation et systemes differentiels IV

Exemple

On considere l’equation de Van der Pol :

y ′′ = c(1− y2)y ′ − y

que l’on reformule classiquement comme un systeme de deuxequations differentielles du premier ordre, en posant

u1(t) = y(t)u2(t) = y ′(t)

Soit le systeme equivalent

ddt

[u1(t)u2(t)

]=

[u2(t)

c(1− u21(t))u2(t)− u1(t)

]

Rodolphe Charrier Introduction a Octave

Page 64: Slides octave1

Modelisation et systemes differentiels V

Ce que l’on decrit par la fonction Octave suivante, en fixantc = 0.4 :function [f] = vanDerPol(u,t)

f(1)=u(2)f(2)=0.4*(1-u(1)ˆ2)*u(2) - u(1)

endfunction

Pour resoudre numeriquement l’equation, il faut donc definirune distribution uniforme de valeurs de t sur un intervalle, apartir de t0, et une condition initiale pour les variables u. Onappelle ensuite la fonction lsode ainsi :t = linspace(t0,T,m);[U] = lsode("vanDerPol",u0, t);

On recupere alors une matrice U telle que U(i , j) est la solutionapprochee de ui(t(j)).

Rodolphe Charrier Introduction a Octave

Page 65: Slides octave1

Modelisation et systemes differentiels VI

printf("Resolution d’une equation de Van der Pol.\n");% declaration de la fonction en second membrefunction [f] = vanderpol(u,t)

f(1)=u(2);f(2)=0.4*(1-u(1)ˆ2)*u(2)-u(1);

endfunction

% trace des lignes de champclf;[x, y] = meshgrid (-5:0.5:5);h = quiver (x, y, y, 0.4*(1-x.ˆ2).*y-x,0.5);set (h, "maxheadsize", 0.1);hold on;

% calcul de la solution avec la condition initiale :m=500;T=30;t=linspace(0,T,m);u0 = [-2.5; 2.5];% marquage de la condition initialeplot(u0(1),u0(2),’b*’);

Rodolphe Charrier Introduction a Octave

Page 66: Slides octave1

Modelisation et systemes differentiels VII

%affichage de la solution[u] =lsode("vanderpol",u0,t);plot(u(:,1),u(:,2),’r’);

%titre, legendes, etc...title(’Equation de Van Der Pol : plan de phase (y(t), dy(t)/dt)’);xlabel(’y(t)’); ylabel(’dy(t)/dt’);

hold off;figure;plot(t,u);legend(’y(t)’,’dy(t)/dt’);

Rodolphe Charrier Introduction a Octave

Page 67: Slides octave1

Modelisation et systemes differentiels VIII

Figure: Trace du champ de vecteur et de la solution de l’equation deVan der Pol

Rodolphe Charrier Introduction a Octave