Delphi-PRAXiS
Seite 7 von 9   « Erste     567 89      

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)

mkinzler 30. Jan 2010 21:18

Re: [Tutorial] Quadratische Gleichungen vollständig lösen
 
@Wolfgang: Daniel, hat uns nicht darüber informiert, dass du zum Supermoderator ernannt wurdest.

Ja ich glaube du solltest das mit gammatester zusammen abchliessen, da du/ihr sowieso an keinen Anregungen anderen interessiert seid bzw. diese nicht euer Wissensniveau teilen.

Wolfgang Mix 30. Jan 2010 21:23

Re: [Tutorial] Quadratische Gleichungen vollständig lösen
 
:) Man müßte schon Grundlagen in Mathematik und Englisch beherrschen

alzaimar 30. Jan 2010 21:26

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

Zitat von gammatester
Und ich verstehe Deine Ignoranz nicht: Statt zu fragen, was 'Re' und 'Im' bedeutet,

Wieso soll ich fragen, der Code soll es mir beantworten. Ich weiss ja nicht, für wen du so Code schreibst, aber ich steh doch nicht auf und lauf in der Abteilung herum, um den Knilch zu finden, der seine Variablen 're' und 'im' oder 'frzl' und 'mpft' nennnt? Gut, hier mag das noch aus dem Kontext hervorgehen, aber für ein T-u-t-o-r-i-a-l ist das etwas kryptisch, findest du nicht?

Zitat:

Das sind mathematische Bezeichnungen, die eigentlich schon auf dem Gymnasium bekannt sein sollten, spätestes im Studium, das auch nur ein wenig mit Mathe zu tun hat.
Hoho gammatester, halt mal die Luft an, ich zieh auch nicht über deine Herkunft oder deinen Codestil her.
Zitat:

Zitat von gammatester
Re = Realteil, Im = Imaginärteil.

Und wieso *heißen* die Variablen dann nicht so?

Wenn das die deutschen Abkürzungen sind, was hat das dann in einem Code zu suchen, der vorgibt, englische Bezeichner zu verwenden?

Übrigens gammatester,
Zitat:

Und ich verstehe Deine Ignoranz nicht: ...
Hatten wir uns einander so vorgestellt?

Als Friedensangebot ein Vorschlag, der hoffentlich alle Kritikpunkte eliminiert, und die Erfahrungen in einen lesbaren und kommentarlosen Code zu gießt, der englische Bezeichner verwendet. Ich find sie auch schöner, ich gebs ja zu.

Über zu kurze, zu lange und korrekte Bezeichner lässt sich -wie immer- streiten. So weiss ich z.B. nicht, ob die Teilösung wirklich von Vieta ist (stand teilweise so im W.Mix-Code) und ob das mit den Diskriminanten immer stimmt.

Delphi-Quellcode:
unit QuadraticEquationSolver;

interface
uses
  SysUtils;

type
  EInvalidAccessException = class(Exception);
  TQuadraticEquationSolutionType = (stUndefined, stReal, stSingle, stComplex);
  TQuadraticEquationSolver = class
  private
    FSolutionType: TQuadraticEquationSolutionType;
    FSolution2: Double;
    FDiscriminant: Double;
    FSolution1: Double;
    FRealPart: Double;
    FComplexPart: Double;
    procedure SetSingleSolution(solution: Double);
    procedure SetRealSolutions(solution1, solution2: Double);
    procedure SetComplexSolution(realPart, complexPart: Double);
    procedure SolveUsingVietaFormula(p, q: Double);
    procedure SolveUsingTransformedFormula(p, q: Double);
    function IsAPositiveAndVeryLargeNumber(n: Double): Boolean;

    function GetSolution1: Double;
    function GetSolution2: Double;
    function GetRealPartOfSolution: Double;
    function GetComplexPartOfSolution: Double;
  public
    constructor Create;
    procedure Solve(a, b, c: Double);
    property SolutionType: TQuadraticEquationSolutionType read FSolutionType;
    property Solution1: Double read GetSolution1;
    property Solution2: Double read GetSolution2;
    property RealPartOfComplexSolition: Double read GetRealPartOfSolution;
    property ComplexPartOfComplexsolution: Double read GetComplexPartOfSolution;
  end;

implementation
uses Math;
{ TQuadraticEquationSolver }

{$Region 'Solving and Mathematics'}
procedure TQuadraticEquationSolver.Solve(a, b, c: Double);
var
  p,q : Double;

begin
  Assert (Not IsZero(a), 'a must be nonzero');
  p := b / a;
  q := c / a;
  if IsAPositiveAndVeryLargeNumber(p) then
    SolveUsingTransformedFormula(p, q)
  else begin
    FDiscriminant := sqr(p / 2) - q;
    case Sign(FDiscriminant) of
      +1: SolveUsingVietaFormula(p, q);
      0 : SetSingleSolution(-p / 2);
      -1: SetComplexSolution(-p / 2, Sqrt(abs(FDiscriminant)));
    end;
  end
end;

procedure TQuadraticEquationSolver.SolveUsingVietaFormula(p, q: Double);
var
  solution: Double;

begin
  solution := -p / 2 - sign(p) * sqrt(FDiscriminant);
  SetRealSolutions(solution, q / solution);
end;

procedure TQuadraticEquationSolver.SolveUsingTransformedFormula(p, q: Double);
var
  root: Double;

begin
  FDiscriminant := (1 / 4 - (q / p) / p);
  root := sqrt(FDiscriminant);
  SetRealSolutions(abs(p) - root, Abs(p) + root);
end;

function TQuadraticEquationSolver.IsAPositiveAndVeryLargeNumber(n: Double): Boolean;
begin
  Result := (abs(n) > sqrt(Math.MaxDouble));
end;

{$EndRegion}

{$Region 'Routines for setting the individual solutions'}
procedure TQuadraticEquationSolver.SetComplexSolution(realPart, complexPart: Double);
begin
  FSolutionType := stComplex;
  FRealPart := realPart;
  FComplexPart := complexPart;
end;

procedure TQuadraticEquationSolver.SetRealSolutions(solution1, solution2: Double);
begin
  FSolutionType := stReal;
  FSolution1 := solution1;
  FSolution2 := solution2;
end;

procedure TQuadraticEquationSolver.SetSingleSolution(solution: Double);
begin
  FSolutionType := stSingle;
  FSolution1 := solution;
  FSolution2 := solution;
end;
{$EndRegion}

{$Region 'Property access'}
function TQuadraticEquationSolver.GetSolution1: Double;
begin
  if SolutionType = stComplex then
    raise EInvalidAccessException.Create('Access only if solution is not complex');
  Result := FSolution1;
end;

function TQuadraticEquationSolver.GetSolution2: Double;
begin
  if SolutionType = stComplex then
    raise EInvalidAccessException.Create('Access only if solution is not complex');
  Result := FSolution2;
end;

function TQuadraticEquationSolver.GetRealPartOfSolution: Double;
begin
  if SolutionType <> stComplex then
    raise EInvalidAccessException.Create('Access only if solution is complex');
  Result := FRealPart;
end;

constructor TQuadraticEquationSolver.Create;
begin
  FSolutionType := stUndefined;
end;

function TQuadraticEquationSolver.GetComplexPartOfSolution: Double;
begin
  result := FComplexPart;
end;
{$EndRegion}
end.
Die Essenz ist die 'Solve'-Methode, die -denke ich- die Lösungsansätze von W.Mix und GT dokumentiert. Der Rest ist Mumpfe.
Das Dilemma, das Lösung sowohl reale als auch komplexe Lösungen liefert, habe ich habe ich durch unterschiedliche Properties versucht, zu lösen.

Reelle Lösungen (eine oder zwei) stehen in den Eigenschaften 'Solution1' und 'Solution2', die komplexen in 'RealPartOfComplexSolution' und 'ComplexPartOfComplexsolution'. Etwas lang, finde ich.

Aber so fragt keiner nach. :zwinker: Bei 'Solution1' und 'Solution2' vielleicht schon... :gruebel:

[edit]Seit wann werden Rechtschreibfehler vom DCC nicht erkannt? [/edit]
[edit]Fehler beim Refaktorisieren dank gammatester beseitigt. [/edit]

gammatester 30. Jan 2010 22:37

Re: [Tutorial] Quadratische Gleichungen vollständig lösen
 
Code:
[Error] QuadraticEquationSolver.pas(43): Invalid compiler directive: 'Region'
[Error] QuadraticEquationSolver.pas(89): Invalid compiler directive: 'EndRegion'
[Error] QuadraticEquationSolver.pas(91): Invalid compiler directive: 'Region'
[Error] QuadraticEquationSolver.pas(112): Invalid compiler directive: 'EndRegion'
[Error] QuadraticEquationSolver.pas(114): Invalid compiler directive: 'Region'
[Error] QuadraticEquationSolver.pas(145): Invalid compiler directive: 'EndRegion'
[Fatal Error] Unit1.pas(23): Could not compile used unit 'QuadraticEquationSolver.pas'
Wenn man das beseitigt hat, gibt's das nächste Problem. Wieviele Beispiele hast Du mit Deinem Code getestet? Mit a=1, b=-3, c=2. Gibt's erstmal 'nen Crash "a must be non-zero"! Da der Code ja selbst erklärend ist, fragt sich der geneigte User wieso ist a=1 zero?

gammatester 30. Jan 2010 22:52

Re: [Tutorial] Quadratische Gleichungen vollständig lösen
 
Ein hoch auf "lesbaren und kommentarlosen Code"! Wenn man den schlimmen Bug aus #64 beseitigt hat, kommt der "lesbaren und kommentarlosen Code" doch tatsächlich zu dem Ergebnis, das x^2 - 3x + 2 = 0 die Lösungen hat x1=3, x2=0.666666666666667!

Na denn gute Nacht!

Gammatester

Hinweis: die Lösungen sind x1=1 und x2=2.

stoxx 30. Jan 2010 23:15

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

Zitat von Wolfgang Mix
Leider habe ich kein Mathlab


dafür nehme man qtoctave


http://qtoctave.wordpress.com/download/


für kleine Aufgaben im Prinzip genau dasselbe wie matlab

alzaimar 31. Jan 2010 03:59

Re: [Tutorial] Quadratische Gleichungen vollständig lösen
 
gammatester, nu beruhig dich doch mal. Ich habe dich doch mit keiner Silbe angegriffen oder beleidigt oder sonstwas. Mir sind halt zwei blöde Fehler unterlaufen, die ich inzwischen im Code behoben habe. Danke übrigens für deine Hinweise. Über die Art und Weise kann man zwar geteilter Meinung sein, aber jeder hat eben sein eigenes Niveau.

Chemiker 31. Jan 2010 08:35

Re: [Tutorial] Quadratische Gleichungen vollständig lösen
 
Hallo,

erst mal finde ich nicht schlecht wie ihr das Problem aufbereitet.

Nur in einem Punkt muss ich alzaimar recht geben, wenn man für einem deutschen Forum ein Tut. schreibt sollten auch die Kommentare und Bezeichner deutsch sein, oder man schreibt alles auf Englisch. Der Norweger oder Chinese wird sich schon zu helfen wissen, wenn er in einem deutschen Forum unterwegs ist.

Bis bald Chemiker

Daniel 31. Jan 2010 08:52

Re: [Tutorial] Quadratische Gleichungen vollständig lösen
 
:roll:

Leute ... einige von Euch mögen brillante Mathematiker sein, andere brillante Codierer. Hier wird gekeilt um Begriffe und nun sogar um Compiler-Direktiven wie $REGION, die für das eigentliche Problem völlig irrelevant sind.

Es wäre schön, wenn Ihr die Verhältnismäßigkeiten wiederherstellen könntet und so die Inhalte, die in diesem Thema bereits versammelt sind, zu einer ganzheitlichen Lösung zusammenführen könntet. Denn von allen beteiligten Fachrichtungen ist das Problem ja nun schon gelöst.

Wolfgang Mix 31. Jan 2010 10:07

Re: [Tutorial] Quadratische Gleichungen vollständig lösen
 
Ich bin weder ein brillianter Mathematiker noch ein perfekter Codierer,
habe halt nur Spaß auf Algorithmen. Wenn man sich draußen ein bißchen
abgekühlt hat und einen warmen Tee genießt, kommt man vielleicht zu
folgender Erkenntnis:
Das Problem dieses Themas ist, daß wir, in welcher Programmiersprache
auch immer, nur einen kleinen begrenzten Zahlenbereich aus der Menge
der reellen Zahlen haben, selbst beim Typ Extended und bei Berechnungen
Rundungsfehler entstehen, der begrenzte Zahlenbereich unter/überschritten
werden kann und Fehler durch Auslöschung entstehen können.
Die Ausgangsformeln sind perfekt und welweit 1000-fach bewiesen.
Ob man nun die eine oder andere Formel benutzt, ist völlig egal.
Es gibt aber einige Mögtlichkeiten Fehler zu vermeiden, wenn man
mit den wenigen Maschinenzahlen rechnet. Nicht mehr und nicht weniger
soll mein Beitrag zeigen. Wenn man sich ein wenig bei den Unis
umschaut, wird man auch nicht viel mehr dazu finden.
Ich denke, vom Material her gesehen, haben wir jetzt genug, um alles
nüchtern zusammen zu fassen.

Gruß an alle

Wolfgang


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 Uhr.
Seite 7 von 9   « Erste     567 89      

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