![]() |
Das mathematische Problem..... x hoch 3 - x*6
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen!
Ich habe hier ein Problem! (Wer hätte das gedacht?) Folgendes: Ich habe mir vorgenommenm, ein Programm zu schreiben, dass y für die Funktion x hoch 3 - x*6 berechnet, und zwar in 0.1-er Schritten. Das Intervall, von dem die Werte genommen werden, kann man selber eingeben. Das war auch soweit kein Problem, aber als ich dann eine Vorzeichenanalyse(wann geht die Funktion von - nach + oder umgekehrt) noch zusätzlich mit eingebaut habe, bekam ich zwar Funktionswerte zurück, diese Werte waren zwar von der Anzahl richtig, aber um ca. 1,5 Zahlenwerte verschoben... Ich hab alles mögliche Versucht, zusätzlicher Timer, sleep, usw... aber der Fehler besteht weiterhin... Zur Veranschaulichung habe ich ein Bild mit angehängt... Mein Code:
Delphi-Quellcode:
var
Form1: TForm1; fx,zahler,k,x,y,z,i,A,B: Extended; implementation {$R *.DFM} procedure Tform1.Graphrechnen; begin memo2.lines.text:= ''; a := strtofloat(edit2.text); // Intervallanfangswert = A b:= strtofloat(edit3.text); // Intervallendungswert = B x := A; memo2.Lines.add( 'Berechnung von x für das Intervall '+ floattostr (a) + ' bis ' + floattostr (b)); repeat fx:=power(x,3) - (6 * x); // Berechnung der Funktion x hoch 3 - x*6 fx:= RoundToPointPosition(fx, 5); // Wert wird gerundet x := RoundToPointPosition(x, 3); // Wert wird gerundet VZW; // Vorzeichenwechselanalyse memo2.lines.add(floattostr (fx) + ' für ' + floattostr(x)); X:= x +(0.1); // x wird um 0,1 vergrößert... until x > B; // es wird solange die Funktion berechnet, bis x gleich dem Intervallendungswert ist exit; end; 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); z:= fx-y; //... um mit der Differenz ausrechnen zu können, ob der Graph im Negativen, bzw. Positiven ist if z > 0 then //Das nicht bei jedem z > 0 die Schleife ausgefürt wird... begin if zahler = 1 then // ...ist ein Schutz eingebaut exit; zahler := +1; memo1.Lines.add('Vorzeichenwechsel +/- bei '+ floattostr(x)); end; if z < 0 then begin if zahler = -1 then exit; zahler := -1; memo1.Lines.add('Vorzeichenwechsel -/+ bei '+ floattostr(x)); end; end; function RoundToPointPosition(Number : Extended; PointPos : Byte): Extended; begin Result := StrToFloat(FloatToStrF(Number, ffNumber, 10, PointPos)); end; end. Ich hoffe ihr könnt mir helfen. Vielen Dank [edit=Luckie]Delphi-Tags. Mfg, Luckie[/edit] |
Re: Das mathematische Problem..... x hoch 3 - x*6
Hi,
du willst doch nur die Änderung des Vorzeichens deiner Funktion betrachten. In deinem Beisplel: f(x) = x^3 - 6x Dazu benötigst du alle Nullstellen: f(x) = 0; x1 = -2.45; x2 = 0; x3 = 2,45 jetzt lässt du einfach x gegen jede der Nullstellen streben. > lim (x^3-6x) --> - unendlich x -> -2.45 x < -2.45 > lim (x^3-6x) --> + unendlich x -> -2.45 x > -2.45 ==> so haben wir hier einen VZW (- --> +) MFG devnull [EDIT]Ich hab noch irgendwo Source, da ich schon mal das gleiche programmiert hab; nur halt für DOS. Ich schick dir den Source[/EDIT] |
Re: Das mathematische Problem..... x hoch 3 - x*6
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:
Ü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 :-P
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; @devnull: wollte er die Nullstellen nicht rauskriegen? :roll: |
Re: Das mathematische Problem..... x hoch 3 - x*6
@tommie-lie
Tausend Dank, das war genau dass, was ich gesucht habe! |
Re: Das mathematische Problem..... x hoch 3 - x*6
Hallo fes,
dein Code sieht aus wie an die Wand geklatschte Spaghetti. Bitte lies doch mal die Beiträge zum Pascal Stil durch. Nicht böse gemeint, nur als Tip! Rainer |
Re: Das mathematische Problem..... x hoch 3 - x*6
Zitat:
Dauert mit zu lange. Bei korrekter Formattierung wird die Lesbarkeit erheblich gesteigert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz