samedi 20 avril 2013

Des courbes sur une PB-700

Dans l'article précédent, j'indique que la PB-700 permet de tracer des courbes sur son écran graphique. L'écriture d'un tel programme, sans être excessivement complexe, n'en est pas pour autant triviale. De plus, les exemples du manuel Casio ne sont pas vraiment utlisables pour "tous les jours" ; par exemple pour étudier graphiquement une fonction mathématique. J'ai donc porté sur PB-700 mon vieux programme pour PB-1000. Et quand je dis vieux, c'est vieux : je ne l'avais pas retouché depuis 1991 !

Le Basic un peu limité de la PB-700 réclame quelques aménagements :
  • pas de sous-programmes nommés (fichiers)
  • je n'ai pas ré-écrit le tracé des fonctions polaires et paramétriques
  • disparition de la possibilité de superposer deux courbes (nécessitait BSAVE)
  • pas de fonction "ON ERROR GOTO". Ceci oblige à gérer proprement les limites.
À cause de cette dernière limitation, il faut faire attention si on veut tracer une fonction qui contient une division par zéro. Par exemple, la fonction f(x)=1/x devra être définie de la façon suivante :

20 IF X=0 THEN Y=1E99 ELSE Y=1/X

Voici  mon programme complet pour PB-700 :

10 ANGLE 1:GOTO 35
20 Y=SINX
30 RETURN
35 XI=-6:XM=6:SX=1:YI=-1:YM=1:SY=1:SP=3
40 CLS :L=150:H=31:PRINT "Range"
50 PRINT "X min :";XI:PRINT "  max :";XM:PRINT "  scl :";SX;
60 LOCATE 7,1:INPUT "",R$:IF R$<>"" THEN XI=VAL(R$)
70 LOCATE 7,2:INPUT "",R$:IF R$<>"" THEN XM=VAL(R$)
75 DX=XM-XI:IF DX<=0 THEN 60
80 LOCATE 7,3:INPUT "",R$:IF R$<>"" THEN SX=VAL(R$)
85 IF SX<=0 THEN SX=1
90 CLS:PRINT "Y min :";:PRINT USING "####.####";YI
95 PRINT "  max :";YM:PRINT "  scl :";SY:PRINT "speed :";SP;
100 LOCATE 7,0:INPUT "",Q$:IF Q$<>"" THEN YI=VAL(Q$)
110 LOCATE 7,1:INPUT "",R$:IF R$<>"" THEN YM=VAL(R$)
120 DY=YM-YI:IF Q$<>"A" THEN IF DY<=0 THEN 100
130 LOCATE 7,2:INPUT "",R$:IF R$<>"" THEN SY=VAL(R$):IF SY<=0 THEN SY=1
140 LOCATE 7,3:INPUT "",R$:IF R$<>"" THEN SP=VAL(R$):IF SP<=0 THEN SP=3
150 REM Repere
160 CLS :U=L/DX:IF Q$="A" THEN YI=YM-SY*H/SX/U:DY=YM-YI
170 V=H/DY:I=-XI*U:J=YM*V
180 IF J<=0 THEN 230
190 IF J>H THEN 230
200 DRAW(0,J)-(L,J)
210 FOR X=INT(XI+SX) TO XM STEP SX
220 A=X*U+I:DRAW(A,J-1):NEXT X
230 IF I<=0 THEN 290
240 IF I>=L THEN 290
250 DRAW(I,0)-(I,H)
260 FOR Y=INT(YI+SY-DY) TO YM STEP SY
270 B=-Y*V+J:DRAW(I+1,B):NEXT Y
280 REM Graph
290 X=XI:GOSUB 20:C=X*U+I:D=-Y*V+J:E=SP/U
300 FOR X=XI+E TO XM STEP E
310 GOSUB 20:A=X*U+I:B=-Y*V+J
320 IF D<0 THEN 370
330 IF D>H THEN 370
340 IF B<0 THEN 370
350 IF B>H THEN 370
360 DRAW(C,D)-(A,B)
370 C=A:D=B:NEXT X
380 LOCATE 18,0:INPUT R$:GOTO 40


Notez bien que pour saisir les minuscules contenues dans ce programme, sur PB-700, contrairement à l'usage, il faut maintenir la touche [CAPS] appuyée.

Le mode d'emploi est assez simple :

1. saisir la fonction sous la forme Y=f(X) à la ligne 20

2. lancer le programme par RUN

3. saisir les bornes de calcul :
   - touche [Entrée] pour conserver la valeur précédente
   - ou bien, saisie de la nouvelle valeur, sans se préoccuper de l'affichage de la valeur précédente. Par exemple, sur la vidéo, quand je tape [6][Entrée] pour la valeur max de X, c'est bien 6 qui est pris en compte, et non 610.

4. "scl" signifie "scale". C'est l'échelle des graduations. Sinon, c'est une graduation toutes les unités par défaut.

5. au niveau de "Y min", on peut saisir [A] pour "automatique". Ceci permet d'obtenir automatiquement un repère orthonormé.

6. le paramètre "speed" permet de contrôler la précision du tracé. Le tracé est lent avec des valeurs basses. Par exemple, la valeur de 1 demande un calcul de la fonction sur chaque pixel horizontal.

Une petite démonstration en vidéo vaut mieux qu'un long discours :


Si vous ne faîtes pas de CLEAR avant un RUN, la ligne 35 du programme peut être mise en commentaire. Ces variables doivent néanmoins être initialisées correctement. Le REM permet d'éviter l'écrasement systématique des bornes de calcul. Par contre, il est bien entendu que sur PB-700, la tentative de PRINT sur une variable non initialisée entraînera une erreur.

35 REM XI=-6:XM=6:SX=1:YI=-1:YM=1:SY=1:SP=3

N'hésitez pas à utiliser la zone des commentaires ci-dessous pour soumettre un bug, ou pour publier vos optimisations ! 

1 commentaire: