|
© h.hofstede (h.hofstede@hogeland.nl)
|
|
OEPS...Een FOUT! |
- maar wáár?? - |
|
|
|
|
Als je een programma
hebt gemaakt en je laat het voor de eerste keer "lopen" dan is dat
altijd even een spannend moment.
Het kan namelijk maar zo gebeuren dat er allemaal onzin uitkomt of zelfs
helemaal niets!
't Is namelijk nogal moeilijk om (vooral iets grotere) programma's in
één keer foutloos te maken.
Wat te doen in zo'n vervelend geval?
Nou, daar is maar één antwoord op: |
|
|
|
|
Ga gewoon lekker
"computertje spelen" |
|
|
|
|
|
Doe alsof je het
mannetje in je machine bent dat alles in die geheugens stopt en voor je
uitrekent. Maak een lijstje met alle gebruikte geheugens en zet
daarachter welk getal er in staat. Loop vervolgens je eigen programma
stap voor stap langs en hopelijk zie je wel waar het fout gaat.
Oké, dat laatste klinkt nogal; vaag..... Voorbeeldje dus maar!
|
Voorbeeld. (ik heb de regels even genummerd).
Hiernaast staat een programma om de wortel van een getal te berekenen.
(neem even aan dat je geen wortelknop hebt op je rekenmachine).
Het lost de vergelijking W2 = X op bij een ingevoerde X
en met een ingevoerde nauwkeurigheid D.
Het neemt als eerste benadering voor de wortel van X de waarde
1/2X
(regel 4).
In regel 5 wordt getest of de wortel al dicht genoeg bij de echte wortel
ligt.
Als dat niet zo is, dan wordt in regel 6 de volgende benadering gemaakt.
Net zolang totdat het verschil tussen X en W2 kleiner is dan
D (regel 5) |
: PROGRAM WORTEL
1 : ClrHome
2 : Input"X^2
= ?", X
3 :
Input"nauwkeurigheid?", D
4 : X/2
→ W
5 : While X
- W^2 > D
6 : X/W
→ W
7 : End
8 : Disp W |
|
|
|
|
|
Dit programma werkt
van geen kanten!
Het geeft bijvoorbeeld dat de wortel van 25 gelijk is aan 12,5 en dat de
wortel van 6 gelijk is aan 3. |
Oké, dan ga ik het naspelen met bijv. X = 25 en D = 0,01
Ik maak een tabelletjes met de geheugens X, D, W en de berekening
X - W2 , en ga bijhouden wat er na elke programmastap in het
geheugen staat. Dat heet een geheugenschema maken.
Dat zie je hiernaast, en daarin zie je ook direct wat er fout gaat.
De eerste keer is de afwijking X - W2 gelijk aan
-131,25 en dat ligt een heel eind van de echte wortel 5 af. Maar omdat
dat een negatief getal is, is het niet groter dan D!!
Oké, dat gaan we fixen....
Omdat het alleen gaat om de grootte van de afwijking
moeten we die altijd positief maken. Dat kan door de functie abs
(bij MATH - NUM - 1: abs) te gebruiken (de absolute waarde).
Verander daarom regel 5 in: |
regel |
X |
D |
W |
X-W2 |
1 |
- |
- |
- |
- |
2 |
25 |
- |
- |
- |
3 |
|
0,01 |
- |
- |
4 |
|
|
12,5 |
- |
5 |
|
|
|
-131,25 |
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 : While
abs(X
- W^2) ˃ D |
|
|
|
|
Laat het programma
maar weer lopen.....
......Nou, gefeliciteerd hoor; nu gebeurt er helemaal niets meer!!!
Oké: de rekenmachine uitzetten en opnieuw een geheugenschema
maken: |
Hiernaast zie je wat er misgaat.
De regels 5 en 6 blijven zich steeds maar herhalen, en de wortel W
gaat heen en weer tussen de waarden 12,5 en 2.
12,5 is te groot, en dan is 2 te klein, dan 12,5 weer te groot, dan
2 weer te klein, en dat gaat zo maar door.
Het is beter om als nieuwe benadering van W niet X/W te nemen, maar
het gemiddelde van X/W en W. Dat zou hier
het gemiddelde van 12,5 en 2 opleveren en dat is 7,25 en dat ligt
tenminste wél dichter bij de echte wortel.
Verander regel 6 daarom in:
|
regel |
X |
D |
W |
X-W2 |
1 |
- |
- |
- |
- |
2 |
25 |
- |
- |
- |
3 |
|
0,01 |
- |
- |
4 |
|
|
12,5 |
- |
5 |
|
|
|
131,25 |
6 |
|
|
2 |
|
5 |
|
|
|
21 |
6 |
|
|
12,5 |
|
5 |
|
|
|
131,25 |
.... |
|
|
|
|
|
6 : (X/W + W)/2
→ W |
|
|
|
|
En YES!! Nu
lukt het: de rekenmachine geeft als benadering van
√25 de waarde 5,000012953
Maar wacht eens even... dat is veel nauwkeuriger dan de gevraagde
0,01......
Hoe kan dat? Gaat er nog iets mis, of wordt die benaderde wortel
bij de laatste stap ineens heel veel nauwkeuriger?
We kunnen nu wel weer een geheugenschema maken, maar er is ook een
handigere manier om de kijken wat er gebeurt.
Laat gewoon elke benadering steeds op het scherm verschijnen, dan zie je
vanzelf wat er aan de hand is.
Dus voeg tussen regel 6 en regel 7 in:
regel
6b : Disp W |
|
|
|
|
Voor X = 25 en D =
0,01 en voor X = 625 en D = 0,01 geeft dat de volgende beelden: |
|
|
|
|
|
|
|
|
|
Je ziet dat bij X =
25 de één na laatste stap gelijk was aan 5,011394107 en inderdaad
nog niet nauwkeurig genoeg. Bij X = 625 was de één na laatste stap
25,00174697 en die was al goed genoeg! Toch wordt nog een volgende stap
berekend.
Hoe komt dat?
Dat komt omdat we testen of X - W2 > D. We kijken
dus of het gevonden kwadraat dicht genoeg bij het echte
kwadraat ligt. Inderdaad is 25,001746972 = 625,0873516 en nog
niet nauwkeurig genoeg.
(Als je echt de nauwkeurigheid van de wortel wilt hebben,
moet je misschien steeds de laatst gevonden wortel vergelijken met de
vorige gevonden wortel, en dan stoppen als het verschil tussen beiden
klein genoeg is geworden).
Laatste test: probeer voor de grap eens X = -25 en D =
0,01......☺ |
|
|
|
|
|
|
|
|
OPGAVEN |
|
|
1. |
Onderzoek wat er in het
laatste voorbeeld verkeerd gaat en repareer het programma. |
|
|
|
|
2. |
Onderzoek door een
geheugenschema te maken wat het programma hiernaast doet. |
PROGRAM ?????
: INPUT"GETAL 1?", A
: INPUT"GETAL 2?", B
: INPUT"GETAL 3?", C
: D = 2
: While B < C
: B
→ E
: A + B
→ B
: E
→ A
: D + 1
→ D
: End
: Disp D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
© h.hofstede (h.hofstede@hogeland.nl)
|