Entwickler-Ecke

Sonstiges (Delphi) - Programmieren von Quadratischen Gleichungen


jule1988 - Do 23.11.06 11:55
Titel: Programmieren von Quadratischen Gleichungen
ich hab noch ein großes Problem entdeckt.
Ich soll ein programm entwickeln, dass über Quadratische GLeichungen aus den übergegeben Parametern p und q und der Gleichung x²+px+q die Anzahl der Lösungen ermittelt und diese werte zurückgibt
- struktogramm zu Lösung des Problems
- programmieren des "Rechne" und "Abbrechen" buttons

Danke!!!!!!!!!!
(bin echt hilflos!!)


ZeitGeist87 - Do 23.11.06 12:14

Nullstellenberechnung?

Was hast du denn schon?
Und was kannst du..wo hängst du?


jule1988 - Do 23.11.06 12:33

ich hänge komplett.
Mein Problem ist, dass ich lange krank war. eigentlich liebe ich info, aber ich hab bei DElphi über 3/4 der stunden verpasst.
Ich bekomms also garnicht hin.
Ich weiß es ist viel verlangt hier lösungen für meine Aufgaben zu bekommen.
Ich bemühe mich ja, aber mir fehlen die voraussetzungen und innerhalb von einer woche konnte ich das nicht schaffen,
morgen ist die KLausur und ich hab jetz vor den Aufgaben Kapituliert und Brauche echt hilfe


ZeitGeist87 - Do 23.11.06 12:45

zu viel verlangt is nix
und bis morgen wird schwierig würd ich sagen..aber ich will dir keine falschen hoffnungen machen...
versuchen wirs einfach mal...

weißt du was eine Funktion ist?
Rückgabeparameter einer Funktion?
wie du Parameter übergibst?
Variablen?


mister_x - Do 23.11.06 13:32
Titel: Re: Programmieren von Quadratischen Gleichungen
user profile iconjule1988 hat folgendes geschrieben:
ich hab noch ein großes Problem entdeckt.
Ich soll ein programm entwickeln, dass über Quadratische GLeichungen aus den übergegeben Parametern p und q und der Gleichung x²+px+q die Anzahl der Lösungen ermittelt und diese werte zurückgibt
- struktogramm zu Lösung des Problems
- programmieren des "Rechne" und "Abbrechen" buttons

Danke!!!!!!!!!!
(bin echt hilflos!!)


scho ma von der "Mitternachtsformel" gehört?? :shock:
X1/2=-p/2 + - sqrt((p/2)²-q).......
also

Delphi-Quelltext
1:
2:
X1:=-p/2 + sqrt(p*p/4 - q);//erste Lösung
X2:=-p/2 - sqrt(p*p/4 - q);//zweite Lösung


MIster_X


DaKirsche - Do 23.11.06 13:36

Moin...


Also du willst bis morgen Delphi lernen?????aha....^^

Naja...zumindest bei deinem PQ-Formel Problem kann ich dir helfen.

Wie die P-Q-Formel aussieht mussich dir bestimmt nicht erklären....

Schaffst du es denn die Werte für P und Q einzulesen?

