Lösungsmenge eines Polynoms 3. Grades bestimmen

#1260557
Lesenswert?

Hi zusammen,

ich versuche im Moment die Lösungen eines Polynoms dritten Grades zu 
berechnen und hänge da an einem kleinen Problem:

Ich verwende den Lösungsweg unter
http://en.wikipedia.org/wiki/Cubic_polynomial
Abschnitt "Alternate method" / "Summary"

Die dort vorgeschlagenen Lösungen verwenden folgenden Koeffizienten (für 
k = [0..2])
x0 <= ζ^0 | ζ^0
x1 <= ζ^1 | ζ^2
x2 <= ζ^2 | ζ^1

In einigen Testfällen erhalte ich damit auch die korrekte Lösungsmenge. 
In anderen Fälle muss ich aber andere Koeffizienten miteinander 
kombinieren:
x0 <= ζ^0 | ζ^1
x1 <= ζ^1 | ζ^0
x2 <= ζ^2 | ζ^2

und

x0 <= ζ^0 | ζ^2
x1 <= ζ^1 | ζ^1
x2 <= ζ^2 | ζ^0

Anders formuliert: für jede Nullstelle müssen zwei kubische Wurzeln 
berechnet werden, die jeweils drei Lösungen liefern. Ich weiß nicht, 
welche beiden Lösungen ich jeweils miteinander kombinieren muss.

Ich weiß leider nicht, ob ich da was falsch mache. Nach welchen 
Kriterien kann ich entscheiden, welche Lösungsmenge die richtige ist?

Ich verwende für alle Koeffizienten (a, b, c, d(, e)) komplexe Zahlen.

Wäre super, wenn mal jemand drüberschauen könnte und hoffe, dass ich das 
Problem ausreichend beschrieben habe - ansonsten nochmal nachfragen.

Danke schonmal!

Kai
#1263631
Lesenswert?

Die Nebenbedingung -uv = p/3 ist darin ja angeblich schon 
berücksichtigt. Im Abschnitt "Alternate method" steht sogar:
"Note that the above methods do apply if p and q are complex. This 
solution avoids the addition of an inverted cubic radical in the 
solution, and also resolves the ambiguity of signs for the square roots 
in the first solution given above."

Der Code für die Berechnung ist relativ komplex - ich schau mal, ob ich 
eine reduzierte Fassung zum Posten fertig machen kann.

Trotzdem danke soweit.
#1265056
Lesenswert?

Ich habe jetzt eine für mich akzeptable Lösung gefunden:

Mit dem Cardano-Algorithmus bekomme ich zumindest immer die richtigen 
Werte. Um das Problem mit der Division zu umgehen berechne ich sowohl 
/u³/ als auch /v³/ . Je nachdem welcher der beiden betragsmäßig größer 
ist entscheide ich, ob ich u aus v oder v aus u berechne.

u_i = -p/3v_i
bzw.
v_i = -p/3u_i

Hier der zugehörige Codeabschnitt für die Entscheidung:
1
Complex[] u;
2
Complex[] v;
3

4
if (uuu.isZero() && vvv.isZero()) {
5
    u = uuu.root(3);
6
    v = vvv.root(3);
7
} else if (uuu.sqr() > vvv.sqr()) {
8
    u = uuu.root(3);
9
    v = new Complex[] {
10
            p.div(u[0]).div(-3),
11
            p.div(u[1]).div(-3),
12
            p.div(u[2]).div(-3)
13
            };
14
} else {
15
    v = vvv.root(3);
16
    u = new Complex[] {
17
            p.div(v[0]).div(-3),
18
            p.div(v[1]).div(-3),
19
            p.div(v[2]).div(-3)
20
            };
21
}

Die Lösungen berechnen sich dann einfach nach
x_i = u_i + v_i - a/3

Vielleicht kann's ja jemand mal brauchen. Ich habe leider keine 
elegantere Lösung gefunden.
#1265221
Lesenswert?

>Mal ne blöde Frage: Wieso hat ne kompexe Zahl 3 Komponenten (in new
>Complex)?
1
new Complex[] { ... }

Das ist eine Lösungsmenge mit drei komplexen Zahlen. Jede komplexe Zahl 
hat natürlich nur zwei Komponente (real und imaginär). Die Erzeugung 
einer einzelnen Zahl sähe wie folgt aus:
1
new Complex(1.2, -3.4)

Hoffe, das trägt zur Klärung bei ;)

@Beobachter
Was ist das?
Persönliche Seite #1266082
Lesenswert?

Johann L. schrieb:
> Mal ne blöde Frage: Wieso hat ne kompexe Zahl 3 Komponenten (in new
> Complex)? Sind die in projektiver Darstellung?
>
> Johann

Hab ich auch gerade gedacht. Aber du bist auf die "neumodische" Syntax 
reingefallen ;) Das ist ne Array-Initialisierung.
Jagut, und der Name Complex ist in dem Zusammenhang nicht optimal. 
Zumindest wenn man nicht genau hinguckt :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren