Matrices dans WIMS; exercices de calculs numériques avec le logiciel de calcul numérique Octave.



La manipulation de matrices est délicate car WIMS d'une part et un logiciel de calcul formel ou numérique d'autre part n'ont pas la même présentation d'une matrice:
WIMS demande la séparation de lignes par ";" et sépare les éléments d'une ligne par ","
  1. Utilisation de Maxima: le passage d'une matrice à Maxima ne se fait pas comme pour Pari;  voici comment fournir une matrice à maxima:d:matrix([2,-1,0],[-1,2,-1],[0,-1,2]); à ma demande, G. Xiao a réalisé un slib (maximamatrix)  qui permet de transformer une matrice wims en une matrice maxima; voici un exemple
     \text{mat=slib(matrix/givenrank 3,1,3,20)}
    \text{mm=slib(text/maximamatrix \mat)}
    \text{rank=maxima(rank(matrix(\mm)))}

  2. Il est bien connu que les valeurs propres de grandes matrices ne peuvent être calculées que numériquement en dehors de quelques cas particuliers; le logiciel de calcul formel Maple a prévu cette fonctionnalité numérique; il n'est pas utilisé par WIMS;  Pari comme Maxima n'ont pas prévu cette possibilité de calcul numérique; en revanche le Octave permet ceci ainsi que de nombreuses autres fonctionnalités numériques comme la résolution approchée de systèmes d'équations différentielles ou la transformée de  Fourier  rapide;
  3. La possibilité d'utiliser Octave dans WIMS ouvre donc un champ immense d'exercices autour de la résolution numérique effective d'équations de diverses natures ainsi que de la programmation d'algorithmes.
  4. Comme je développe des exercices d'analyse de données, j'ai été amené à gérer un aller retour de matrice entre Wims et Octave; après un début d'aide par B. Perrin, voici un exemple réalisé avec l'aide de G. Xiao:
    \text{ a1 = wims(exec octave [2,-1,0,0,0,0,0;
    -1,2,-1,0,0,0,0;
    0,-1,2,-1,0,0,0;
    0 ,0,-1,2,-1,0,0;
    0 ,0, 0, -1,2,-1,0;
    0 ,0, 0, 0,-1,2,-1;
    0, 0 ,0, 0,0,-1,2])}
    \text{a=wims(lines2rows wims(rawmatrix \a1))}
    \text{lamdaa= wims( exec octave aa= [\a]; lamdaa=eig(aa); disp(lamdaa) )}
    Attention: 
    1. pour récupérer la matrice dans octave (dernière ligne ci-dessus), il ne faut pas oublier les crochets: aa=\a ne récupère que le premier coefficient de la matrice!
    2. les lignes de commentaires de octave: commencent par #: ne sont pas comprises par WIMS mais on peut les remplacer par une variale chaine de caractères
    3. mais WIMS accepte les lignes blanches
    4. Méthodologie: générer les matrices aléatoires avec octave; les recupère dans WIMS; les repasser a octave pour les calculs; recupérer tous les résultats dans un grand tableau; le repasser a octave plusieurs fois pour récupérer les tableaux utiles!
  5.  Il reste l'utilisation de résultats matriciels: une réponse de type matriciel est prévu par WIMS mais le résultat doit être fourni en arithmétique exacte; après discussion avec G. Xiao, j'ai convenu que cela ne pouvait pas être géré par WIMS car l'évaluation de la qualité d'un résultat numérique dépend beaucoup du problème (choix de la norme matricielle); je me suis donc initié à la commande \condition; j'ai rencontré une difficulté: la matrice récupérée dans \reply1 n'est pas organisée avec les , et ;  et oui! Fort de mon expérience précédente je la transforme avec rawmatrix; je calcule avec Octave une norme matricielle; pour déboguer, je me suis initié a \if{debug iswprdof oefenv}{...variables } et \feedback; voici un exemple:
    \answer{\(\tilde{P}_{a}b=)}{[\Ptildeb]}{type=matrix}
    \text{rep1=wims(lines2rows wims(rawmatrix \reply1))}

    \real{ err= wims(exec octave rep1=[\rep1]; Ptildeb=[\Ptildeb_r]; errv=rep1-Ptildeb;
    err=norm(errv,Inf); disp(err) ) };
    \feedback{ \err< 0.001 }{"feedback":réponse acceptée si norme (du sup) de l'erreur < 0.001; ici erreur= \err }
    \feedback{ \err>= 0.001 }{"feedback":réponse pas acceptée si norme du sup de l'erreur >= 0.001; ici erreur= \err }

    \condition{Réponse acceptée si norme (du sup) erreur < 0.001 }{ \err< 0.001 }
  6. Une difficulté imprévue: si l'étudiant répond avec une matrice qui n'a pas la bonne taille, octave crache 3 lignes pour expliquer l'erreur dans la ligne errv=rep1-Ptildeb; (différences de 2 matrices de taille différentes) et pour une raison que je ne comprend pas bien WIMS récupère zéro dans err
  7. L'utilisation de if endif aurait permis de résoudre cette difficulté, mais pour des raison liées aux point virgule en fin de ligne, je n'ai pas pu utiliser de if endif dans un programme octave utilisé par WIMS. Difficulté résolue: la ligne qui contient le if et celle du endif doivent ne doivent pas être suivies d'une autre instruction, même séparées par un point virgule!
  8. Pour contourner cette difficulté , j'ai construit 2 nouveaux tableaux plus grands mais de même taille:
    \real{ err= wims(exec octave rep1=[\rep1]; lamda=[\lamda]; [lr,cr]=size(rep1);[lla,cla]=size(lamda); rep1rep=repmat(rep1,lla,cla); lamdarep=repmat(lamda,lr,cr); errv=rep1rep-lamdarep; err=norm(errv,Inf)/(cla*cr); disp(err) ) }
  9.    Notes de l'étudiant avec sortie matricielle; la fin de l'exercice ci-dessus ne convient pas pour la note  car si la matrice n'est pas exacte, Wims  compte l'erreur. Pour s'en sortir, G. Xiao, m'a suggéré de désactiver cette vérification en mettant dans la réponse une variable non définie et sans crochets!
     \answer{\(\tilde{P}_{a}b=)}{\PPPPPtildeb}{type=matrix} 
  10. Voici un exemple complet ; calcul des valeurs propres d'une matrice 7x7 :
 \title{val. p. mat 7x7 sym. random (octave)}
\language{fr}
\range{-5..5}
\author{B. Rousselet}
\email{br@math.unice.fr}
\computeanswer{yes}
\format{html}
\precision{100}
\integer{eps=10}
\integer{taille=7}
\text{ a = wims(exec octave taille=\taille; b=rand(taille,taille); a=b'*b;
;format long  e; disp(a)
 )}
\text{a=wims(lines2rows wims(rawmatrix \a))}

\text{lamdaa= wims( exec octave aa= [\a]; lamdaa=eig(aa); disp(lamdaa)   )}
\text{lamda=wims(lines2rows wims(rawmatrix \lamdaa) )}


\statement{calculer les valeurs propres  de \(a) (rangées par ordre croissant) avec:

\(a=[\a]) et pour couper-coller:
a=[\a]

\if{ debug iswordof \oefenv}{###(lamda=[\lamda]) #### err=\err#####rep1=[\rep1]#######
rep=[\reply1]!! !}

}
\answer{\(lambda)}{\lllamda}{type=matrix}

\text{rep1=wims(lines2rows wims(rawmatrix \reply1))}

\real{ err= wims(exec octave  rep1=[\rep1]; lamda=[\lamda]; 
   [lr,cr]=size(rep1);[lla,cla]=size(lamda);
   rep1rep=repmat(rep1,lla,cla); lamdarep=repmat(lamda,lr,cr);
   errv=rep1rep-lamdarep; err=norm(errv,Inf)/(cla*cr);  disp(err)  
 ) }
\feedback{  \err < 0.001 }{"feedback": réponse acceptée si norme (du sup) de l'erreur < 0.001; ici erreur= \err et \(lambda= [\lamda])  }
\feedback{  \err >= 0.001 }{"feedback": réponse pas  acceptée si norme du sup de l'erreur >= 0.001; ici erreur= \err et \(lambda= [\lamda] )}
\condition{Réponse acceptée si norme (du sup) erreur < 0.001 }{  \err< 0.001 }

On notera l'utilisation de
\if{ debug iswordof \oefenv}{###(lamda=[\lamda]) #### err=\err#####rep1=[\rep1]####### 
ceci permet au prof d'avoir accès à des variables sans que les étudiants les voient!


Pour la situation pédagogique de mon expérience et les difficultés de l'implémentation avec Wims, voir "Trouble and improvements in the use of wims " for numerical purposes.
Copyright (C) décembre 2004 B. Rousselet. Verbatim copying and distribution is permitted in any medium, provided this notice is preserved. B. Rousselet,
U.N.S.A. Laboratoire J.A. Dieudonné
U.M.R. C.N.R.S. 6621, Parc Valrose, F 06108 Nice, Cedex 2, email: br@math.unice.fr

Valid HTML 4.01!