Die P-Q-Formel in Delphi:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
Procedure TForm1.PQFormelBerechnenClick(Sender: TObject);
var x1,x2,Term1,Term2:Real;
//var P,Q:Real;
Loesungen:Integer;
begin
//Zunächst musst du P und Q einlesen
Term1:= -p/2//1. Teil der P-Q-Formel
Term2:= ((P*P)/4)-q; //2.Teil der P-Q-Formel
//Testen, ob keine Lösung:
If (Term2<0then Loesungen:=0 else
if (Term2=0then Loesungen:=1 else
Loesungen:=2//Prüfen, ob Wurzelinhalt negativ,0 oder größer ist

If Loesungen=2 then begin //wenn 2 Lösungen
x1:=Term1+sqrt(Term2); //X1 berechnen
x2:=Term1-sqrt(Term2); //X2 berechnen
end;
//Und hier halt dann die Ausgabe von den Lösungen und Ergebnissen
end;


Also ich denke so irgendwie würde ich es lösen...

//Edit: Quelltext erweitert...danke mister_x^^


mister_x - Do 23.11.06 13:44

user profile iconDaKirsche hat folgendes geschrieben:
Moin...


Also du willst bis morgen Delphi lernen?????aha....^^

Naja...zumindest bei deinem PQ-Formel Problem kann ich dir helfen.

Wie die P-Q-Formel aussieht mussich dir bestimmt nicht erklären....

Schaffst du es denn die Werte für P und Q einzulesen?

Die P-Q-Formel in Delphi:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Procedure TForm1.PQFormelBerechnenClick(Sender: TObject);
var x1,x2,Term1,Term2:Real;
//var P,Q:Real;
Loesungen:=0;
begin
//Zunächst musst du P und Q einlesen
Term1:= -p/2//1. Teil der P-Q-Formel
Term2:= ((P*P)/4)-q; //2.Teil der P-Q-Formel
//Testen, ob keine Lösung:
If (Term2<0then Loesungen:=0 else Loesungen:=2//Prüfen, ob Wurzelinhalt negativ
//Wie man jetzt prüft, ob eine oder 2 Lösungen ist mir entfallen...Schule ist schon etwas her :)
If Loesungen=2 then begin //wenn 2 Lösungen
x1:=Term1+sqrt(Term2); //X1 berechnen
x2:=Term1-sqrt(Term2); //X2 berechnen
end;
//Und hier halt dann die Ausgabe von den Lösungen und Ergebnissen
end;


Also ich denke so irgendwie würde ich es lösen...


na wenn unter der wurzel 0 steht gibt es nur eine lösung :lol:


jule1988 - Do 23.11.06 15:36

Danke leute!!!!
Ohne euch wär ich aufgechmissen


F34r0fTh3D4rk - Do 23.11.06 15:39

es gibt in einer quadratischen gleichung doch immer nur zwei nullstellen ? wieso willst du die anzahl der lösung bestimmen, es gibt entweder keine nullstelle (negative zahl unter der wurzel), es gibt eine (sonderfall von 2), oder zwei.

mfg


jule1988 - Do 23.11.06 15:49

sorry, wenn ich mich zu dumm stellen, aber
"//Und hier halt dann die Ausgabe von den Lösungen und Ergebnissen
end;"
was genau muss ich da machen...
(bitte haltet mich nich für bescheuert)


Xion - Do 23.11.06 15:56

am einfachsten mit ShowMessage("Die Werte");


DaKirsche - Do 23.11.06 16:22

da kommt dann z.B. folgendes hin:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
//Ausgabe in Editfeldern:
Edit1.Text:=FloatToStr(x1);
Edit2.Text:=FloatToStr(x2);
Edit3.Text:=IntToStr(Loesungen);

//Ausgabe als Showmessage:
Showmessage('Anzahl der Lösungen: ' + IntToStr(Loesungen) + ' X1: ' + FloatToStr(X1) + ' X2: ' + FloatToStr(X2));

//Die Ausgabe kannst du in unzählbar vielen Formen programmieren....es wird hierfür zu viel


Dragonclaw - Do 23.11.06 16:24


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
If (Term2<0then Loesungen:=0 else Loesungen:=2//Prüfen, ob Wurzelinhalt negativ
//Wie man jetzt prüft, ob eine oder 2 Lösungen ist mir entfallen...Schule ist schon etwas her :)
If Loesungen=2 then begin //wenn 2 Lösungen
x1:=Term1+sqrt(Term2); //X1 berechnen
x2:=Term1-sqrt(Term2); //X2 berechnen
end;
//Und hier halt dann die Ausgabe von den Lösungen und Ergebnissen
end;


würde ich in

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
if (Term2 < 0 ) then Loesungen := 0;
if (Term2 = 0 ) then Loesungen := 1;
if (Term2 > 0 ) then Loesungen := 2;

if Lösung = 1 then 
 begin
  x1 := Term1;
  x2 := Term1; // x1 und x2 sind gleich also gibt es nur eine lösung
 end;

if Lösung = 0 then
 begin
  x1 := '';
  x2 := ''//Wenn er dir nach her ein leeres Message Feld anzeigt gibts keine Lösung
 end;

If Loesungen = 2 then 
 begin 
  x1:=Term1+sqrt(Term2); 
  x2:=Term1-sqrt(Term2); 
 end;


DaKirsche - Do 23.11.06 16:33

Warum willst du denn dem Programm mehr arbeit aufdrücken, als nötig?
Du lässt ihn ja jede Schleife durchlaufen, selbst wenn dies nicht mehr nötig wäre....
Bei dir werden jetzt ja immer alle 6 IF-Schleifen druchlaufen....selbst wenn z.B. er nach der 1. Schleife eigentlich schon abbrechen könnte....;)


Dragonclaw - Do 23.11.06 16:44

Naja, ich wollte halt der er versteht was da passiert

Geht natürlich kürzer


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
var p,q :real;
x1,x2: string;
begin
if (((P*P)/4)-q < 0 ) then
ShowMessage('Das Problem hat keine reale Lösung!');
else
ShowMessage('X1:' + floattostr(-p/2+sqrt(((P*P)/4)-q)) + 'X2:' +floattostr(-p/2-sqrt(((P*P)/4)-q)));
end;


F34r0fTh3D4rk - Do 23.11.06 16:56

wobei die variablen x1 und x2 überflüssig sind ;) wenn es ein ergebnis gibt sind eben x1 und x2 identisch, falls du das noch extra handlen willst, musst du das eben noch einmal gesonders abfragen ;)

mfg


mister_x - Do 23.11.06 16:59

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
es gibt in einer quadratischen gleichung doch immer nur zwei nullstellen ? wieso willst du die anzahl der lösung bestimmen, es gibt entweder keine nullstelle (negative zahl unter der wurzel), es gibt eine (sonderfall von 2), oder zwei.

mfg


warum nich..........


F34r0fTh3D4rk - Do 23.11.06 17:02

weils im grunde immer 2 gibt oder keine, bei polynomen n-ten grades wäre das wieder was anderes.


DaKirsche - Do 23.11.06 17:07

Das will er, da es bestimmt Bestandteil der Aufgabe ist.
Außerdem mag es das Programm nicht, wenn du ihn einfach rechnen lässt....dann die Wurzel aus einer Negativen und schon haste ne Fehlermeldung


Also musst du irgendwo abfragen, ob der Inhalt der Wurzel negativ ist --> Schon prüfst du die Anzahl der Lösungen^^


Dragonclaw - Do 23.11.06 17:08

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
weils im grunde immer 2 gibt oder keine, bei polynomen n-ten grades wäre das wieder was anderes.


Das ist falsch. Es gibt auch Fälle wo eine Parabel nur eine Nullstelle hat, nämlich wenn der Sattelpunkt, genau auf der X-Achse liegt z. B. Hat f(x) = x^2 nur genau eine Nullstelle, nämlich 0. Das selbe gilt für f(x) = (x+1)^2, da ist die nullstelle bei -1.


F34r0fTh3D4rk - Do 23.11.06 17:11

was ist, wenn ich dir sage, dass das zwei nullstellen sind, die nur die gleiche koordinate haben ? kannst du mir das gegenteil beweisen ?


DaKirsche - Do 23.11.06 17:23

Da hat Fear recht...eine Quadratische Gleichung hat keine oder 2 Lösungen, wenn beide Lösungen den selben Wert hat, so hat die Gleichung trotzdem 2 Lösungen desselben wertes.


mister_x - Do 23.11.06 17:37

user profile iconDragonclaw hat folgendes geschrieben:
user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
weils im grunde immer 2 gibt oder keine, bei polynomen n-ten grades wäre das wieder was anderes.


Das ist falsch. Es gibt auch Fälle wo eine Parabel nur eine Nullstelle hat, nämlich wenn der Sattelpunkt, genau auf der X-Achse liegt z. B. Hat f(x) = x^2 nur genau eine Nullstelle, nämlich 0. Das selbe gilt für f(x) = (x+1)^2, da ist die nullstelle bei -1.

:lol:
es gibt keinen sattel punkt bei ner parabel.......sattelpunkte gibts nur bei X^n n muss ungrad sein
da gibts nurn scheitel........


F34r0fTh3D4rk - Do 23.11.06 17:40

er meint den extrempunkt ;) das ist auch der einzige fall bei dem x1 = x2 :P die pq formel liefter da sogar zwei werte und zwar zwei gleiche ;)

mfg


Martok - Do 23.11.06 17:41

Da hat Fear nicht recht (Sorry, muss sein ;) )

Nullstellen sind definiert als x mit f(x)=0
Damit ist wenn es genau eine Nullstelle gibt (im Scheitelpunkt) eben nur eine Nst da. Sonst müsstest du sagen, x1=x2 und gleichzeitig x1!=x2. Beweis mir das mal ;)

Denn sonst könnte ich genausogut behaupten, sie hätte dann 10000 Nullstellen, die zufälligerweise alle gleich sind.
Natürlich kommen aus der P-Q-Formel 2 Werte raus, aber auch nur, wenn man sich die Diskriminante vorher nicht anguckt.

Aber mein ihr nicht, für eine Info-Arbeit geht das zu weit? Bei einer Mathe-Aufgabe würde ich sowas ja noch verstehen, aber hier....


F34r0fTh3D4rk - Do 23.11.06 17:47

man hätte es ja mal versuchen können, nach dem schema, ich suche mir ne seite und versuche so lange argumente dafür zu finden, bis mir alle glauben ;)


mister_x - Do 23.11.06 18:14

un wie siehts bei ner X^3 Funktion aus......
ich hab mir da en paar gedanken gemacht komm aber irgendwie nich weiter...
also man hat ja dann so eine gleichung
a*X^3+b*X^2+c*X+d=0
=>X^3+b/a*X^2+c/a*X+d/a=0
un
(X-N1)(X-N2)(X-N3)=0//N1,N2,N3 sind die nullstellen.......
=>X^3+b/a*X^2+c/a*X+d/a=(X-N1)(X-N2)(X-N3)
=X^3+b/a*X^2+c/a*X+d/a=X^3+X^2*(-N1-N2-N3)+X*(N1N2+N1N3+N2N3)+(-N1N2N3)

