Delphi-PRAXiS
Seite 2 von 9     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi [Tutorial] Quadratische Gleichungen vollständig lösen (https://www.delphipraxis.net/137624-%5Btutorial%5D-quadratische-gleichungen-vollstaendig-loesen.html)

sx2008 24. Jul 2009 17:29

Re: Quadratische Gleichungen vollständig lösen
 
Zitat:

Zitat von stoxx
ich finde dieses Beispiel als Lehrbeispiel sehr, sehr, sehhr ungeeignet, weil direkt mit den Editfeldern in den Berechnungen gearbeitet wird.
Besser wäre es, die Ausgabe immer von den Berechnungen zu trennen.
Erst Modul Eingabe, dann alle Werte zur Berechnung .. dann wieder zurück und dann Ausgabe. ..
Daten von der Visualiserung trennen

Das war auch mein erster Gedanke. Eine saubere Funktion wird hier benötigt:
Delphi-Quellcode:
function SolvePolynom2ndOrder(a,b,c: extended; var x1,x2:extended):Integer;
Über die Namen der Ein- und Ausgabeparameter kann natürlich verhandelt werden.
Die Funktion selbst liefert 0=keine Lösung, 1=Doppelte Nullstelle, 2=x1 und x2 enthalten die Nullstellen.
Und ich bin mit Englisch schon sehr verseucht; man darf auch deutsche Funktionsnamen (NullstellenQuadGleichung()) verwenden.

schöni 24. Jul 2009 17:48

Re: Quadratische Gleichungen vollständig lösen
 
Zitat:

Zitat von fwsp
Ich würde behaupten die 0 lässt sich doch darstellen?

Das schon, aber erstens kann Float Format bei sehr kleinen Zahlen fehlerhafte ergebnisse bringen weshalb beim Größenvergleich besser mit einem Grenzwert Epsilon verglichen wird.

Das zweite problem ergibt sich hier wegen p = b/a

Wenn dann der Koeffizient a = 0 ist gibt es eine Exception EDividebyZero.

stoxx 24. Jul 2009 18:00

Re: Quadratische Gleichungen vollständig lösen
 
@ Aphton
Zitat:

Wenn wir schon dabei sind
na so ist das doch schon viel schöner :-)

Wolfgang Mix 24. Jul 2009 18:21

Re: Quadratische Gleichungen vollständig lösen
 
@ Aphton schrieb:

// else -> keine Reelle Lösung

Gib hier bitte 'mal die beiden komplexen Lösungen zurück

mfg

Wolfgang

gammatester 24. Jul 2009 22:42

Re: Quadratische Gleichungen vollständig lösen
 
Zitat:

Zitat von Aphton
Wenn wir schon dabei sind


Das ist keine saubere Lösung. Es wird zB nicht zurückgeliefert, wieviele Lösungen da sind.

mit x := SolveQuadraticEquation(1.0,2.0,1.0); ist x[1] unbelegt (und da man das nicht mitgeteilt kriegt, kracht's oder es wird mit unsinngen Werte weiter gerechnet).

Es ist verständlich, wenn Du den komplexen Fall nicht betrachten willst. Allerdings ist doch der lineare Fall A=0 leicht zu behandeln und sollte nicht durch ein schödes "if A=0 then exit" abqualifiziert werden.

Was in allen Beiträgen so gut wie überhaupt nicht behandelt wird, sind die Rundungsfehler-, Überlauf-, Unterlaufprobleme. Diese sind so alt wie das Programmieren und eigentlich schon seit 40 Jahren im Rahmen des möglichen gelöst.

Aphton 25. Jul 2009 11:28

Re: Quadratische Gleichungen vollständig lösen
 
Zitat:

Zitat von gammatester
Das ist keine saubere Lösung. Es wird zB nicht zurückgeliefert, wieviele Lösungen da sind.

Du kannst mit Length die Anzahl der Lösungen bestimmen:
Delphi-Quellcode:
  X := SolveQuadraticEquation( 1.0, 2.0, 1.0 );
  ShowMessage( 'Anzahl der Lösungen: ' + IntToStr( Length(X) ) );
Natürlich kann man da noch einen eigenen Typen (wie folgt) definieren
Delphi-Quellcode:
  TQuadraticEquationResults = record
    ResultCount: Byte;
    Results: TDoubleArr;
  end;
Aber um ehrlich zu sein, ist das - für meinen Geschmack - nicht unbedingt erforderlich.

MfG

jfheins 25. Jul 2009 12:36

Re: Quadratische Gleichungen vollständig lösen
 
Wenn man ins komplexe geht, kann man sich das mit der Anzahl sparen, da hat die Gleichung immer genau 2 Lösungen :) (Berührpunkt ist eine doppelte Lösung)

