Mit deiner VZW-Funktion rechnest du nicht den Schnittpunkt des Graphen mit der X-Achse aus, sondern den der ersten Ableitung mit der X-Achse, du bestimmst also einen Extrempunkt (die Funktion hat einen Hochpunkt bei -sqrt(2) und einen Tiefpunkt bei sqrt(2), aufgrund deiner Methode bekommst du -1,3 und 1,5 raus).
Um wirklich den Schnittpunkt mit der x-Achse zu bestimmen, darfst du nicht die Differenz zwischen zwei Punkten nehmen, sondern das Vorzeichen eines Punktes selbst im Vergleich zum vorangehenden:
Delphi-Quellcode:
procedure Tform1.VZW; // Vorzeichenwechselanalyse
begin
if memo1.lines.text='' then
memo1.lines.add('Berechnung von x für das Intervall '+ floattostr (a) + ' bis ' + floattostr (b));
k := x -0.1; // zur Berechnung wird der vorherige Wert genommen...
y := power(k,3) - (6 * k);
if sign(fx) <> sign(y) then // wenn Vorzeichen anders ist
// dann bestimmen wir die Richtung des Wechsels
if sign(fx) = -1 then
memo1.Lines.add('Vorzeichenwechsel +/- bei '+ floattostr(x))
else if sign(fx) = 1 then
memo1.Lines.add('Vorzeichenwechsel -/+ bei '+ floattostr(x));
end;
Über die Effizienz und Genauigkeit dieser Methode ließe sich streiten, aber so funktioniert's jedenfalls einigermaßen, abgesehen davon daß immer noch nach oben gerundet wird, und bei glatten Werten 0,1 dazugerechnet wird. Optimieren darfst du
@devnull: wollte er die Nullstellen nicht rauskriegen?