Eine einfache Verwendung von De Moivre's formula reicht aus, um zu zeigen, dass die Kubikwurzel eines Werts unabhängig vom Vorzeichen eine mehrwertige Funktion ist. Das heißt, für jeden Eingabewert gibt es drei Lösungen. Die meisten der bisher vorgestellten Lösungen geben nur das Grundprinzip zurück. Eine Lösung, die alle gültigen Wurzeln zurückgibt und explizit auf nicht komplexe Sonderfälle testet, ist unten dargestellt.
import numpy
import math
def cuberoot(z):
z = complex(z)
x = z.real
y = z.imag
mag = abs(z)
arg = math.atan2(y,x)
return [ mag**(1./3) * numpy.exp(1j*(arg+2*n*math.pi)/3) for n in range(1,4) ]
Edit: Wie gewünscht, in Fällen, in denen es nicht angebracht ist, die Abhängigkeit von numpy zu haben, der folgende Code macht das Gleiche.
def cuberoot(z):
z = complex(z)
x = z.real
y = z.imag
mag = abs(z)
arg = math.atan2(y,x)
resMag = mag**(1./3)
resArg = [ (arg+2*math.pi*n)/3. for n in range(1,4) ]
return [ resMag*(math.cos(a) + math.sin(a)*1j) for a in resArg ]
Als Randnotiz: 'float (1)' ist praktischer als "1." geschrieben. Oder Sie können 'from __future__ import division' verwenden und aufhören, sich Gedanken über die Ganzzahldivision zu machen (1/3 gibt 0.3333 zurück ...). – EOL
Wenn Sie nur die echte Kubikwurzel möchten und die komplexen Kubikwurzeln ignorieren möchten, sagen Sie dies bitte in Ihrer Frage. –
Beachten Sie, dass es keine Gleitkommazahl gibt, die 1/3 genau darstellt. Daher können Sie mathematische Funktionen wie 'math.pow()' nicht verwenden, um die Kubikwurzel anzugeben. –