%% Tutoriel Matlab - M2 IMPE 2024
%% Introduction
%
% Dans ce chapitre on présente le système Matlab, puis  les éléments de syntaxe suivants
% Les variables
% Les graphes
% Les fonctions
% Les structures de contrôle
%%
% Le point très important qui est l'utilisation des "boîtes à outils" (toolboxes) sera abordé au cours du chapitre sur l'optimisation
%
% On pourra trouver une introduction plus exhaustive  à Matlab  sur le site web de l'éditeur Mathworks.org, en particulier des tutoriels interactifs en anglais :
%
% Les étudiants inscrits à Sorbonne Université peuvent bénéficier de la  licence Campus qui leur permet d'installer Matlab gratuitement sur leur machine.
% https://logiciels.sorbonne-universite.fr/fr/marches_conclus_par_l_upmc/matlab.html
% Ils peuvent  également utiliser Matlab sans l'installer sur leur ordinateur par l'intermédiaire du bureau à distance de l'UTES
%
% Quand on lance Matlab, soit en cliquant sur l'icone, soit en tapant la commande "matlab" dans une fenêtre terminal, on voit apparaître l'environnement par défaut composé de la fenêtre de commande et de la liste des fichiers dans le répertoire courant.
% Suivant les systèmes, ce répertoire sera, le "home directory" ou bien le répertoire où est installé matlab. Dans tous les cas, il est très important d'aller tout de suite se positionner dans le répertoire où l'on veut travailler.
%
% Une autre fenêtre très utile, qu'on peut ouvrir dès le début du travail, est la fenêtre d'aide (Help) (loupe en haut à droite )
%
% Pour tester des enchaînements de commandes matlab on peut
%  Les taper dans la fenêtre de commandes
%  Les taper dans l'éditeur de texte, les sauver dans un fichier de type NomDuScript.m, et les exécuter en tapant NomDuScript dans la fenêtre de commandes
%
% La deuxième méthode, moins immédiate, présente l'avantage de garder la mémoire des commandes testées. C'est celle à utiliser pendant les TP.
%
% On accède à l'éditeur soit en cliquant sur le nom d'un fichier .m dans la colonne de gauche, soit en ouvrant un nouveau fichier vide (première icône), soit en sélectionnant Editor  à partir du menu Desktop.
%
%
% On utilisera le mot script pour désigner les fichiers .m contenant des enchainements de commandes, qui s'appelleraient  programme principal dans des langages comme C ou Fortran et on utilisera le terme de  function pour les enchaînements de commandes désignées dans d'autres langages par fonction/function ou macro ou  sous-programme/sub-routine.
%
%
%% Type de données
%
% Pas de déclaration de type. Reconnaissance du type des variables par
%   leur valeur (pas de distinction entre les entiers et les réels (?)).
% Syntaxe spécifique pour la manipulation des vecteurs et matrices
% Type complexe (structure) pour regrouper des variables de types différents
%% Vecteurs

