AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi [Tutorial] Quadratische Gleichungen vollständig lösen
Thema durchsuchen
Ansicht
Themen-Optionen

[Tutorial] Quadratische Gleichungen vollständig lösen

Ein Thema von Wolfgang Mix · begonnen am 24. Jul 2009 · letzter Beitrag vom 10. Apr 2010
Antwort Antwort
Seite 7 von 9   « Erste     567 89      
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#61

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

  Alt 30. Jan 2010, 22:18
@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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#62

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

  Alt 30. Jan 2010, 22:23
Man müßte schon Grundlagen in Mathematik und Englisch beherrschen
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#63

Re: Quadratische Gleichungen vollständig lösen

  Alt 30. Jan 2010, 22:26
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 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. Bei 'Solution1' und 'Solution2' vielleicht schon...

[edit]Seit wann werden Rechtschreibfehler vom DCC nicht erkannt? [/edit]
[edit]Fehler beim Refaktorisieren dank gammatester beseitigt. [/edit]
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#64

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

  Alt 30. Jan 2010, 23:37
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?
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#65

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

  Alt 30. Jan 2010, 23:52
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.
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#66

Re: Quadratische Gleichungen vollständig lösen

  Alt 31. Jan 2010, 00:15
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
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#67

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

  Alt 31. Jan 2010, 04:59
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#68

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

  Alt 31. Jan 2010, 09:35
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#69

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

  Alt 31. Jan 2010, 09:52


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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#70

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

  Alt 31. Jan 2010, 11:07
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
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 9   « Erste     567 89      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 Uhr.
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