WisFaq!

\require{AMSmath} geprint op vrijdag 3 mei 2024

Regula falsi en turbo pascal

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
11-8-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:



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;

                             END;
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;

   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).

Groetjes,

Davy.

Davy
12-8-2004


© 2001-2024 WisFaq
WisFaq - de digitale vraagbaak voor het wiskunde onderwijs - http://www.wisfaq.nl

#26542 - Software - 2de graad ASO