Lambert W

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3421
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Lambert W

Message par C.Ret »

ledudu a écrit : 21 oct. 2019 01:12Salut,[...]Oui gégé, cela s'appelle la programmation synthétique. :mrgreen: :mrgreen: :mrgreen:
J'appelle cela de la programmation concentrée; en fait la lenteur d'une HP-15C normale fait que très vite on se passe de tout superflu.
Et il n'y a aucune astuce, tout le code est simplement entré au clavier sans utilisation d'aucune astuce non documentée.

D'ailleurs, ce programme est à essayer de toute urgence sur l'HP-15C du Pockemul de notre ami Remy.

gege a écrit : 20 oct. 2019 23:17 […] Je sors la LE...
G.E.
Aïe ! Aïe! Aïe !
C'est pas l'HP-15C LE Anniversary qui va à la vitesse de la lumière ? …
… mais dont la fonction f - PSE est boguée ? Dans ce cas, il est peut-être prudent de s'affranchir de l'instruction à la ligne 013- ?!


bernouilli92 a écrit : 21 oct. 2019 11:56 Il y a un une boucle entre les pas 12 et 31 avec des calculs utilisant notamment l'exponentielle.
Très juste, c'est le cœur du programme, cette boucle permet, à partir de la valeur initiale très grossièrement approchée par le sous-programme en Lbl 1, d'affiner par le calcul la valeur finale de W(z) à l'aide de la formule itérative suivante :
Eq(I).gif
Eq(I).gif (1.29 Kio) Vu 4763 fois
Cette expression contient trois exponentielles, mais comme je le signalais ci-dessus, sur une HP-15C on a grand intérêt à éviter de se répéter. L'exponentielle n'est donc effectuée qu'une seule fois, mais utilisée plusieurs fois, d'où d'ailleurs la répétition des (ENTER) pour multiplier chaque variable dans les quatre niveaux de la pile.
Sub-prgm LBL-0.gif
Sub-prgm LBL-0.gif (54.68 Kio) Vu 4760 fois
Par contre, c'est exactement le même calcul en mode complexe (z = a+i.b) et en mode uniquement valeur réelle ( z = x ).
Il faut juste penser à retirer la partie imaginaire mémorisée dans le registre R 1:, d'où le test du Flag 8 et le sous-programme Lbl2 qui se charge d'intervertir les parties réelle et imaginaire, effectuer la soustraction et remettre les choses en place.
Les colonnes des registres pour valeurs imaginaires sont grisées pour indiquer qu'elles ne sont pas disponibles en mode réel c'est à dire lorsque le programme est lancé par f- A ou f- B.



Ce code est la version longue, il existe un code pour HP-15C bien plus court mais qui n'effectue que les calculs des valeurs réelles:
HP15C - lambert W (real only).gif
HP15C - lambert W (real only).gif (16.68 Kio) Vu 4763 fois
Cette version utilise la fonction SOLVE, elle doit donc être adaptable aux HP classiques comme l'HP-34C qui possède déjà un solveur (et l'intégration).

Par contre, l'instruction SOLVE de l'HP-15C ne permet pas la recherche de valeurs complexes :(


P.S.: Pour faire encore plus cours, il suffit de se contenter de saisir les 5 lignes du sous-programme Lbl0 ci-dessus (LBL0 e^x * STO-0 RTN) et pour calculer une valeur réelle W(x), saisir x faire (STO)(0), entrer une estimation en fonction de la branche désirée (par exemple .57 pour la branche principale et -2.3 pour la branche négative), presser (ENTER) pour remplir les registres X: et Y: avec cette estimation et faire f-(SOLVE)(0) afin d'obtenir la valeur W(x) correspondante.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7148
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Lambert W

Message par gege »

Bonjour,
Super ce programme, sur la LE j'ai cru à un problème jusqu'à ce que je m'aperçoive que c'était incroyablement rapide !
A peine le temps de relâcher la touche que le résultat apparaît.
Par contre ce n'est pas précis, exemple pour 19 on obtient 2.173193107 au lieu de 2.1698027256...
Comment améliorer ça ?
"Maître que dois-je faire ?"
Merci
G.E.

Edit : bon ben avec mon style aérien habituel dit "du marteau-pilon", j'ai ajouté un 1 devant le 9 au pas 41 (40 pour moi qui ne peux utiliser PSE sur ma LE), donc 19 boucles au lieu de 9 et… c'est super précis !!
Héhé…

Edit 2 : sauf erreur, W(j+1) = (Wj^2 + z.Exp(-Wj))/(1+Wj) ce qui devrait être plus simple à calculer ?
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3421
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Lambert W

Message par C.Ret »

C'est vrai que ce n'est pas très bon comme résultat :(

2.1732 * e ^ 2.1732 fait 19.0943 qui est très loin du 19 initialement saisi !!!

Aïe Aïe Aïe.

Il y a plusieurs solutions possibles:
- améliorer l'approximation initiale du résultat (le programme très court utilise 0.564189584 - 2.980310552 i quelque soit l'argument saisi)
- augmenter le nombre d'itérations afin d'avoir un meilleurs résultat, ce n'est pas un problème sur l' HP-15C LE vive comme un éclair, mais sur un exemplaire de la fin des 70's …
- boucler tant que le résultat proposé n'est suffisamment constant
- utiliser le solver instruction SOLVE pour les valeurs réelles, comme dans le programme de mon précèdent post.

Et aussi utiliser une combinaison de ces possibilités. Ou sortir son HP Prime de son étuis rigide :)
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3421
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Lambert W

