Delphi-PRAXiS
Seite 1 von 9  1 23     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)

Wolfgang Mix 24. Jul 2009 13:48


[Tutorial] Quadratische Gleichungen vollständig lösen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Eine quadratische Gleichung hat die allgemeine Form

y = a*x^2 + b*x +c (1)

Die Lösung(en) findet man bei y = 0

a*x^2 + b*x + c = 0 (2)

Teilt man (2) durch a, erhält man die Normalform einer quadratischen Gleichung:

x^2 + p*x + q = 0 (3), wobei p = b/a und q = c/a

Die Lösung(en) erhält man mit der Formel:

x1,2 = -p/2 +- sqrt(sqr(p/2)-q))

4 Möglichkeiten sind zu beachten:

1.) Wenn a = 0 ist, liegt keine quadratische Gleichung vor.
2.) Wenn der Radikand sqr(p/2)-q Null ist, gibt es nur eine reelle Lösung.
3.) Wenn der Radikand positiv ist, gibt es 2 reelle Lösungen
4.) Wenn der Radikand negativ ist, gibt es 2 komplexe Lösungen

Anmerkung zu (4): sqrt(-1) ist die imaginäre Zahl i

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var a,b,c,Radikand,wurzel,p,q,x1,x2,im,re:real;
begin
  a:=StrToInt(Edit1.Text);
  b:=StrToInt(Edit2.Text);
  c:=StrToInt(Edit3.Text);
  if a=0 then showmessage('Keine quadratische Gleichung');
  try
    p:=b/a;q:=c/a;
  except
     on E : Exception do
     begin
       ShowMessage('Exception class name = '+E.ClassName);
       ShowMessage('Exception message = '+E.Message);
     end;
  end;

  Radikand:=sqr(p/2)-q;

  If Radikand=0 then
  begin
     x1:=-p/2;
     Edit4.Text:= 'x = ' + FloatToStr(-p/2);
     Edit5.Text:='';
     Label6.Caption:='Nur eine Lösung!';
  end;

  If Radikand>0 then
  begin
     x1:=-p/2+sqrt(Radikand);
     x2:=-p/2-sqrt(Radikand);
     Edit4.Text:='x1 = ' + FloatToStr(x1);
     Edit5.Text:='x2 = ' + FloatToStr(x2);
     Label6.Caption:='2 relle Lösungen!';
  end;

  If Radikand<0 then
  begin
      Radikand:=-Radikand;
      re:=-p/2;
      im:=sqrt(Radikand);
      Edit4.Text:=FloatToStr(re) + ' + '+ FloatToStr(im) + ' i';
      Edit5.Text:=FloatToStr(re) + ' - '+ FloatToStr(im) + ' i';
      Label6.Caption:='2 komplexe Lösungen!';
  end;
end;
[edit=TBx]Das Thema dient inzwischen mehr der Erstellung eines Turorials. Wenn ein solches fertig gestellt ist, wird das Thema entsprechend verschoben, Einzug in die CL wird es sicherlich nicht finden. Dafür habe wir dann ja die Tutorial-Sparte. Mfg, TBx[/edit]

fwsp 24. Jul 2009 13:56

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

Zitat von Wolfgang Mix
Delphi-Quellcode:
If Radikand=0 then

die stelle könnte kritisch sein, denn so ein real lässt sich nicht gern mit einem festen wert vergleichen.
eine möglichkeit um das zu umgehen: einen gewisse abweichung mit einzuberechnen.

//edit
artikel von luckie dazu: http://www.michael-puff.de/Artikel/Fliesskomma.shtml

xZise 24. Jul 2009 14:01

Re: Quadratische Gleichungen vollständig lösen
 
Muss Radikand = 0 problematisch sein? Ich würde behaupten die 0 lässt sich doch darstellen?

MfG
xZise

fwsp 24. Jul 2009 14:02

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

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

und der andre teil?

Wolfgang Mix 24. Jul 2009 14:24

Re: Quadratische Gleichungen vollständig lösen
 
Wie wär's denn damit:

If (Radikand < 1e99) or (Radikand >1e-99) then

Die Muhkuh 24. Jul 2009 14:44

Re: Quadratische Gleichungen vollständig lösen
 
Oder Math.IsZero ;)

stoxx 24. Jul 2009 15:14

Re: Quadratische Gleichungen vollständig lösen
 
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

Jakob Ullmann 24. Jul 2009 15:30

Re: Quadratische Gleichungen vollständig lösen
 
Also die Lösungsformel liest sich so (in Textform) sehr bescheiden. Ich würde vorschlagen, dafür ein Bild einzufügen (z. B. von der Wikipedia, oder von einem LaTeX-Onlineservice, oder halt vom eigenen Webscape). Desweiteren ist es wohl angenehmer, die Formel entsprechend für die allgemeine Form anzupassen. Klar ist so die Herleitung schöner, aber anwenden lässt es sich so nicht so schön.

@stoxx: Prinzipiell hast du da ja recht, aber wegen einer quadratischen Gleichung eine neue Unit aufzumachen, ist vielleicht etwas übertrieben. Klar, wenn da noch mehr dazukäme, wäre es sinnvoll.

stoxx 24. Jul 2009 16:16

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

Zitat von Jakob Ullmann
@stoxx: Prinzipiell hast du da ja recht, aber wegen einer quadratischen Gleichung eine neue Unit aufzumachen, ist vielleicht etwas übertrieben. Klar, wenn da noch mehr dazukäme, wäre es sinnvoll.

ich meinte keine neue Unit, sondern eine ausgelagerte Funktion reicht vollkommen, die als Rückgabewert einen Array of "Lösungen" hat.
gibt ja manchmal eine, zwei oder keine Reelle Lösung ..

und es geht auch darum, sich sowas erst gar nicht anzugewöhnen, wie der Threadersteller es getan hat.
Übung und Gewohnheit.

Aphton 24. Jul 2009 17:21

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

Zitat von stoxx
ich meinte keine neue Unit, sondern eine ausgelagerte Funktion reicht vollkommen, ...

Wenn wir schon dabei sind

Delphi-Quellcode:
type
  TDoubleArr = Array of Double;

function SolveQuadraticEquation( A, B, C: Double ): TDoubleArr;
var
  d: Double; // diskriminante (das was unter SQRT steht)
begin
//  ax² + bx + c = 0
  if A = 0 then
    Exit;
  B := B / A;
  C := C / A;
//  Diskriminante berechnen
  d := SQR(B/2) - C;
  if d > 0 then
  begin // zwei Lösungen
    SetLength( Result, 2 );
    Result[0] := -B/2 + SQRT( d );
    Result[1] := -B/2 - SQRT( d );
  end else
  if d = 0 then
  begin // eine Lösung
    SetLength( Result, 1 );
    Result[0] := -B/2;
  end;
// else -> keine Reelle Lösung
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 Uhr.
Seite 1 von 9  1 23     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