A propos du retour du fils de la vengeance (Gazette n°13)

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

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

A propos du retour du fils de la vengeance (Gazette n°13)

Message par C.Ret »

Bonjour, et bonne année 2021 à toutes et à tous !

Ces derniers jours, certaines de mes lectures m'ont bien occupées et notamment la dernière gazette de Pockéticaires m'a bien intéressée.

J'y ai trouvé de quoi approfondir l'exploration de ma nouvelle acquisition et ses étonnantes possibilités.

Un des articles de la Gazette détaille le calcul de la fonction W(x) de Lambert et notamment donne quelques applications de cette fonction pour la résolution d'équations transcendantales et quelques exemples allégrement expliqués et commentés par gégé auteur de la rubrique.
TI-92 II  Commented x.e^x and Lambert W branchs.gif
TI-92 II Commented x.e^x and Lambert W branchs.gif (14.41 Kio) Vu 4973 fois
Dans son article, la résolution des sept formes d'équations paramétrées est implémentée pour HP Prime et CASIO pb700.
Je donne ci-dessous la version pour HP-71B telle qu'elle est implantée dans mon pocket.

Dans l'article de gégé, les sept formes suivantes d'équation ayant pour paramètres les variables a et b sont résolues à l'aide de la fonction W de Lambert.
Gazette n°13 - page 23.gif
Gazette n°13 - page 23.gif (24.4 Kio) Vu 5259 fois
EDIT: La formule solution n°7 donnée dans la Gazette est erronée, voir le message de tyann qui a signalé l'anomalie et la formule corrigée donnée plus loin.

Le code ci-dessous utilise la structure DEF FNW(T) ... END DEF pour définir la procédure d'approximation numérique de la branche positive réelle de la fonction W de Lambert au point d'abscisse T (c'est à dire la branche Wo sur la capture d'écran Ti-92 II cu-dessus). Les lignes 4 à 7 contiennent la définition de la fonction utilisateur FNW(T) qui pour une valeur T donnée calcule, affine et renvoie la valeur numérique réelle de la branche positive de la fonction W de Lambert ou une valeur NaN pour indiquer une requête hors du domaine de définition.


Les DATAs de la ligne 1 permettent deux choses :
  1. De créer le menu qui permettra à l'utilisateur de sélectionner l'équation adaptée à son problème à l'aide des touches curseur [↓] et [↑] en validant à l'aide de la touche [END LINE]. La touche [ON] permet de sortir prématurément du programme sans sélection. Evidemment l'instruction MENU n'est pas présente sur tous les HP-71B. Mais je suis sûr que les malheureux processeurs d'HP-71B démunis d'un module JPC ROM sauront combler cette lacune par un petit bout de code supplémentaire.
  2. D'afficher l'équation sélectionnée lors de la saisie des paramètres a et b qui viennent d'ailleurs s'insérer dans l'équation affichée à l'aide de la fonction POS
Les DATAs de la ligne 2 donnent l'expression de la solution pour chacune des sept équations paramétriques. L'idée est d'utiliser une des caractéristiques fondamentales et spécifiques de l'HP-71B dont l'instruction VAL (cf. ligne 16) permet d'évaluer une expression dans l'environnement contenant les valeurs des paramètres a et b et la définition de la fonction W de Lambert - respectivement les variables A, B et FNW().

Le sous-programme de la ligne 20 permet de retrouver l'équation ou l'expression solution dans les lignes de DATA en fonction du choix de l'utilisateur indiqué par la variable M. Les malheureux utilisateurs d'un HP-71B dépourvu de JPC ROM peuvent s'inspirer de son principe de fonctionnement pour mettre au point leur propre sous-routine de sélection de l'équation à défaut d'avoir une instruction MENU préétablie.

Code:

Code : Tout sélectionner

 1 DATA X*e^X=a,X*e^(aX)=b,    X+a*ln X=b   ,   X^a*e^X=b    , X*e^X+a*e^X=b ,   X+a*e^X=b   ,  X+a*X*ln X=b
 2 DATA FNW(A) ,FNW(A*B)/A,A*FNW(EXP(B/A)/A),A*FNW(B^(1/A)/A),FNW(B*EXP(A))-A,B-FNW(A*EXP(B)),B/FNW(B*EXP(1/A)/A)/A
 
 4 DEF FNW(T)
 5   IF T<=-EXP(-1) THEN W=NAN @ GOTO 7 ELSE IF T<1.5 THEN W=SQRT(T+.37)-.5 ELSE W=LOG(T)
 6   FOR I=1 TO 7 @ W=(W*W+T*EXP(-W))/(1+W) @ NEXT I
 7 FNW=W @ END DEF 
 
10 DEFAULT EXTEND @ SFLAG -1 @ I=TRAP(IVL,2) @ STD @ M=MENU(7) @ IF M<1 THEN END
12 RESTORE 1 @ GOSUB 20 @ DISP E$; @ INPUT "  a=";A @ P=POS(E$,"a") @ E$[P,P]=STR$(A)
14 P=POS(E$,"b") @ IF P THEN DISP E$; @ INPUT "  b=";B @ E$[P,P]=STR$(B)
16 DISP E$;"  -->  X="; @ RESTORE 2 @ GOSUB 20 @ X=VAL(E$) @ FIX 6 @ DISP X @ STD @ END
20 FOR I=1 TO M @ READ E$ @ NEXT I @ RETURN
EDIT: Code corrigé : la formule de la solution n°7 (ligne 2) a été corrigée, il manquait une division par A

Variables globales:
A: paramètre a.
B: paramètre b.
E$: équation paramétrique substituée / expression solution à éVALuer.
I: indice d'itération du sous-programme 20.
M: sélection de l'équation paramétrique / numéro du menu / numéro de l'expression solution à évaluer.
P: position du paramètre à substituer dans l'équation paramétrique E$.
X: solution de l'équation paramétrée.

Variables locales fonction FNW():
I: indice d'itération pour calcul affiné (ligne 6).
T: abscisse du point à évaluer
W: ordonnée du point à évaluer (valeur de la branche positive de la fonction W de Lambert)

Utilisation
Saisir le programme.
Lancer la résolution par la touche [RUN] ou en tapant RUN+[END LNE] ou tout autre moyen de lancer le programme préalablement saisi)
Sélectionner l'équation de la forme la plus adaptée à la résolution du problème.
A la demande du HP-71B, saisir les expressions donnant les valeurs numériques des paramètres a et b.
En quelque fraction de secondes l'HP-71B affiche la valeur numérique solution pour X ou, le cas échéant, une valeur NaN ou ±Inf indiquant qu'il n'y a pas de solution réelle (grâce au contrôle des exceptions mathématiques TRAP et SFLAG -1).

Exemple 1 (calcul direct de W)

Code : Tout sélectionner

AFFICHAGE:                   SAISIE:
>                               [F][N][W][(][7][4][2][.][0][6][5][7][9][5][5][1][5][)][END/LINE]
 5.00000000001                			

Exemple 2 (exemple pour HP Prime dans la gazette n°13)

Code : Tout sélectionner

AFFICHAGE:                    SAISIE:
 >                              [RUN]
   aXe^X=b              (prgm)  [↓][↓][↓]
   X^a*e^X=b            (prgm)  [END/LINE]
 X^a*e^X=b  a=_         (prgm)  [2][END/LINE]
 X^2*e^X=b  b=_         (prgm)  [6][END/LINE]
 X^2*e^X=6  -->  X= 1.  (prgm)    
╾2*e^X=6  -->  X= 1.28  (prgm)    
╾e^X=6  -->  X= 1.2870  (prgm)    
╾X=6  -->  X= 1.287052  (prgm)
Exemple 3 (exemple pour CASIO pb700 dans la gazette n°13)

Code : Tout sélectionner

AFFICHAGE:                   SAISIE:
 >                              [RUN]
   aXe^X=b              (prgm)  [g][↓][↑]
   X+a*e^X=b            (prgm)  [END/LINE]
 X+a*e^X=b  a=_         (prgm)  [8][/][2][END/LINE]
 X+4*e^X=b  b=_         (prgm)  [2][0][/][2][END/LINE]
 X+4*e^X=10  -->  X=    (prgm)    
╾4*e^X=10  -->  X= 0.8  (prgm)    
╾e^X=10  -->  X= 0.829  (prgm)    
╾X=10  -->  X= 0.82967  (prgm)    
╾=10  -->  X= 0.829678  (prgm)    
Modifié en dernier par C.Ret le 27 janv. 2021 08:45, modifié 16 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.
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7147
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: A propos du retour du fils de la vengeance (Gazette n°13)

Message par gege »

Bonjour,
Wow ceci m'amène à deux conclusions :
1) tu es un grand malade
2) Je sors mon HP71B de suite pour tester tout ça !
Sans la JPCRom, il va falloir adapter...
Cool
G.E.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: A propos du retour du fils de la vengeance (Gazette n°13)

Message par C.Ret »

Toujours dans la même gazette, j'ai trouvé un article surprenant qui montre comment sur les machines programmables en BASIC, mais dépourvues de capacité, on pouvait utiliser une pile unique pour y implanter un algorithme récursif. Cela fonctionne, mais j'ai été choqué de voir dans la dite pile unique des grandeurs fort différentes telles que des compteurs, des paramètres, des résultats et même des numéro de ligne du code BASIC. J'ai presque failli m'évanouir; mais c'est vrai que cela marche, surtout sur les pockets capables d'effectuer des GOTO calculés ! Splendide.

Je reste malgré tout convaincu que le plus simple est pour ce type d'algorithme récursif d'utiliser des BASIC supportant la récurrence. Ce qui évitera d'avoir à manipuler une pile artificielle contenant un mélange explosif.


Pour illustrer mon propos, je vais prendre l'exemple des pseudo nombres de Ackermann définis comme dans la Gazette du Fils de la Vengeance et oublier un temps qu'il existe une formule algébrique directe pour les calculer.

Je passe pour le moment l'idée d'illustrer mon propos avec une machine éminemment capable de récurrences longues et profondes mais qui ne se programme pas en BASIC pour commencer par un modèle texan.

Les (faux) nombres d'Ackermann sont définis par la relation de récurrence suivante :
Image

Qu'il est très simple de programmer directement sur son Ti-92 II par quelque code en Ti-Basic:
ACKERMANN TI 92 II  (FUNC).PNG
ACKERMANN TI 92 II (FUNC).PNG (29.28 Kio) Vu 5528 fois
Cela marche fort bien, ce n'est ni rapide ni économique en mémoire, mais simplissime et évite tout risque d'explosion en cas de mélange des constituants hétérogènes d'une pile artisanale.
ACKERMANN TI 92 II.png
ACKERMANN TI 92 II.png (28.42 Kio) Vu 5528 fois
Bon évidemment avec une approche par récurrence, on finit toujours par être limité en niveau de pile ou manque de mémoire !

Il y a d'autres systèmes portatifs récents qui permettent aussi de définir directement en utilisant la définition par récurrence de la fonction de Gégé-Ackermann:
ACKERMANN HP PRIME (Program CAS).png
ACKERMANN HP PRIME (Program CAS).png (10.6 Kio) Vu 5523 fois
Mais comme ce n'est pas exactement du BASIC, mais plutôt une sorte de Pascal, je n'en dirait pas plus.
ACKERMANN HP PRIME.png
ACKERMANN HP PRIME.png (10.74 Kio) Vu 5476 fois
Je préfère discuter de la même possibilité offerte sur de vrais pockets BASIC vintages :

Code : Tout sélectionner

10 INPUT "m,n=";M,N @ T=TIME @ DISP USING 'K';"Ack(",M,",",N,")= ",FNA(M,N)," :",TIME-T

20 DEF FNA(M,N)
22 IF M<1 OR N<1 THEN FNA=0 ELSE IF M=1 AND N=1 THEN FNA=1 ELSE FNA=M*FNA(M-1,N)+N*FNA(M,N-1)
24 END DEF
Franchement, pourquoi s'embêter avec une pile artisanale, alors que sur un HP-71B une simple fonction utilisateur convient si parfaitement et si rapidement :

Code : Tout sélectionner

[RUN]	m,n=?	-2,7  [END/LINE]	Ack(-2,7)= 0 			 :.39
[RUN]	m,n=?	0,1   [END/LINE]	Ack((0,1)= 0			 :.38
[RUN]	m,n=?	1,1   [END/LINE]	Ack(1,1)= 1			 :.4
[RUN]	m,n=?	3,5   [END/LINE]	Ack(3,5)= 10800			 :7.74
[RUN]	m,n=?	5,3   [END/LINE]	Ack(5,3)= 10800			 :7.75
[RUN]	m,n=?	13,1  [END/LINE]	Ack(13,1)= 6227020800 		 :2.61
[RUN]	m,n=?	23,17 [END/LINE]	Ack(23,17)= 2.0450184343E47	 :214.52
Et je ne parlerai pas de la déception de constater que sur Ti-74 BASICALC, le code suivant ne fonctionne pas comme prévu:

Code : Tout sélectionner

10 INPUT "m,n=";M,N:CALL ACK((M),(N),A):PRINT "Ack(";M;",";N;")= ";A:PAUSE:END

20 SUB ACK(M,N,A)
22 IF M<1 OR N<1 THEN A=0:SUBEXIT
24 IF M=1 AND N=1 THEN A=1:SUBEXIT
26 CALL ACK((M-1),(N),A1):CALL ACK((M),(N-1),A2)
28 A=M*A1+N*A2:SUBEND
On obtient une erreur qui en dit long sur la vocation pédagogique de cette machine :

Code : Tout sélectionner

m,n= -2[ENTER]		? 7 [ENTER]	Ack(-2 , 7 )=  0
m,n= 0 [ENTER]		? 1 [ENTER]	Ack( 0 , 1 )=  0
m,n= 1 [ENTER]		? 1 [ENTER]	Ack( 1 , 1 )=  1
m,n= 3 [ENTER]		? 5 [ENTER]	E16 at 26 In use
Le manuel d'utilisation est très discret sur ce point, l'appel récursif des sous-procédures semble être un tabou sur cette machine.

A moins que j'utilise la forme algébrique :Image
Zut, pas de fonction factorielle en BASIC sur cette machine.

Effectivement, sur cette machine , l'astuce du Fils de la Vengeance va me servir :O

Conclusion:

L'article de la Gazette est fort intéressant et je n'ai pas fini d'explorer les possibilités qu'ouvre à mon imagination la proposition de gégé de créer de toutes pièces une pile permettant toutes les récurrences et autres traitements in profundis.
Mais quel fou, tout mélanger dans un seul et unique tableau Q(...) fait prendre bien des risques et rend les codes illisibles ! On dirait du RPL !
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 : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: A propos du retour du fils de la vengeance (Gazette n°13)

Message par C.Ret »

C'est aujourd'hui l'épiphanie et je célèbre la victoire de la Lumière sur les Ténèbres.
Malgré cela, ma pauvre TI-74 BASICAL ne sait toujours pas calculer les (faux) nombres d'Ackermann par récurrence. C'est pas brillant !

Comme c'est un BASIC, je vais donc essayer d'appliquer la méthode proposée par notre illustre ami gege qui "dote le BASIC de possibilités incroyables" et si cela fonctionne, ce sera une belle victoire d'astuce lumineuse sur les sombres desseins des concepteurs texans qui ont volontairement et sombrement bridé cette malheureuse machine.

Je vais donc commencer mon code comme suggéré dans l'article :

Code : Tout sélectionner

20 PRINT "Ack(~~~,~~~)";
30 ACCEPT AT(5) SIZE(3) VALIDATE(DIGIT,"+-"),M(0)
40 ACCEPT AT(9) SIZE(3) VALIDATE(DIGIT,"+-"),N(0)
50 I=0:GOSUB 100
60 PRINT ")=";A(0):PAUSE
70 GOTO 20
Bon, passons la version avec les numéro de ligne calculés, la TI-74 en est incapable. Celle avec le GOSUB est intéressante, mais limite malgré tout le truc.
Bon essayons d'adapter et de profiter de la structure ON ... GOTO

Dans l'article, je lis qu'il est possible de se passer des GOTO calculés à l'aide "d'une pile supplémentaire contenant ces adresses". Mais, je vois une autre alternative, qui elle aussi utilise une information supplémentaire.

Rappelons la définition des (faux) Nombres d'Ackermann:
Image

A partir de cette définition, j'ai dessiné la figure suivante qui reprend les trois cas possibles à chaque appel récursif pour le calcul de A(m,n): on retrouve en fait la structure des codes IF THEN ELSE de la SUB ACK(M,N) du post précèdent.
Les quatre opérations élémentaires d'un niveau récursif.gif
Les quatre opérations élémentaires d'un niveau récursif.gif (10.26 Kio) Vu 5455 fois
Sur cette figure, on se rend compte qu'à chaque niveau d'appel récursif, il y a trois types d'opérations à effectuer:
  1. Les opérations 0 et (0): elles sont internes au niveau car le calcul de A(m,n) peut être fait sans un autre appel de calcul. En effet, lorsque (m<1 OU n<1) et lorsque (m=1 ET n=1) la valeur de A(m,n) peut être calculée immédiatement. C'est un peu comme un court-circuit qui permet d'interrompre la suite des appels récursifs.
  2. Les opérations 1 et 2 :nécessitant l'appel d'un niveau de calcul supplémentaire pour calculer respectivement A(m-1,n) et A(m,n-1)
  3. L'opération de synthèse (3) : qui reprend les valeurs A(m-1,n) et A(m,n-1) calculées par les opérations 1 et 2 et applique la combinaison linéaire donnant A(m,n)=m*A(m-1,n)+n*A(m,n-1).
Notons que cette façon de faire et exactement celle du code proposé dans la Gazette; Et je vais également utiliser la même astuce en stockant temporairement le produit m*A(m-1,n) dans A(i) à l'issue de l'opération 1 le temps de lancer l'opération 2. L'opération de synthèse (3) consistera alors à effectuer la somme A(i)+n*A(m,n-1).

En utilisant le calcul de A(2,3) afin d'illustrer cette façon de décomposer le calcul, on obtient la figure suivante qui décompose l'ensemble du calcul récursif et donne pour chaque étape l'ordre des opérations effectuées:
Exemple Calcul récursif de A(2,3).gif
Exemple Calcul récursif de A(2,3).gif (26.37 Kio) Vu 5455 fois
Contrairement aux exemples de l'article, par facéties et dans un souci de clarté du code (c'est aujourd'hui épiphanie), je ne vais pas utiliser une pile unique, mais bel et bien plusieurs vecteurs afin de suivre convenablement et sans risque les opérations

Code : Tout sélectionner

10 DIM A(15),M(15),N(15),o(15)
A() est la pile de retour des valeurs A(m,n)
M() et N() les piles contenant pour chaque niveau les arguments m et n
o() et la pile indiquant l'opération en cours pour chaque niveau. Les valeurs contenues dans o() seront 1, 2 et 3 en fonction des opérations effectuées et cette pile servira donc directement pour l'aiguillage ON o(I) GOTO ...
Les opérations 0 e (0) n'utilisent pas O() car ne nécessitent pas d'appel d'un autre niveau mais un 'court-circuit'.

L'utilisation de piles séparées rend le code un peu plus lisible que ceux proposés dans la Gazette, mais c'est en réalité le même principe. Voici à quoi ressemble le sous-programme de calcul récursif :

Code : Tout sélectionner

100 REM --- Calcul recursif ACK(M,N) ---
110 o(I)=1
120 IF M(I)<1 OR N(I)<1 THEN A(I)=0:GOTO 300
130 IF M(I)=1 AND N(I)=1 THEN A(I)=1:GOTO 300
140 ON o(I) GOTO 210,220,230

200 J=I:o(I)=o(I)+1:I=I+1:RETURN

210 GOSUB 200:M(I)=M(J)-1:N(I)=N(J):GOTO 110
220 A(I)=M(I)*A(J):GOSUB 200:M(I)=M(J):N(I)=N(J)-1:GOTO 110
230 A(I)=A(I)+N(I)*A(J)
300 IF I>0 THEN J=I:I=I-1:GOTO 140
310 RETURN
Il y a quatre parties:
  • lignes 110 à 140: On y trouve les deux opérations 0 et (0) c'est à dire les tests de sortie. Ainsi que le GOTO 300 qui est le 'court-circuit' qui branche sur la fin de l'opération (3), c'est à dire le retour vers le niveau précédent.
    1. 120:Opération 0: retourne A(m,n)=0 si m<1 OU n<1. Le GOTO 300 'court-circuite' vers la descente d'un niveau.
    2. 130:Opération (0): retourne A(1,1)=1.
    3. 140:Aiguillage principal en fonction de l'opération en cours. D'où l'importance de l'initialisation de la ligne 110.
  • ligne 200: partie commune aux opérations 1 et 2 (monté d'un niveau). L'indice du niveau (variable I) est incrémenté, par convenance, la variable J contient le niveau initial de I. On notera que c'est à ce même endroit que l'opération est changée.
  • lignes 210 à 230 : respectivement opérations 1 2 et (3). On y trouve le détail des opérations:
    1. 210:Opération 1: appel calcul de A(m-1,n). Notons l'utilisation de la variable J qui ici correspond à I-1.
    2. 220:Opération 2: avant l'appel vers le niveau supérieur, la valeur m*A(m-1,n) est temporairement mémorisée dans A(I) en vue de l'addition de l'opération (3). l'appel du calcul de A(m,n-1) se fait de la même manière que pour l'opération 1.
    3. 230:Opération (3): la somme A(m,n)←A(i)+n.A(m,n-1) est effectuée à partir de la valeur préalablement mémorisée dans A(I)←A(I)+N(I)*A(I+1).
    Les opérations 1 et 2 finissent par un GOTO 110 pour exécuter le nouveau niveau.
    L'opération (3) débouche directement sur la partie commune aux opération 0 et (0) qui consiste tout simplement à descendre d'un niveau quand cela est possible.
  • lignes 300 et 310 : descend d'un niveau et poursuit son exécution en se branchant vers l'aiguillage principal (les tests de sortie ayant déjà été fait pour ce niveau) ou sort du sous-programme si l'on a pu calculer A(0)

Petits exemples de calcul:

Code : Tout sélectionner

                                    [RUN][ENTER]
Ack(_  ,   )                        [ 2 ][ENTER]
Ack(2  ,_  )                        [ 3 ][ENTER]
Ack(2  ,3  )= 36                    [ENTER]
Ack(_  ,   )                        [ - ][ 2 ][ENTER]
Ack(-2 ,_  )                        [ 7 ][ENTER]
Ack(-2 ,7  )= 0                     [ENTER]
Ack(_  ,   )                        [ 3 ][ENTER]
Ack(3  ,_  )                        [ 5 ][ENTER]
Ack(3  ,5  )= 10800                 [ENTER]

C'est bien, la Gazetten°13 va bientôt être finalisée et publiée, félicitons et remercions les contributeurs et l'équipe de rédaction pour le travail et les efforts réalisés. Et souhaitons qu'elle ai de nombreux lecteurs qui comme moi s'amusent et y découvrent mille raisons d'approfondir les sujets évoqués.
Modifié en dernier par C.Ret le 07 janv. 2021 12:33, modifié 3 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.
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7147
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: A propos du retour du fils de la vengeance (Gazette n°13)

Message par gege »

Bonjour,
Ce programme est super !
Bien touffu comme il faut, et spécifique au problème.
Peut-être que ces idées pourraient donner lieu à la création d'un "compilateur" Basic qui traduirait un programme ayant des fonctions en Basic simple avec des piles de fou ?
Le TI74 est une bonne machine, dommage que les appels imbriqués de fonctions soient interdits et que la pile de GOSUB soit si limitée.
Aussi quelques détails d'ergonomie gênants comme l'absence de déplacement en fin de ligne, ou l'obligation de faire CLR après un PRINT pour récupérer la main.
On attend tes articles dans la G14 !
G.E.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: A propos du retour du fils de la vengeance (Gazette n°13)

Message par C.Ret »

gege a écrit : 07 janv. 2021 12:08[...]On attend tes articles dans la G14 !
Le rendez-vous est pris !
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
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 846
Enregistré le : 06 oct. 2012 14:37

Re: A propos du retour du fils de la vengeance (Gazette n°13)

Message par tyann »

Bonjour

J'ai moi aussi adapté le programme LambertW à une autre machine la Ti 95 procalc
et je pense y être plutôt bien parvenu.
Mais je pense qu'il y a une coquille sur le modèle d'équation n°7, en effet si je calcule
l'expression de base avec 2 valeurs arbitraires pour x et a, j'obtiens donc la valeur b en retour.
Si ensuite j'utilise le solveur et que je rentre a et b, je ne retrouve pas mon x.
J'ai entré le programme sur la prime pour vérifié et j'obtiens la même chose que sur la Ti.

Exemple :
a=0.75 et x=5 => x+a*x*LN(x)=b => 5+0.75*5*LN(5) renvoie 11.0353921716
Sur le solveur équation type 7 : a=.75 et b=11.035391716 renvoie 3.7499998....

Sinon une petite coquille dans le listing LambertW9 pour la prime il manque une '(' avant x+1 dans l'expression
à l'intérieur de la boucle.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: A propos du retour du fils de la vengeance (Gazette n°13)

Message par C.Ret »

tyann a écrit : 11 janv. 2021 20:46 Mais je pense qu'il y a une coquille sur le modèle d'équation n°7, en effet si je calcule
l'expression de base avec 2 valeurs arbitraires pour x et a, j'obtiens donc la valeur b en retour.
Si ensuite j'utilise le solveur et que je rentre a et b, je ne retrouve pas mon x.
J'ai entré le programme sur la prime pour vérifié et j'obtiens la même chose que sur la Ti.

Exemple :
a=0.75 et x=5 => x+a*x*LN(x)=b => 5+0.75*5*LN(5) renvoie 11.0353921716
Sur le solveur équation type 7 : a=.75 et b=11.035391716 renvoie 3.7499998....

Effectivement, en repartant de l'équation Image, je viens de trouver, à l'aide de ma TI-92 II que la solution est de la forme Image

Il suffit de partir d'une équation initiale Image et de commencer par un petit changement de variable Image. Puis de triturer notre équation exprimée en fonction de x, c et d afin d'obtenir une forme connue. C'est dans les triturations et essais nombreux que la Ti-92 II est un précieux allié, car elle garanti d'éviter des erreurs ou des oublis.

A force de malaxer cette équation, j'arrive à une expression de la forme Image.
En changeant la variable Image, j'obtiens une expression de la forme Image

Je m'empresse alors de changer aussi la variable Image.
J'obtiens alors l'expression n°3 du tableau qui est de la forme Image et dont la solution est de la forme Image

Ce qui signifie que la solution de notre équation initiale est de la forme Image SOIT Image

Enfin, sii l'on transforme cette solution afin de faire apparaitre a et b, on obtient Image solution de Image

En utilisant cette solution, j'obtiens bien x=5 pour les valeurs calculée par tyann :

Code : Tout sélectionner

X+.75*X*ln X=11.035392   --->   X=5.000000 
J'ai vérifié avec un autre exemple: a = 2 et x=1, on calcule alors facilement que b = 1 + 2*1*ln 1 = 1 + 0 = 1
Et j'ai vérifié (avec mon HP-71B que j'ai pris en cachette profitant que gege n'est pas là) 0:

Code : Tout sélectionner

X+2*X*ln X=1   ---->    X=1.000000
Et d'autres exemples qui fonctionnent maintenant...
Il y a donc un petit oubli dans la formule de la solution publiée dans la Gazette !
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
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 846
Enregistré le : 06 oct. 2012 14:37

Re: A propos du retour du fils de la vengeance (Gazette n°13)

Message par tyann »

Bonsoir

merci C.Ret, ça marche nickel maintenant.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7147
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: A propos du retour du fils de la vengeance (Gazette n°13)

Message par gege »

Bonjour,
Merci messieurs, je vais corriger.
G.E.
Répondre

Retourner vers « Tous les Pockets »