Message par C.Ret »

Bon ben j'ai remis mon HP prime dans son étui rigide. Elle a bien servi, je me suis rendu compte que les fonctions que j'utilisais pour estimation initiale n'étaient pas très efficaces.

Sur la branche positive et négative, les courbes vertes sont l'encadrement que j'utilisais précédemment, en bleu sont les courbes de la nouvelle fonction utilisée dans le code ci-dessous : sur la branche positive, l'encadrement n'était valable qu'à partir de x=e et sur la branche négative, c'est mauvais, les deux courbes vertes n'encadrent pas la fonction W(x) indiquée en rouge sur les deux figures.
Real_Pos_Branch.png
Real_Pos_Branch.png (5.56 Kio) Vu 4673 fois
Real_Neg_Branch.png
Real_Neg_Branch.png (6.27 Kio) Vu 4673 fois

gégé peut continuer à utiliser son HP-15C L.E. vive comme l'éclair, tant qu'il y a des piles (je ne suis pas sûr qu'elles tiennent aussi longtemps qu'une HP-15Coriginale) avec le code suivant qui est bien plus performant.

Les zones colorées correspondent aux perfectionnements par rapport au précèdent code : cette nouvelle version fonctionne de la même façon tout en garantissant la précision (et justesse) du résultat final. Le nombre de tours dans la boucle de recherche Lbl-0 n'est plus compté (plus de registre I). Le drapeau Flg-0 est utilisé pour maintenir la recherche (drapeau levé) en fonction de la précision d'affichage.

Lbl-A pour les valeurs réelles Wm(x) sur la branche principale.
Lbl-B pour les valeurs réelles Wn(x) sur la branche négative.
Lbl-C pour les valeurs complexes W(z) toutes branches confondues.
HP15C - lambert W (precision).gif
HP15C - lambert W (precision).gif (85.52 Kio) Vu 4696 fois
C'est le nombre de décimales affichées (FIX-1 à FIX-9) qui régit la précision des calculs. Les zones du code colorées en rose gèrent cela en veillant à poursuivre la boucle Lbl-0 de recherche tant que le résultat estimé W(.) n'a pas atteint la précision affichée (lignes 070-74) ou qu'il ne permet pas de retrouver l'argument saisi Z = W(.)*e^W(.) avec toute la précision affichée (lignes 061-065).

Ce qui fait que sur une HP-15C on peut obtenir une première estimation du résultat avec 2 ou 3 décimales (FIX 2 f-A) et affiner la précision si nécessaire simplement en pressant FIX9 GSB0 alors que l'estimation précédente est à l'affichage.

Les régions colorées en jaune clair correspondent aux calculs de la valeur approchée W(o) initiale respectivement pour la recherche réelle sur la branche principale Image(Lbl-A lignes 004-012), réelle sur la branche négative Image(Lbl-B lignes 017-030) et complexe toutes branches confondues (Lbl-C ligne 037-046).
Pendant la recherche, les valeurs intermédiaires sont affichées brièvement (f-PSE), ce qui permet de faire patienter tout en vérifiant la bonne convergence. Sur les HP-15C Limited Edition Spécial Anniversary non débuggées, cette instruction est peut-être à éviter :?:

Seuls les registres R0: et R1: (respectivement partie réelle et complexe de l'argument initial) et les drapeaux n° 0 et n° 8 (respectivement sortie de boucle et calculs complexes) sont utilisés.

Aucun contrôle des valeurs saisies par l'utilisateur n'est effectué; l'affichage d'une ERROR 0 ou le clignotement de l'affichage indique des calculs de W(x) ou W(z) impossibles.


En mode FIX-5, W(19) = 2.16980 (4 itérations dans la boucle Lbl-0)
W( -1 ) = -0.31813+1.33724·i (6 itérations)
W(4-3i) = 1.30494-0.36837·i (5 itérations)
En mode FIX-9, W(19) = 2.169802726 (5 itérations)
Modifié en dernier par C.Ret le 25 déc. 2020 22:32, modifié 4 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Nikass
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 941
Enregistré le : 12 nov. 2015 22:00
Localisation : trouducul du 31 et 34 aux lunes bleues

Re: Lambert W

Message par Nikass »

purée, ça gère ici 8O 8O 8O 8O 8O :lol:

n'suis plus foutu de faire ce genre de truc depuis maths spé, moi. J'ai honte... mais bon, j'en ai fait d'autres, depuis :lol:

chapeau bas !

a+
Répondre

Retourner vers « Tous les Pockets »