Ik moet proberen om de regula falsi te programmeren in TP. Ofwel moet ik de functie laten invoeren, ofwel als dit eerste niet lukt gewoon een vaste functie in het programma zetten. Een derdegraadsfunctie (of meer) waarvan je de nulpunten natuurlijk niet kan vinden d.m.v. horner. Ik hoop dat jullie mij hiermee kunnen helpen, want ik geraak er niet uit. Dit moet ook op niveau zijn van het vierde middelbaar.
Ik hoop dat jullie mij kunnen helpen. Alvast bedankt
sofie
2de graad ASO - woensdag 11 augustus 2004
Antwoord
Beste Sofie,
Niet gemakkelijk zo'n opdracht... zeker niet voor een 4-de jaars. Ik neem aan dat je kunt programmeren in Pascal, dus de belangrijkste commando's kent.
Ken je de methode Regula Falsi, dat is uiteraard de vraag. Want als je die niet kent dan kun je 'm ook moeilijk programmeren uiteraard. Meer informatie over de methode kun je vinden op Mathworld, en deze site heeft een applet waar je zelf de functie kunt instellen en via Wijzigen Þ Methode Functie en interval kun je kiezen voor de Regula Falsi-methode en het gewenste begin- en eindpunt, het interval enzovoorts.
Nu je weet wat Regula Falsi inhoudt kun je 't gaan programmeren. Het belangrijkste is dat er een interval gekozen wordt waar één nulpunt in ligt. Op dat interval kies je een begin- en een eindpunt. De y-coördinaten van de punten moeten een verschillend teken hebben! Anders gaat het niet. Door 2 punten wordt een lijn bepaald, standaard van de vorm y = ax + b. Je kunt dus een algemene voorstelling van de lijn opstellen als je de functie weet (de functie waarvan je het nulpunt gaat benaderen) en 2 x-coördinaten (en bijgevolg weet je de y-coördinaten ook).
Die lijn snijdt de x-as in één punt, dat los je op door de standaardfunctie (opgesteld a.d.h.v. de twee willekeurige punten op functie) gelijk te stellen aan 0, want de snijpunten met de x-as bereken je door f(x) = 0 te berekenen.
De x-coördinaat van het snijpunt met de x-as van de lijn is al een benadering van het nulpunt. Vul de gevonden x-coördinaat in de functie in en kijk welk teken de y-coördinaat heeft. Als het positief is dan moet er een nieuwe rechte lijn getrokken worden met het andere negatieve y-coördinaat. Indien de y-coördinaat negatief is, dan moet er een nieuwe lijn getrokken worden door het punt met de positieve y-coördinaat. De applet op deze site laat dat heel duidelijk zien.
Hoe ik het gedaan heb is als volgt:
Geef de gebruiker wat informatie over het programma en hoe ze informatie moeten invoeren.
Laat de gebruiker de reële coëfficiënten van de functie (die ik hoogstens 7-de graads heb gesteld) invullen.
Laat de gebruiker een begin- en eindpunt invullen. (Geef de gebruiker de mogelijkheid om zich te herstellen, als hij/zij bijvoorbeeld beginpunt groter of gelijk aan eindpunt heeft ingevuld)
Bereken de y-coördinaten van begin- en eindpunt
Indien y-coördinaten hetzelfde teken hebben laat het programma dan stoppen met een mededeling (of maak het iets gebruiksvriendelijker)
Vraag hoeveel stappen er genomen moeten worden
Bereken in de FOR-lus de y-coördinaten van begin- en eindpunt die continu veranderen. Bereken in diezelfde FOR-lus het snijpunt met de x-as van de rechte lijn (en de y-coördinaat van de grafiek met dezelfde x-coördinaat). Verander afhankelijk van het teken van y-coördinaten het eindpunt of het beginpunt (beginpunt óf eindpunt wordt snijpunt met x-as van rechte lijn).
Hieronder vind je mijn programmeer-tekst, ik heb het zo simpel mogelijk gehouden, je zou de testjes wel kunnen nesten en de macht kunnen oplossen met exp(b*ln(a)) waarbij ab wordt berekend, je zou functies/procedures kunnen schrijven, enz. Verder heb ik niet gelet op de indentatie.
Program regfal; VAR cofzeven,cofzes,cofvijf,cofvier,cofdrie,coftwee,cofeen,consta:REAL; VAR hulp,snijpxco,snijpyco,beginx,eindx,beginy,eindy:REAL; VAR stappen,teller:INTEGER;
BEGIN Writeln('Dit programma benadert een nulpunt (indien aanwezig) op een gegeven'); Writeln('interval van een gegeven continue functie die hoogstens 7-de graads is'); Writeln('via de Regula Falsi-methode.'); Writeln(''); Writeln('De standaardvorm is dus f(x) = ax^7 + bx^6 + cx^5 + dx^4 + ex^3 + fx^2'); Writeln('+ gx + h waarbij a,b,c,d,e,f,g en h reeel'); Writeln('Vul nu achtereenvolgens a,b,c,d,e,f,g en h in (druk telkens op enter)'); Writeln('Indien een term ontbreekt vul je 0 in'); readln(cofzeven,cofzes,cofvijf,cofvier,cofdrie,coftwee,cofeen,consta); Writeln('============================='); Writeln('Deze methode werkt alleen als de y-coordinaten van het begin-'); Writeln('en eindpunt van het interval een verschillend teken hebben'); Writeln('Geef het beginpunt van het gewenste interval (x-coordinaat)'); readln(beginx); Writeln('Geef het eindpunt van het gewenste interval (x-coordinaat)'); readln(eindx); IF (beginx >= eindx) THEN BEGIN WHILE (beginx >= eindx) DO BEGIN Writeln('Ongeldige invoer, begin- en eindpunt moeten verschillend'); Writeln('van elkaar zijn, en beginpunt kleiner dan eindpunt'); Writeln('Geef nieuw beginpunt en eindpunt in'); readln(beginx,eindx); END;
IF (((beginy < 0.0) AND (eindy < 0.0)) OR ((beginy > 0.0) AND (eindy > 0.0))) THEN Writeln('Onmogelijk, beide ordinaten hebben hetzelfde teken') ELSE BEGIN Writeln('Hoeveel stappen moeten er genomen worden?'); readln(stappen); FOR teller:=1 TO stappen DO BEGIN beginy:=cofzeven*beginx*beginx*beginx*beginx*beginx*beginx*beginx + cofzes*beginx*beginx*beginx*beginx*beginx*beginx + cofvijf*beginx*beginx*beginx*beginx*beginx + cofvier*beginx*beginx*beginx*beginx + cofdrie*beginx*beginx*beginx + coftwee*beginx*beginx + cofeen*beginx + consta; eindy:=cofzeven*eindx*eindx*eindx*eindx*eindx*eindx*eindx + cofzes*eindx*eindx*eindx*eindx*eindx*eindx + cofvijf*eindx*eindx*eindx*eindx*eindx + cofvier*eindx*eindx*eindx*eindx + cofdrie*eindx*eindx*eindx + coftwee*eindx*eindx + cofeen*eindx + consta; Writeln('f(',beginx:15:8,') =',beginy:15:8); Writeln('f(',eindx:15:8,') =',eindy:15:8); Writeln('Absis snijpunt lijn door begin- en eindpunt interval met x-as'); snijpxco:=(beginx*eindy - eindx*beginy)/(eindy - beginy); Writeln(snijpxco:15:8); Write('f(',snijpxco:15:8,') = '); snijpyco:=cofzeven*snijpxco*snijpxco*snijpxco*snijpxco*snijpxco*snijpxco*snijpxco + cofzes*snijpxco*snijpxco*snijpxco*snijpxco*snijpxco*snijpxco + cofvijf*snijpxco*snijpxco*snijpxco*snijpxco*snijpxco + cofvier*snijpxco*snijpxco*snijpxco*snijpxco + cofdrie*snijpxco*snijpxco*snijpxco + coftwee*snijpxco*snijpxco + cofeen*snijpxco + consta; Writeln(snijpyco:15:8); Writeln('Druk op enter voor volgende stap'); readln; IF ((beginy < 0) AND (snijpyco > 0)) THEN eindx:=snijpxco; IF ((beginy < 0) AND (snijpyco < 0)) THEN beginx:=snijpxco; IF ((beginy > 0) AND (snijpyco > 0)) THEN beginx:=snijpxco; IF ((beginy > 0) AND (snijpyco < 0)) THEN eindx:=snijpxco;
END;
END;
END.
Het programma in executable-vorm kun je hier downloaden. (Rechtsklikken en 'Doel opslaan als' kiezen).