v=[2;3;7] % vecteur colonne composantes r{\'e}elles-  

%
% Comparer la commande précédente et la commande

v=[2;2;2]; % vecteur colonne composantes r{\'e}elles-  

% Afficher la valeur de v :

%votre réponse ici

% A-t-elle bien été modifiée ? Souvenez-vous dans la suite du rôle du ;

%vecteur ligne composantes complexes, i^2 =-1
v=[2,-3+i,7]
v'  % vecteur transconjugu{\'e}
v.' % vecteur transpos{\'e} 

%

w=[-3;-3-i;2] % un autre vecteur colonne
v+w'  % somme de deux vecteurs 
v*w % produit scalaire euclidien 
w'.*v % produit des composantes terme {\`a} terme 
w'./v    % division des composantes terme {\`a} terme      
w.^3     % puissance 3 de chaque composante. 
v=1:5.1:23     % vecteur {\`a} incr{\'e}ment constant 
% vecteur de m{\^e}me taille que v et contenant des 1 
ones(size(v)) 
 % vecteur ligne {\`a} 4 composantes {\'e}gales {\`a} 1 
ones(1,4)

% vecteur ligne {\`a} 5 composantes {\'e}gales {\`a} 3 
3*ones(1,5)  

%

zeros(3,1)  % vecteur colonne 3 composantes nulles 

%% Erreur la plus fréquente : Incompatibilité des dimensions

a=ones(1,3)
b=ones(2,1)
a + b    % HORREUR !!!!
b=ones(2,2)
%a+b

%% Matrices
%  une manière de définir une matrice 3 x 3:
%

A=[1,2,3;0,0,atan(1);5,9,-1]

% une autre syntaxe pour faire la même chose
%

A=[1 2 3                
    0 0 atan(1) 
    5 9 -1] 

%

v=1:5
W=v'*v      % multiplication de matrices 
W(1,:)            %extraction de  la premi{\`e}re ligne 

%

A=eye(3,3)     % Matrice identité
B=toeplitz([2,1,0,0])   % une matrice de Toeplitz 
C=zeros(2,5)  % que des zéros 
D=ones(3,3) % ou que des uns 

%% Autres opérations sur les tableaux

u=[0:1:4] 
v=sin(u)  
v=[sin(u(1)),sin(u(2)),sin(u(3)),...    
    sin(u(4)),sin(u(5))] 
A=rand(2,3) 

% Comment accède-t-on à A_{1,2} ?

%votre réponse ici

%
%

A=rand(1,5) 

% Que fait la commande suivante ?

find(A>0.5) 

% Votre réponse ici :
% Que fait la commande suivante ?

find(A) 

% Votre réponse ici :
% Que fait la commande suivante ?

find(A==0.2) 

% Votre réponse ici :
%
%% Graphisme
% Création d'un graphique
%
%

x=0:pi/100:2*pi;
y=sin(x);
plot(x,y)
xlabel('x=0:2 pi')
ylabel('Sinus de x')
title('Graphe de la fonction sinus','Fontsize',12)

%
% Plusieurs courbes sur le même graphique

x=0:pi/100:2*pi;
y1=sin(x);
y2=sin(x+0.5);
y3=sin(x-0.5);
plot(x,y1,'-',x,y2,'-o',x,y3,'-x')
legend('sin(x)','sin(x+0.5)','sin(x-0.5)')

%% Autres fonctions graphiques de base
% Spécification du type de ligne et de la couleur
% plot(x,y,'CouleurEtTypeDeLigne')
%
% Couleurs: 'c','m','y','r','g','b','w','k'
% Style de lignes : '-', '--',':','-.' ou rien
% Types de marqueurs : '+', 'o', '*', 'x', et aussi 's' (carr{\'e}),'d'(losange), '$\land $'  ,'$>$', '$<$' (triangles), 'p' (pentagone), 'h' (hexagones)
% Exercice : dans l'exemple précédent, afficher la première courbe en rouge, la deuxième en bleu et la troisieme en noir, sans rien changer aux types de lignes et marqueurs

% votre réponse ici



% Ajouter quelque chose àun graphe, effacer une fenêtre
%

hold on  % garde la fenêtre 
hold off  % rafraîhit au prochain plot
drawnow  % affiche les graphes (dans une boucle)
figure , figure(n)  % ouvre une nouvelle figure
clf reset  % restaure les propriétés graphiques par défaut

%% Graphiques multiples
%

x=0:pi/100:2*pi;
y1=sin(x); 
y2=cos(x);
y3=sin(2*x); 
y4=cos(2*x);
subplot(2,2,1);
plot (x,y1);
title('sin(x)')
subplot(2,2,2); 
plot (x,y2); 
title('cos(x)')
subplot(2,2,3); 
plot (x,y3); 
title('sin(2x)')
subplot(2,2,4);
plot (x,y4); 
title('cos(2x)')

%
%% Exercice sur les vecteurs et le graphisme
% On rappelle une approximation  de la  dérivée d'une fonction par différences finies f'(x)\approx \frac{f(x+h)-f(x)}{h}
%
% Définir  les variables h=0.1, dx=\pi/100  et un tableau d'abscisses x pour  discrétiser finement l'intervalle [0,\pi],  de telle sorte que x_i=i~dx   pouri=0,\ldots,100.   On utilisera la fonction matlab linspace

%votre réponse ici

% Calculer dans un tableau d la dérivée exacte de la fonction sinus aux points x et dans un tableau d1  les valeurs approchées par la   formule aux différences finies ci-dessus.

%votre réponse ici

% Calculer l'erreur maximale commise en faisant cette approximation sur
% l'intervalle  [0,\pi]. Diminuer h, que remarque-t-on?
%

%votre réponse ici

%  Représenter sur le même graphique la dérivée et son approximation, sur l'intervalle  [0,\pi].

%votre réponse ici

%
%
%
%
%
%% Fonctions et macros
%% Définition d'une fonction
% Une fonction est définie dans un fichier nommé NomDeLaFonction.m  par une
% première ligne de déclaration, suivie des commandes de calcul du résultat de la fonction
%
% function [Résultats]=NomDeLaFonction(Données)
% ...
% Commandes utilisant les données ou arguments d'entrée, spécifiés entre parenthèses
% et calculant les  résultats ou arguments de sortie, spécifiés entre crochets
% ...
% ...
%
% La fonction est utilisée par appel de son nom (sans le .m). L'utilisation d'une fonction a lieu soit directement dans la fenêtre de commande, soit dans un script ou une autre fonction.
% Les instructions contenues dans la fonction sont effectuées avec les arguments d'entrée portant les valeurs transmises sur la ligne d'appel de la fonction.
% [s1,s2,...]=NomDeLaFonction(e1,e2,...)
% s1=NomDeLaFonction(e1,e2,...)
% NomDeLaFonction(e1,e2,...)
% Exemple
% Dans le fichier longueur.m
%

function [s]=longueur(x,y) 
s=sqrt(x^2+y^2)
end


%
% Dans la fenêtre de commandes:

longueur(2,3) 
l=longueur(2,3)
u=3
v=45
r=longueur(u,v)

%
%% Attention !
% Les arguments d'entrée d'une fonction doivent être utilisés au moins une fois dans le corps de la fonction
% avant d'être reaffectés (à gauche du signe égal). Les arguments d'entrée sont passés "par valeurs". Même s'ils sont modifiés localement au cours de l'exécution de la fonction,  leur valeur  reste inchangée dans le programme appelant.
% Question :
% modifier la fonction pour que seul le résultat de la commande d'appel soit affiché

%votre réponse ici

%
%% Arguments de sortie / résultats  multiples:
% Dans le fichier polaire.m, définir la fonction

function [r,theta,sum]=polaire(x,y) 
r=sqrt(x^2+y^2); 
theta=atan(y/x); 
sum=x+y; 
end

%
% Dans la fenêtre de commandes Matlab, tester les commandes

polaire(2,3)  
rho=polaire(2,3)  
[rho,theta]=polaire(2,3) 
[rho,theta,s]=polaire(2,3) 

% Comment faire si on a besoin uniquement  de la somme des composantes  ?

% votre réponse ici


%% Les "macros"

f = inline('sin(alpha*(x+y))','x','y','alpha') 

%

f(0.2,0.3,pi) 
% équivalent à 
f = inline('sin(alpha*(x+y))') 

%  % et à

f = inline('sin((x+y)*alpha)') 

%
% Quelles sont les différences entre ces  définitions? Que peut-on en déduire sur la règle par défaut pour les paramètres d'appel d'une fonction "inline" ?
%
% Votre réponse :
%
%
%
%% Fonctions et tableaux
% La même fonction Matlab peut être utilisée avec en argumentd es scalaires ou des tableaux
%

x=1
v=rand(3,4);
sin(x)
sin(v)					
function y=f1scal(x)
y=(x^5-3)/sqrt(x^2+1);
end

%
% Que se passe-t-il si on essaye d'appliquer la fonction f1scal  au tableau v ?

f1scal(x)
% expliquer pourquoi la commande f1scal(v) renvoie une erreur

% Définir une fonction f1vec permettant l'appel à un scalaire ou un vecteur
%

% votre réponse ici :

% Exercice :
% Programmer la fonction f(x)=\frac{x^5-3}{\sqrt{x^2+1}}

%votre réponse ici

%
% Tester la fonction sur quelques valeurs, par exemple
% f(1)=-1.4142
% f(0)=-3
%  Créer un tableau x  d'abscisses de  -5  à 5 par pas de 0.1

%votre réponse ici

% Représenter la fonction f aux points x_i, avec la commande plot(x,f(x))

%votre réponse ici

%
% Modifier si besoin la fonction pour que ceci soit possible.
%
% Exercice
% Reprendre  l'exercice sur l'approximation de la dérivée et écrire une fonction erreur recevant en argument d'entrée le paramètre h et renvoyant en sortie  l'erreur maximale en valeur absolue entre la discrétisation et la valeur exacte de la  dérivée de la fonction sinus

%votre réponse ici

%
% Exercice
% Ecrire une fonction R prenant en argument d'entrée un vecteur colonne x de dimension quelconque et renvoyant en sortie la valeur de la fonction y=R(x)  et de son gradient g= \nabla R(x). La fonction R(x) est définie par            R(x)=n+|\!|x|\!|-\displaystyle\sum_{i=1}^n\cos(2x_i)

%votre réponse ici

%% Structures de contrôle
%% La boucle for
%

x=1; 
for k=1:4
    x=x*k
end 

%
%
%
%
% Incrémentation d’un tableau dans une boucle for

function y=MaFonction(x)
    y=1;
end

%

X=0:100;
for i=1:length(X)
    Y(i)=MaFonction(X(i));
end

%
% Comment faire pour se passer des indices...
%

X=0:100;
Y=[];
for x = X    
    y=MaFonction(x);
    Y=[Y,y]; 
end 				

%
%% La boucle while
%

x=1; 
while x<14
    x=x+5
end 

%
% Instructions continue et break pour rester dans ou sortir d’une boucle.
%
%% Les tests
%
% Le résultat d’une opération logique est une variable booléenne qui prend les valeurs vrai=1 ou faux=0
% Test if-then-else

x=16 
if x>0, 
    y=-x, 
else 
    
    y=x,
end 

%
% Test switch-case
%
% switch expression
%     case case_expr
%         commande,... ,commande
%     case {case_expr1,case_expr2,case_expr3,...}
%         commande,... ,commande
%     otherwise
%         commande,... ,commande
% end
%
% Tests sur les tableaux
%

    function y=test1(x)
    if x>0.5
        y=1
    else
        y=0
    end
    end

%
% appliqué}e sur un tableau v=rand(2,3) par exemple, la fonction renvoie le résultat scalaire du test vérifié par toutes les composantes.
% Ici 1 si toutes les composantes sont >0.5 et 0 sinon
%
% Comment faire pour récupérer le résultat du test sur chaque composante de v
%

% votre solution 

%% Exercice sur les boucles
% Définir un vecteur H contenant des valeurs croissantes entre 10^{-10} et 0.1  (utiliser la fonction logspace).
% Utiliser une boucle for pour appeler la fonction erreur de l'exercice précédent  avec l'argument d'entrée  h prenant successivement les valeurs contenues dans H.
% Stocker l'erreur renvoyée par la fonction dans la composante correspondante d'un vecteur E.
% Représenter graphiquement l'erreur en fonction du paramètre h à l'aide   de la commande loglog(H,E)(au lieu de plot(H,E)).
% Superposer la droite correspondant au comportement asymptotique attendu.
% Que remarque-t-on?

%votre réponse ici

%
%
%
%
%
%
%
%
%