![]() |
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. |
Re: [Tutorial] Quadratische Gleichungen vollständig lösen
:) Man müßte schon Grundlagen in Mathematik und Englisch beherrschen
|
Re: Quadratische Gleichungen vollständig lösen
Zitat:
Zitat:
Zitat:
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:
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:
Die Essenz ist die 'Solve'-Methode, die -denke ich- die Lösungsansätze von W.Mix und GT dokumentiert. Der Rest ist Mumpfe.
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. 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] |
Re: [Tutorial] Quadratische Gleichungen vollständig lösen
Code:
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?
[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' |
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. |
Re: Quadratische Gleichungen vollständig lösen
Zitat:
dafür nehme man qtoctave ![]() für kleine Aufgaben im Prinzip genau dasselbe wie matlab |
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.
|
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 |
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. |
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. |
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