Wolfgang Mix 26. Jul 2009 16:53

Re: Quadratische Gleichungen vollständig lösen
 
Ich hoffe, die meisten von Euch können jetzt mit dieser Variante leben:

Delphi-Quellcode:
type
  TSolution = Array of String;

function pq( A, B, C : Double ): TSolution;
var
  Radikand, re, im: Double;
begin
//  ax² + bx + c = 0
  if A = 0 then exit;
    B := B / A; //p
    C := C / A; //q
  //  Radikand berechnen
  Radikand := sqr(B/2) - C;
  //Realteil berechnen
  re:=-B/2;
  //Imaginärteil berechnen
  im:=sqrt(abs(Radikand));

  if Radikand > 0 then
  begin // zwei Lösungen
    SetLength( Result, 2 );
    Result[0] := FloatToStr(-B/2 + sqrt( Radikand ));
    Result[1] := FloatToStr(-B/2 - sqrt( Radikand ));
  end
  else
  if abs(Radikand) < 1e-6  then
  begin // eine Lösung
    SetLength( Result, 1 );
    Result[0] := FloatToStr(-B/2);
  end
  else
  if Radikand < 0 then
  begin
     ///Radikand:=-Radikand;
     SetLength( Result, 2 );
     Result[0] := FloatToStr(re) + ' + ' + FloatToStr(im) + ' i ';
     Result[1] := FloatToStr(re) + ' - ' + FloatToStr(im) + ' i ';
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a,b,c: double;
begin
   a:=StrToFloat(Edit1.Text);
   b:=StrToFloat(Edit2.Text);
   c:=StrToFloat(Edit3.Text);
   if (a=0) or (b=0) or (c=0) then
   begin
     //Werte der Funktion gar nicht erst übergeben
     showmessage ('Keine reine quadratische Gleichung!');
     sleep(2000);
     exit;
   end
   else
   begin
     Edit4.Text:=pq(a,b,c)[0];
     Edit5.Text:=pq(a,b,c)[1];
   end;
end;

jfheins 26. Jul 2009 18:20

Re: Quadratische Gleichungen vollständig lösen
 
Hmmm ... also wenn ich ehrlich bin: Ich denke nicht, dass das lösen einer Quadratischen Gleichung eine derart große Sache ist, die unbedingt in die CodeLib rein muss ...

ich meine: Wenn ich das mal brauche, guck ich in die Wikipedia und hol mir die Lösungsformel und fertig. Danbn kann ich die unterscheidlichen Fälle (reell/imaginär) auch passend behandeln. Es kann ja sein, dass nur reelle Lösungen Sinn machen. Oder dass es auf den rellen Teil der komplexen Lösung ankommt.

Also nichts für ungut, aber ich wollte nur mal einwerfen, dass sowas nicht undingt rein muss :stupid:

Wolfgang Mix 26. Jul 2009 18:34

Re: Quadratische Gleichungen vollständig lösen
 
Noch eine Anmerkung:

Bei elektrotechnischen Fragestellungen im Wechselstromkreis sind die meisten Lösungen komplexe!

mfg

Wolfgang


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 Uhr.
Seite 2 von 9     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz