Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Kurvendiskussion - Nullstellen Extrema usw. mit Tchart (https://www.delphipraxis.net/89070-kurvendiskussion-nullstellen-extrema-usw-mit-tchart.html)

SeriousToni 25. Mär 2007 21:08

Re: Kurvendiskussion - Nullstellen Extrema usw. mit Tchart
 
Liste der Anhänge anzeigen (Anzahl: 1)
hier einmal ein Bild- der rote Graph ist die Darstellung von Tchart - der grüne den ich mit der Hand gezeichnet hab, wäre aber richtig! :o

Nikolas 25. Mär 2007 21:15

Re: Kurvendiskussion - Nullstellen Extrema usw. mit Tchart
 
Das ist natürlich Unsinn, da die Grenzen des Intervalls einzufügen...
Dieses n, das ich eingeührt habe, steht grob für die n-te NS der Funktion. Mal dir mal den Sinus auf und beschrifte die Nullstellen mit 0*pi,1*pi usw. und du wirst den Fehler sehen.

Wenn deine untere Intervallgrenze (a,b) positiv ist, müsstest du es so machen:
n=floor(a/pi);

die ersten n NS (von x=0 an gezählt) liegen also nicht in deinem Intervall, also schaust du dir nur die Nullstellen die zu floor(a/pi)<n<ceil(b/pi) liegen. (+-1 an jeder Seite, so genau habe ich da jetzt nicht nachgedacht. Ähnliche Überlegungen kannst du dann auch machen, wenn dein Intervall teilweise negativ ist.

Wie siehts denn mit den Polynomen aus?

// Zum Schaubild
Wenn du dabei Hilfe brauchst mache einen eigenen Thread dafür auf und füge noch den passenden Code hinzu. Wenn du nicht verräts, was du geschrieben hast, kann dir auch niemand deinen Fehler sagen.

SeriousToni 25. Mär 2007 21:18

Re: Kurvendiskussion - Nullstellen Extrema usw. mit Tchart
 
den grünen hab ich ja auch mit der Hand gezeichnet - aber ich glaub ich hab den Fehler jetzt gefunden und es müsste wieder Funktionieren!

So, also bleiben wir beim sinus-Problem, ok ich werde mir den mal aufzeichnen und deinen Hinweis anschauen - vielleicht bekomm ichs hin

btw welche Polynome? die x³ Funktion?? Umm ich glaub die mach ich wieder raus weil das is mir zu kompliziert mit der Polynomdivision usw. Das pack ich nich

SeriousToni 25. Mär 2007 22:14

Re: Kurvendiskussion - Nullstellen Extrema usw. mit Tchart
 
So du hast mir schonmal ein wenig auf die Sprünge geholfen, ich habe jetzt folgenden Code:
Delphi-Quellcode:
//Nullstelle  positiv
form1.ListBox1.clear;
a:=0;
b:=strtofloat(form1.Edit11.text);
c:=0;
d:=strtofloat(form1.Edit17.text);
while a<d do begin
  xo1:=c*(pi/b);
  form1.ListBox1.Items.Add(floattostr(xo1));
  a:=a+(pi/b);
  c:=c+1;   end;

//Nullstelle  negativ
a:=0;
b:=strtofloat(form1.Edit11.text);
c:=0;
d:=-1*(strtofloat(form1.Edit16.text));
if (strtofloat(form1.Edit17.text))>=0 then begin
  while a<d do begin
    xo1:=-1*(c*(pi/b));
    if xo1<>0 then begin
      form1.ListBox1.Items.Add(floattostr(xo1)); end;
    a:=a+(pi/b);
    c:=c+1; end;                            
  end;
Die Formel für die Funktion lautet
Delphi-Quellcode:
y:=a*sin(b*x)
Das einzigste Problem ist, dass man hier keinen Intervall eingeben darf, der nicht durch 0 geht (z.B. -15 bis -10 oder 10 bis 15) - aber ich denke das muss ich wohl in Kauf nehmen.

edit: hab die Formel etwas umgebaut und sie Funktioniert jetzt auch für die Kosinusnullstellen!

SeriousToni 26. Mär 2007 13:58

Re: Kurvendiskussion - Nullstellen Extrema usw. mit Tchart
 
Ich lasse nun auch die Ableitungen berechnen, das ist ja an sich nicht schwer da die Formel ja einfach ist, hier ein Beispiel aus meinem Program :)
Delphi-Quellcode:
//Ableitungen
form1.Label9.Caption:=form1.Edit1.Text+'*x*x + '+form1.Edit2.Text+'*x + '+form1.Edit3.Text;
a:=strtofloat(form1.Edit1.Text)*2;
form1.Label10.Caption:=floattostr(a)+'*x + '+form1.Edit2.text;
form1.Label11.Caption:=floattostr(a);
form1.Label12.caption:='0';
Dies ist die Funktion a*x*x+b*x+c
a,b und c kann der Benutzer eingeben.
Label 9 ist die normale Funktionsformel f(x).
Label 10 die erste Ableitung f'(x),
Label 11 und 12 die zweite und dritte Ableitung f''(x) f'''(x).

In Mathe müssen wir bei einer Kurvendiskussion immer die Extrema (Hochpunkt/Tiefpunkt) und die Wendepunkte (Lr-WP/Rl-WP) berechnen.
Will ich die Extrema berechnen, setze ich die erste Ableitung f'(x)=0.
Aus dem Ergebnis ergibt sich der x-Wert, den ich in f(x) einsetze und damit y erhalte. Setze ich x in f''(x) ein, so erhalte ich bei x<0 einen Hochpunkt und bei x>0 einen Tiefpunkt.
Ähnlich macht man es bei den Wendepunkten (die nächst höhere Ableitung, gleicher Prozess).

Aber wie kann ich das in Delphi lösen? Weil ich kann ja nicht einfach sagen "setz mal die erste Ableitung 0 und stelle nach x um!" Ich hab halt verschiedene Formeln, es gibt z.B.
a*x*x+b*x+c oder m*x+n oder a*sin(b*x) und auch a*cos(b*x). Je nachdem was der Nutzer für a, b, c, n oder m eingibt sehen ja die Formeln anders aus! :pale:

Ich wollte gerne die Extrema und WP mit ihren x und y Koordinaten und der Art des Extremas/WPs in einer Listbox ausgeben. Das kann ich mit form1.listbox1.items.add(...) machen :)

Die Funktionen stelle ich mit Tchart dar:
Delphi-Quellcode:
x:=strtofloat(form1.Edit16.Text);
while x<= strtofloat(form1.Edit17.Text) do
  begin
  y:=(a*x*x)+(b*x)+c;
  form2.series1.addxy(x,y);
  form2.Series2.addxy(x,0);
  form2.Series3.AddXY(0,y);
  x:=x+0.01;
  end;
Für die Funktion f(x)=m*x+n lasse ich einfach "Keine" in der Listbox erscheinen, da die Funktion ja keine Extrema oder Wendepunkte haben kann :bounce1:

SeriousToni 26. Mär 2007 17:26

Re: Kurvendiskussion - Nullstellen Extrema usw. mit Tchart
 
also die Extrema für a*x*x+b*x+c funktionieren jetzt! Hatte einen Geistesblitz, ich brauch ja nur den Scheitelpunkt berechnen ^^
Ich hänge aber noch an den Wendepunkten und Extrema von Sinus und Cosinusfunktionen :( Weis jemand, wie ich das am besten berechnen kann? Das Problem ist, das die Funktionen ja a*sin(b*x) bzw. cos sind, a und b sind variabel vom Nutzer einzugeben.

Nikolas 26. Mär 2007 17:45

Re: Kurvendiskussion - Nullstellen Extrema usw. mit Tchart
 
Noch ein paar Hinweise:

- Gib deinen Labels passende Namen. Sonst ist es kaum zu verstehen.
- Schreib den Inhalt aus den Labels in passende Floatvariablen, damit du nachher nicht immer bei den Berechnungen ein strtofloat(Edit.text) schreiben musst, was sehr die lesbarkeit einschränkt.
- Rücke sinnvoll ein! Such mal nach einem Styleguide, sonst wird dein Lehrer deinen Text auch nicht gerne lesen, was sicher Punktabzug bedeutet.

Zitat:

Aber wie kann ich das in Delphi lösen? Weil ich kann ja nicht einfach sagen "setz mal die erste Ableitung 0 und stelle nach x um!" Ich hab halt verschiedene Formeln, es gibt z.B.
a*x*x+b*x+c oder m*x+n oder a*sin(b*x) und auch a*cos(b*x). Je nachdem was der Nutzer für a, b, c, n oder m eingibt sehen ja die Formeln anders aus!
bei ax^2+bx+c: Nullstellen per PQ-Formel ausrechnen. Dann ableiten: 2ax+b=0 -> x=-b/2a (natürlich erst mal auf a<>0 testen) zweite Ableitung: 2a und damit entscheiden, ob du einen Hoch oder einen Tiefpunkt hast.
Also alle Möglichen Ableitung fest in dein Programm schreiben und dann nur mit den Werten füttern.

Nimm dir erst mal ein Papier und leite deine möglichen Funktionen ab und forme sie passende um und schau was passieren kann, wenn verschiedene Teile kleiner als Null (pq-Formel) oder gleich null sind, wo du also noch Spezialfälle einbauen willst.
Wenn du damit fertig bist, kannst du das hier mal veröffentlichen und später dann implementieren. Also erst denken und dann an den Computer setzen.

SeriousToni 26. Mär 2007 17:56

Re: Kurvendiskussion - Nullstellen Extrema usw. mit Tchart
 
ah mein Helfer ist wieder hier :thumb:
Also mit der quadrat. Funktion das funktioniert jetzt, danke, wie gesagt, ich weis nicht wie ich die Extrema und WP von cos und sin Funktionen herausbekommen soll wenn a und b variabel sind?? :pale:

Nikolas 26. Mär 2007 18:06

Re: Kurvendiskussion - Nullstellen Extrema usw. mit Tchart
 
Wie sehen denn die ersten beiden Ableitungen aller Funktionen aus? Hast du schon die Nullstellen der normalen Sinusfunktion berechnet?

SeriousToni 26. Mär 2007 18:16

Re: Kurvendiskussion - Nullstellen Extrema usw. mit Tchart
 
Die Ableitung zu sinus:
Delphi-Quellcode:
//Ableitungen
a:=strtofloat(form1.Edit10.text) ;
b:=strtofloat(form1.Edit11.text) ;
form1.Label9.Caption:=a+'*sin('+b+'*x)';
form1.Label10.Caption:='2*a*cos(b*x)';
form1.Label11.Caption:='-2*a*sin(b*x)';
form1.Label12.caption:='-2*a*cos(b*x)';
Label9 - Funktion
Label10- 1.Ableitung
Label11- 2.A.
Label12- 3.A.

Zu cosinus wäre das:
a*cos(b*x)';
2*a*cos(b*x);
-2*a*sin(b*x);
-2*a*cos(b*x);

Die Nullstellenberechnung habe ich mir selber ausgedacht, sie funktioniert einmal von 0 bis Intervallstart (negativ) und dann von 0 bis Intervallende (positiv). Daher funktioniert sie nicht, wenn das Intervall der Sinusfunktion nicht durch 0 geht (also z.B. wenn als Intervall -5 bis -2 festgelegt wurde), wie ich auch schon gestern hier geschrieben habe.

Ist ziemlich schwer zu verstehen, aber es funktioniert wenigstens, solange man halt nen Intervall eingibt der durch 0 geht, aber das ist schon ok für mich :)
Ich weis nicht wie ich auf Extrema und WP bei sin und cos Funktionen kommen soll mit delphi?
edit16 = Intervallstart und edit17 = Intervallende!
Delphi-Quellcode:
//Nullstelle  positiv
form1.ListBox1.clear;
a:=0;
b:=strtofloat(form1.Edit11.text);
c:=0;
d:=strtofloat(form1.Edit17.text);
while a<d do begin
  xo1:=c*(pi/b);
  form1.ListBox1.Items.Add(floattostr(xo1));
  a:=a+(pi/b);
  c:=c+1;   end;

//Nullstelle  negativ
a:=0;
b:=strtofloat(form1.Edit11.text);
c:=0;
d:=-1*(strtofloat(form1.Edit16.text));
if (strtofloat(form1.Edit17.text))>=0 then begin
  while a<d do begin
    xo1:=-1*(c*(pi/b));
    if xo1<>0 then begin
      form1.ListBox1.Items.Add(floattostr(xo1)); end;
    a:=a+(pi/b);
    c:=c+1; end;                            
  end;
Ähnliches gilt für die cosinusfunktion.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 Uhr.
Seite 2 von 3     12 3      

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 by Thomas Breitkreuz