de Formule Kraker van GraphicsExplorer


Inleiding.
GraphicsExplorer plot grafieken van ingevoerde formules.
Bijvoorbeeld van y = 3/x + a*x^(b-5)
Het probleem hierbij is, dat de berekeningen niet simpelweg van
links naar rechts kunnen worden uitgevoerd omdat de bewerkingen
verschillende prioriteiten hebben.
De formule moet dus worden omgezet naar een formaat, dat wel de juiste
volgorden van de bewerkingen kent. Dat is ook nodig, om de berekeningen
sneller te laten verlopen. Bij het invoeren van de formule is voldoende
tijd voor deze vertaling, maar bij het scrollen en zoomen zou voortdurend
rekening houden met prioriteiten nodeloze vertraging opleveren.

de gewenste vorm.
Het resultaat van de vertaling is de 'director table' , een tabel met
vier kolommen en 1 regel per berekening : + - * / ^ of een functie.
De tabel kan er met 2 berekeningen zo uitzien:

operationdestinationoperand1operand2
+2423
*201225

De betekenis hiervan is: tel de inhoud van register 23 en 4 bij elkaar
en bewaar de som in register 2.
(een register is hier een plek in een tabel in het computergeheugen,
waar een kommagetal kan staan)
Vermenigvuldig daarna de inhouden van registers 2 en 25 en plaats het
produkt in register 201.
Een formule moet dus worden omgezet in een aantal regels van de director table.
Zo kan snel de waarde worden berekend door de operaties van boven naar
beneden uit te voeren.
Merk op, dat hierbij geen rekening meer hoeft te worden gehouden met de
prioriteit van de verschillende bewerkingen: die ligt vast.

Prioriteiten.
Berekeningen worden bij gelijke prioriteit van links naar rechts uitgevoerd.
De prioriteit is de som van twee termen:

1. de biaspriority: '(' verhoogt deze met 10, ')' verlaagt deze met 10
2. de priority van de bewerking, als volgt:

7functie (sin, cos, tan, wortel, enz.)
6^ machtverheffen
5unaire - zoals in -17,5 of -sin(2x)
4* en / , vermenigvuldigen en delen
3+ en - , optellen en aftrekken
2=
1; het scheidingsteken voor parameter-functies
0einde van de director table


Een vermenigvuldiging heeft dus prioriteit 4, maar tussen haakjes geplaatst
wordt dat 14, tussen 2 haakjes 24.

Constanten en variabelen.
Constanten en variabelen (x, y, v, a, b, c en getallen) worden bewaard in een tabel
Freg[0..250] , een lineaire tabel van kommagetallen en hiervoor met "registers"
aangeduid.
De toewijzing is als volgt:

Freginhoud
[0..19]tussenresultaten
[20..39]constanten formule 1
[40..59]constanten formule 2
[60..199]constanten formules 3..9
[200]x
[201]y
[202]v
[203]A
[204]B
[205]C
[206]pi
[210..212]formule 1: A,B,C na substitutie
[213..215]formule 2: idem
[216..236]formules 3..9: idem


De priority-table.
Voor de omzetting van een formule naar de director-table is een tussentabel
nodig : de priority-table.
Bij het invullen van deze tabel worden constanten in tabel Freg gezet.
De opbouw van de priority-table is: constante of variable / bewerking / prioriteit

Uitgaande van formule 1: y = 3/x + a * x^(b-5) wordt:

Freg[20] = 3 (de eerste constante van formule 1)
Freg[21] = 5 (de tweede constante van formule 1)

De priority-table wordt:

Freg[]bewerkingprioriteit
201=2
20/4
200+3
203*4
200^6
204-13
21geen0


Merk op, dat in regel 6 de prioriteit 3 is verhoogd met 10, omdat er
een openingshaakje '(' is gepasseerd.

De omzetting
De director-table wordt opgebouwd door de priority-table volgens prioriteit
van hoog naar laag af te breken.
De hoogste prioriteit heeft regel 6 (13). Deze bewerking wordt het eerst
verwijderd uit de priority-table en aan de director-table toegevoegd.
Daarna zien de tabellen er zo uit:

Freg[]bewerkingprioriteit
201=2
20/4
200+3
203*4
200^6
0geen0
operationdestinationoperand1operand2
-020421


Regel 5 heeft nu de hoogste prioriteit. Na eenzelfde proces:

Freg[]bewerkingprioriteit
201=2
20/4
200+3
203*4
0geen0
operationdestinationoperand1operand2
-020421
^02000


En na de volgende stap:

Freg[]bewerkingprioriteit
201=2
1+3
203*4
0geen0
operationdestinationoperand1operand2
-020421
^02000
/120200


Merk op, dat Freg[0] en Freg[1] tussenresultaten bevatten.
Na weer een stap:

Freg[]bewerkingprioriteit
201=2
1+3
0geen0
operationdestinationoperand1operand2
-020421
^02000
/120200
*02030


En na de volgende stap:

Freg[]bewerkingprioriteit
201=2
0geen0
operationdestinationoperand1operand2
-020421
^02000
/120200
*02030
+010


En de laatste stap:

operationdestinationoperand1operand2
-020421
^02000
/120200
*02030
+010
=2010leeg
0leegleegleeg


De formule staat nu in een vorm, die snelle berekening mogelijk maakt.

Opmerking 1:
Voor de omzetting begint, worden ontbrekende * operatoren ingevoegd.

Opmerking 2:
Impliciete functies, bijvoorbeeld x^2 + y^2 = (x-3)(y+5),
worden verbouwd tot v = (x^2 + y^2) - ((x-3)(y+5)).

Hiermede eindigt deze beschrijving.