L'utilisation de l'add-in ExtraPython pour le calcul matriciel sur Fx 9750 Giii
Posté le 04/08/2023 02:54
Cher communauté,
Je voudrais partager avec vous une problématique que je rencontre concernant les capacités matricielles du module MicroPython sur ma calculatrice Casio fx 9750 giii (équivalent internationale de la Graph 35 E++). Comme beaucoup d'entre vous le savent, le module MicroPython inclus dans la calculatrice est assez limité, notamment en ce qui concerne les calculs matriciels, qui sont essentiels pour mes besoins en ingénieurie. J'ai récemment découvert une alternative prometteuse, le port PythonExtra, qui vise à étendre les fonctionnalités de MicroPython pour les calculatrices Casio. Ce port offre des perspectives intéressantes et pourrait répondre à mes besoins en matière d'opérations matricielles.
Cependant, même avec PythonExtra, je me suis heurté à des difficultés pour exécuter des scripts Python qui fonctionnent parfaitement sur PC, notamment ceux qui utilisent le calcul matriciel standard sans numpy et ceux utilisant le module numpy. Malgré mes efforts, je continue de rencontrer des erreurs lors de l'exécution de ces scripts sur ma calculatrice (ci-joint un exemple typique). J'ai également essayé la version de Dr. Parisse, mais j'ai obtenu le même résultat avec une série d'erreurs qui m'empêchent d'exploiter pleinement ces fonctionnalités matricielles.
C'est pourquoi j'en appelle à la communauté pour solliciter votre expertise et vos conseils. Si certains d'entre vous ont réussi à faire fonctionner ce type de script sur la Graph 35 E++ avec PythonExtra ou autre méthodes, je serais extrêmement reconnaissant de recevoir vos instructions ou astuces.
En outre, j'ai découvert un module MicroPython appelé umatrix (
https://github.com/iyassou/umatrix), qui semble répondre parfaitement à mes besoins en matière d'opérations matricielles. Cependant, l'importation de ce module dans l'environnement Python original a échoué en raison de l'utilisation de la classe @property, qui n'est pas prise en charge par le MicroPython de Casio. Je me demande si PythonExtra prend en charge cette fonctionnalité, ce qui me permettrait d'utiliser umatrix sur ma calculatrice.
Enfin, je me demande s'il serait possible d'ajouter le module ulab à cette distribution de MicroPython sur la calculatrice. Si vous avez des instructions ou des conseils sur la faisabilité de cette démarche, je serais ravi de les entendre.
Je tiens à remercier chaleureusement Lephé pour ses conseils concernant PythonExtra, qui semble être une base intéressante pour améliorer les capacités matricielles de la calculatrice. Je suis conscient que je ne suis pas le seul à faire face à ces défis, et je suis convaincu que la communauté peut apporter des solutions et des idées novatrices pour améliorer l'expérience Python.
Merci infiniment pour votre temps et votre soutien.
Fichier joint
Citer : Posté le 04/08/2023 09:54 | # | Fichier joint
Vu que la bibliothèque umatrix est assez simple, je l'ai modifiée pour retirer les @property.
Le script en PJ fonctionne parfaitement (en tout cas comme la bibliothèque originale).
Seule chose que ça modifie, les méthodes accessible en tant que propriétés doivent être appelées en tant que méthode (donc avec les parenthèses) :
A.order()
A.is_square()
A.shape()
A.rows # Attention c'est la seule "vraie" propriété !
A.cols()
A.det()
A.inverse()
A.transpose()
A.trace()
Edit : Lephe tu pense que c'est jouable d'ajouter le décorateur à l'interpréteur ?
Citer : Posté le 04/08/2023 10:01 | #
Je répondrai plus en détail quand j'aurai un peu plus de temps mais
@property est déjà supporté.
@property
def y(self):
return 2
x = X()
print(x.y)
2
Le bug doit venir d'ailleurs.
Citer : Posté le 04/08/2023 12:41 | #
J'ai réessayé de faire un test matriciel simple avec cette fois-ci Python Extra et umatrix (sans enlever le @property), mais cela donne une erreur MemoryError: memory allocation failed, allocating %u bytes.
Mon code initial est simplement :
A = matrix([1, 2, 3], [4, 5, 6], [7, 8, 9])
M = matrix([12, 23, 31], [40, 50, 60], [71, 87, 98])
Sur le module Casio officiel ainsi que sur PC, si j'enlève le @property, alors ça donne des erreurs si j'essaie d'ajouter les matrices ensemble :
A+A ou A+M donne:
assert shape == other.shape
AssertionError
Pour A*2 ca donne sur le module casio officiel:
Sur PC, A * 2 marche normalement.
Le module PythonExtra ne me permet même pas de lancer le script pour commencer à tester, avec ou sans @property.
Je suis tout confus quant à ce que je dois faire, et le pire c'est que les formules que j'essaie de programmer sont des sommes interactives (comme dans l'exemple que j'ai ci-joint au début) donc je pense que ça va être la galère pour faire fonctionner...
Citer : Posté le 12/08/2023 18:45 | #
micropy a un module natif linalg qui utilise des listes de listes pour stocker une matrice et des fonctions comme add, mul pour additionner/multiplier des matrices, et au-dessus un module numpy qui permet d'utiliser quelques commandes avec une syntaxe proche de numpy, mais évidemment pas avec une compatibilité complète, loin de là! Si vous trouvez un bug en les utilisant, pouvez-vous m'indiquer les commandes utilisées?
Ceci étant, si vous voulez faire du calcul matriciel sur la 35eii ou son équivalent et pas juste utiliser sur calculatrice un programme Python numpy existant, je vous conseille plutot d'installer khicas.g1a et d'utiliser directement les commandes de Xcas pour faire du calcul matriciel, vous disposez d'un assistant pour rentrer une matrice, il y a de nombreuses fonctions mathématiques déjà programmées (inverse, déterminant, réduction sous forme échelonnée, valeurs, vecteurs propres, ...) avec des menus pour y accéder et de l'aide en ligne, la syntaxe est simple (+ ou * pour additionner, multiplier des matrices...) et si vous voulez écrire des programmes, vous pouvez aussi le faire en syntaxe Python.
Citer : Posté le 20/08/2023 13:13 | # | Fichier joint
Désolé pour le délai, j'ai fini par oublier de regarder. o(x_x)o
Sur Graph 90+E, le script suivant avec une version non modifiée de umatrix.py (donc avec les @property)
A = matrix([1, 2, 3], [4, 5, 6], [7, 8, 9])
M = matrix([12, 23, 31], [40, 50, 60], [71, 87, 98])
print(A+A)
print(A+M)
print(A*2)
se lance et affiche A+A et A+M avant d'échouer sur A*2.
J'ai regardé dans MicroPython et en effet j'avais juste oublié d'activer les opérateurs __mul__, __rmul__, etc. J'ai changé dans les sources et donc maintenant l'exemple marche, y compris avec A*2 et 2*A. Je joins un g3a.
Sur Graph 35+E II, ça échoue toujours mais par manque ed RAM (MemoryError: memory allocation failed). Ça c'est plus subtil, je vais voir ce que je peux faire...
Citer : Posté le 20/08/2023 21:39 | # | Fichier joint
Pour info, j'ai convergé vers le plan d'aller chercher la mémoire de l'add-in Python officiel pour l'ajouter aussi à PythonExtra. J'ai fait quelques étapes de reverse-engineering pour aller chercher les adresses, mais je suis arrivé au bout du temps que j'avais aujourd'hui, donc il faudra que je continue une autre fois.
En attendant, la solution facile c'est de retirer du code pas nécessaire de umatrix.py...
(J'ai quand même rajouté de la RAM, 32 ko → 45 ko environ, je joins un g1a.)
Citer : Posté le 21/08/2023 19:58 | #
micropy a un module natif linalg qui utilise des listes de listes pour stocker une matrice et des fonctions comme add, mul pour additionner/multiplier des matrices, et au-dessus un module numpy qui permet d'utiliser quelques commandes avec une syntaxe proche de numpy, mais évidemment pas avec une compatibilité complète, loin de là! Si vous trouvez un bug en les utilisant, pouvez-vous m'indiquer les commandes utilisées?
Ceci étant, si vous voulez faire du calcul matriciel sur la 35eii ou son équivalent et pas juste utiliser sur calculatrice un programme Python numpy existant, je vous conseille plutot d'installer khicas.g1a et d'utiliser directement les commandes de Xcas pour faire du calcul matriciel, vous disposez d'un assistant pour rentrer une matrice, il y a de nombreuses fonctions mathématiques déjà programmées (inverse, déterminant, réduction sous forme échelonnée, valeurs, vecteurs propres, ...) avec des menus pour y accéder et de l'aide en ligne, la syntaxe est simple (+ ou * pour additionner, multiplier des matrices...) et si vous voulez écrire des programmes, vous pouvez aussi le faire en syntaxe Python.
Je vous remercie sincèrement pour les informations que vous avez partagées concernant Micropy, ainsi que pour vos conseils sur l'utilisation de khicas.g1a pour les calculs matriciels. Votre expertise est inestimable et je suis reconnaissant de pouvoir bénéficier de vos connaissances. En ce qui concerne khicas.g1a, je reconnais son potentiel en tant qu'outil puissant pour le calcul matriciel. Cependant, je trouve que son utilisation peut être un peu complexe, surtout pour moi qui ne suis pas très à l'aise avec ces concepts avancés. Actuellement, je l'utilise principalement pour des calculs plus simples de type calcul différentiel, intégration algébrique et autre. Je me demande néanmoins si je pourrais exploiter davantage ses fonctionnalités pour automatiser mes calculs et gagner en efficacité. Auriez-vous des suggestions ou des ressources que je pourrais consulter pour mieux maîtriser khicas.g1a et en tirer le meilleur parti pour mes besoins spécifiques?
Je vous remercie également pour votre suggestion d'utiliser les modules natifs et numpy dans Micropy pour les opérations matricielles. Cependant, je me sens plus à l'aise avec la programmation sur l'ordinateur et ensuite de porter le programme. J'ai également installé Xcas sur mon ordinateur, mais je ne suis pas très sûr de la meilleure manière de l'utiliser pour automatiser mes calculs et ensuite porter le résultat sur la calculatrice. Si vous avez des conseils supplémentaires à partager ou des ressources spécifiques à recommander à ce sujet, je vous en serais extrêmement reconnaissant.
Pour info, j'ai convergé vers le plan d'aller chercher la mémoire de l'add-in Python officiel pour l'ajouter aussi à PythonExtra. J'ai fait quelques étapes de reverse-engineering pour aller chercher les adresses, mais je suis arrivé au bout du temps que j'avais aujourd'hui, donc il faudra que je continue une autre fois.
En attendant, la solution facile c'est de retirer du code pas nécessaire de umatrix.py...
(J'ai quand même rajouté de la RAM, 32 ko → 45 ko environ, je joins un g1a.)
Merci pour ta réponse et d'avoir pris le temps d'analyser le problème avec umatrix.py sur les calculatrices Graph 90+E et Graph 35+E II.
Je suis heureux d'apprendre que tu as résolu le problème en activant les opérateurs manquants dans les sources et en proposant une version mise à jour. Je vais essayer la nouvelle version pour évaluer son fonctionnement et je vous tiendrai informé dès que possible. Je suis un peu étonné quant au problème de mémoire vive entre la Graph 90+E et la Graph 35+E II, étant donné qu'elles ont à peu près la même quantité de RAM disponible sur papier. Peut-être que la gestion de la mémoire diffère légèrement entre les deux modèles, ce qui pourrait expliquer pourquoi l'un réussit et l'autre échoue ? As-tu une idée concernant l'approximation de la quantité de RAM nécessaire pour l'exécution d'un script en général? Est-il possible de l'estimer sur ordinateur ?
Je te remercie pour tes efforts dans la résolution de ce problème et pour l'amélioration du module PythonExtra. Cela ouvrirait certainement de nouvelles possibilités passionnantes. S'il te plaît, tiens-moi au courant s'il y a du nouveau.
Cordialement.
Citer : Posté le 21/08/2023 20:28 | #
La même quantité de mémoire sur papier ? Si le nombre que tu as en tête est 65 ko, celui annoncé par Casio, alors c'est la taille de la mémoire principale (F1 dans le menu MEMORY) dans laquelle sont stockés les informations basiques de la calculatrice comme tes paramètres, ton historique de calcul, les formules de courbes ou les programmes Basic de l'application PRGM. Ce nombre est, dans la majorité des cas, très peu pertinent.
En réalité, la puce RAM de la Graph 35+E II fait 512 ko tandis que la puce RAM de la Graph 90+E fait 8 Mo. Tout n'est pas utilisable, à la fin du décompte sur Graph 35+E II un add-in comme PythonExtra peut généralement utiliser ~45 ko facilement, tandis que sur la Graph 90+E c'est plutôt de l'ordre de ~700 ko, et on peut vite monter à 2-3 Mo si on sort des sentiers les plus classiques. Du coup, l'écart est très conséquent en fait.
Si tu essaies sur l'ordinateur ce ne sera pas avec MicroPython (et pas la même architecture) donc ça ne te donnera pas d'information fiable. Ce que tu peux faire, quand le script marche, c'est afficher la quantité de mémoire disponible après l'avoir chargé. PythonExtra fournit la fonction suivante :
gc.mem_free()
qui te donne la quantité de mémoire disponible pour MicroPython, en octets. Sur Graph 90+E par exemple, je peux voir cette quantité diminuer quand j'importe le programme de test ci-dessus :
Type "help()" for more information.
>>> import gc
>>> gc.mem_free()
177680
>>> from test import *
[ 2, 4, 6,
8, 10, 12,
14, 16, 18]
[ 13, 25, 34,
44, 55, 66,
78, 95, 107]
>>> gc.mem_free()
156560
Malheureusement c'est pas super précis, comme tu peux le voir ce nombre suggère que 20 ko suffit alors que non. Dans l'ensemble la méthode la plus courante est plutôt empirique. La mémoire est consommée par (1) le code des fichiers .py, et (2) les variables créées dans le programme. Du coup généralement on essaie d'abord de voir si on arrive à charger tous les modules sans commencer les calculs, et ensuite de voir si les variables tiennent dans la mémoire. C'est un peu lent, j'en conviens...
Je regarderai si peux ajouter une fonction pour mesurer le pic de consommation de mémoire, comme ça on pourrait regarder ce pic sur Graph 90+E pour avoir une référence (note que ça marcherait aussi sur l'émulateur si tu n'as pas de Graph 90+E).
Citer : Posté le 26/08/2023 08:11 | #
Je vous remercie sincèrement pour les informations que vous avez partagées concernant Micropy, ainsi que pour vos conseils sur l'utilisation de khicas.g1a pour les calculs matriciels. Votre expertise est inestimable et je suis reconnaissant de pouvoir bénéficier de vos connaissances. En ce qui concerne khicas.g1a, je reconnais son potentiel en tant qu'outil puissant pour le calcul matriciel. Cependant, je trouve que son utilisation peut être un peu complexe, surtout pour moi qui ne suis pas très à l'aise avec ces concepts avancés. Actuellement, je l'utilise principalement pour des calculs plus simples de type calcul différentiel, intégration algébrique et autre. Je me demande néanmoins si je pourrais exploiter davantage ses fonctionnalités pour automatiser mes calculs et gagner en efficacité. Auriez-vous des suggestions ou des ressources que je pourrais consulter pour mieux maîtriser khicas.g1a et en tirer le meilleur parti pour mes besoins spécifiques?
C'est difficile de répondre sans en savoir un peu plus sur ce que vous voulez faire comme calculs matriciels.
Je vous remercie également pour votre suggestion d'utiliser les modules natifs et numpy dans Micropy pour les opérations matricielles. Cependant, je me sens plus à l'aise avec la programmation sur l'ordinateur et ensuite de porter le programme. J'ai également installé Xcas sur mon ordinateur, mais je ne suis pas très sûr de la meilleure manière de l'utiliser pour automatiser mes calculs et ensuite porter le résultat sur la calculatrice. Si vous avez des conseils supplémentaires à partager ou des ressources spécifiques à recommander à ce sujet, je vous en serais extrêmement reconnaissant.
Il suffit d'exporter la session de calcul de Xcas depuis le menu Fich>Exporter comme>Khicas Casio. Ca génère un fichier d'extension .xw qu'on peut ensuite ouvrir depuis khicas sur les Casio. Cela permet de transférer les commandes de calcul et les programmes.
Sur Xcas, il y a un peu d'aide sur l'utilisation des matrices/vecteurs dans le tutoriel (menu Aide, Débuter en calcul formel, tutoriel), puis dans Aide>Manuels>référence. Sur la programmation, il y a le tutoriel algorithmique lycée et le le manuel de programmation (menu Aide, Manuels, Programmation). Ils sont écrits dans le langage natif de Xcas, mais c'est sans doute inutile de les consulter, vous pouvez utiliser la syntaxe en Python que Xcas comprend. La principale différence avec du code matriciel écrit en Python/numpy, c'est que les matrices (listes de listes) sont des objets natifs de Xcas, il n'est pas nécessaire d'importer de modules pour les manipuler. Par exemple on peut dupliquer la fonction trace de Xcas avec le code suivant (à créer de préférence dans un niveau programme, menu Prg>Nouveau programme)
def tr(A):
l=len(A)
res=0
for j in range(l):
res += A[j,j]
return res
ensuite dans un niveau de calcul normal on tape A:=randmatrix(3,3); tr(A) ou A:=[[1,2],[3,4]]; tr(A)
Vous pouvez mettre au point un programme avec la commande debug(tr(A)) qui permet d'exécuter instruction par instruction le programme, en affichant la valeur des variables locales. Cela fonctionne également dans l'environnement calculatrices.