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 ","
- 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)))}
- 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;
- 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.
- 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:
- 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!
- 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
- mais WIMS accepte les lignes blanches
- 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!
- 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 }
- 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
- 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!
- 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)
) }
- 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}
- 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