=>
-(N1+N2+N3)=b/a
N1N2+N1N3+N2N3=c/a
-N1N2N3=d/a

un jetzt hat ma ja eigentlich drei gleichungen un 3 variablen
da muss es doch ne Lösung geben.........
habt ihr ne idee......


Dragonclaw - Do 23.11.06 18:29

Also, solange d=0 ist ist das einfach

ax^3+bx^2+cx //x ausklammern
x(ax^2+bx+c) //so eine Nullstelle ist bei x=0, bleiben noch (max.) 2
ax^2+bx+c // dann durch a teilen
x^2+(b/a)x+(c/a)

Dann kannste das einfach wieder in das Programm einfügen und fertig.

Ich überleg mir gerade ne Methode mit d <> 0.


Saubäär - Do 23.11.06 18:31

Wie wärs mit dem Gaußsches Eliminationsverfahren ?

Gruß
Bäär


mister_x - Do 23.11.06 18:35

user profile iconDragonclaw hat folgendes geschrieben:
Also, solange d=0 ist ist das einfach

ax^3+bx^2+cx //x ausklammern
x(ax^2+bx+c) //so eine Nullstelle ist bei x=0, bleiben noch (max.) 2
ax^2+bx+c // dann durch a teilen
x^2+(b/a)x+(c/a)

Dann kannste das einfach wieder in das Programm einfügen und fertig.

Ich überleg mir gerade ne Methode mit d <> 0.
8)
des hab ich auch noch hingekriegt......
aber wenns d nich 0 is dann wirds eben en bissle schwieriger................ :)


mister_x - Do 23.11.06 18:35

user profile iconSaubäär hat folgendes geschrieben:
Wie wärs mit dem Gaußsches Eliminationsverfahren ?

Gruß
Bäär


wasn das???


F34r0fTh3D4rk - Do 23.11.06 18:36

entweder http://de.wikipedia.org/wiki/Kubische_Gleichung oder raten + polynomdivision


mister_x - Do 23.11.06 18:41

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
entweder http://de.wikipedia.org/wiki/Kubische_Gleichung oder raten + polynomdivision

is ja cool der anfang is ja genau des was ich gemacht hab....... :D

aber was is des fürn Lösungansatz den versteh ich nich.....


wulfskin - Do 23.11.06 18:46

user profile iconSaubäär hat folgendes geschrieben:
Wie wärs mit dem Gaußsches Eliminationsverfahren ?

Gruß
Bäär
Einfach mal irgend ein Begriff in den Raum werfen, der nur indirekt mit dem Thema zu tun hat. :evil: Damit kann man lineare Gleichungssysteme (also mehrere Gleichungen) lösen und nicht eine Gleichung dritten Grades.

Aber ich glaube für die Frage sind die Antworten bis hierher völlig ausreichend!


mister_x - Do 23.11.06 18:58

aber für meine frage nicht.........


wulfskin - Do 23.11.06 19:51

user profile iconmister_x hat folgendes geschrieben:
aber für meine frage nicht.........
Einfach mal lesen (und verstehen !!!) was FearOfTheDark drei Beiträge weiter oben schreibt...


mister_x - Do 23.11.06 20:14

user profile iconwulfskin hat folgendes geschrieben:
user profile iconmister_x hat folgendes geschrieben:
aber für meine frage nicht.........
Einfach mal lesen (und verstehen !!!) was FearOfTheDark drei Beiträge weiter oben schreibt...


=)
na dann erklär mir ma was auf de.wikipedia.org/wiki/Kubische_Gleichung steht...............


Dragonclaw - Do 23.11.06 20:35

Lösen der kubischen Gleichung 9x³ + 3x² + 9x + 5 = 0
————————————————————————————————————————————————————————

Die kubische Gleichung wird zunächst durch Division mit 9 auf die Normalform
x³ + rx² + sx + t = 0 gebracht.

x³ + 0,3333333333333333x² + x + 0,5555555555555556 = 0

Durch die Substitution x = y - r/3 wird die Gleichung in eine reduzierte Form
y³ + py + q = 0 gebracht, in der kein quadratisches Glied mehr auftritt.

(y - 0,1111111111111111)³ + 0,3333333333333333(y - 0,1111111111111111)² + (y - 0,1111111111111111) + 0,5555555555555556 = 0

Die neuen Koeffizienten können bequemer auch direkt berechnet werden:

p = s - r²/3 = 0,962962962962963
q = 2r³/27 - rs/3 + t = 0,44718792866941015

y³ + 0,962962962962963y + 0,44718792866941015 = 0

Aus der Gleichung liest man also ab:

p = 0,962962962962963 q = 0,44718792866941015

Nun muß der Wert R = (q/2)²+(p/3)³ betrachtet werden.

Ist R > 0, so hat die kubische Gleichung eine reelle und zwei komplexe Lösungen,
ist R = 0, hat sie drei reelle Lösungen, von denen zwei zusammenfallen,
und im Falle R < 0 drei verschiedene reelle Lösungen.

Für die ersten beiden Fälle verwendet man die Lösungsformel von Cardano/Tartaglia,
im dritten Fall, dem sogenannten "casus irreducibilis", löst man mithilfe
trigonometrischer Funktionen.

Im Falle dieser Gleichung ist R = 0,08306660570035057.

Da R nicht negativ ist, kann die Gleichung mit der Cardanischen Formel gelöst werden:


T = sqr((q/2)²+(p/3)³) = sqr(R) = 0,28821277851675936

u = kubikwurzel(-q/2 + T) = 0,40128506332213787

v = kubikwurzel(-q/2 - T) = -0,7998993325682543

y = u + v = -0,3986142692461164
1
y = -(u + v)/2 - ((u - v)/2)*sqr(3)·î = 0,1993071346230582 - 1,0402562014705437·î
2
y = -(u + v)/2 + ((u - v)/2)*sqr(3)·î = 0,1993071346230582 + 1,0402562014705437·î
3

Die Substitution x = y - r/3 wird durch Subtraktion von r/3 rückgängig gemacht.
r=0,3333333333333333 ist der quadratische Koeffizient der kubischen Gleichung.
Damit ergeben sich, der Größe nach geordnet, diese Lösungen:

x = -0,5097253803572276
1
x = 0,08819602351194719 - 1,0402562014705439·î
2
x = 0,08819602351194719 + 1,0402562014705439·î
3


x2 und x3 sind NICHT Real..., daher hat die Funktion nur EINE Nullstelle