Viewing contents of file '../idllib/astron/contrib/freudenreich/cuberoot.pro'
function cuberoot,cc
;+
; NAME:
; CUBEROOT
; PURPOSE:
; Real roots of a cubic equation. Complex roots set to -1.0e30.
; Called by HALFAGAUSS.
; CALLING SEQUENCE:
; roots = CUBEROOT(cc)
; INPUT:
; cc = 4 element vector, giving coefficients of cubic polynomial,
; [c0,c1,c2,c3], where one seeks the roots of
; c0 + c1*x + c2*x^2 + c3*x^3
; OUTPUT:
; Function returns a vector of 3 roots. If only one root is real, then
; that becomes the 1st element.
; EXAMPLE:
; Find the roots of the equation
; 3.2 + 4.4*x -0.5*x^2 -x^3 = 0
; IDL> x = cuberoot([3.2,4.4,-0.5,-1])
;
; will return a 3 element vector with the real roots
; -1.9228, 2.1846, -0.7618
; REVISION HISTORY:
; Henry Freudenreich, 1995
;-
on_error,2
unreal=-1.0e30
a1=cc(2)/cc(3)
a2=cc(1)/cc(3)
a3=cc(0)/cc(3)
q=(a1^2-3.*a2)/9. & r=(2.*a1^3-9.*a1*a2+27.*a3)/54.
if r^2 lt q^3 then begin
; 3 real roots.
theta=acos(r/q^1.5)
x1=-2.*sqrt(q)*cos(theta/3.)-a1/3.
x2=-2.*sqrt(q)*cos((theta+6.28319)/3.)-a1/3.
x3=-2.*sqrt(q)*cos((theta-6.28319)/3.)-a1/3.
endif else begin
; Get the one real root:
a=-r/abs(r) * (abs(r)+sqrt(r^2-q^3))^.33333
if a eq 0. then b=0. else b=q/a
x1=(a+b)-a1/3.
x2=unreal
x3=unreal
endelse
roots=[x1,x2,x3]
return,roots
end