;docformat = 'rst' ;+ ;Finds the real roots of the quadratic equation a*x^2+b*x+c=0 ; ;This formula is one we all learned in kindergarten, and yet it is surprisingly ;easy to make subtle mistakes which will cause your code to silently give the ;wrong answer. We use this function to encapsulate the quadratic formula instead ;of hard-coding it throughout the higher-level code. ; ;This uses the suggestion (but not code) from Numerical Recipes section 5.6 ;to improve numerical stability. There are actually two forms of the quadratic formula: ; ;x=(-b+-sqrt(b^2-4*a*c))/(2*a) ; ;and ; ;x=(2*c)/(-b+-sqrt(b^2-4*a*c)) ; ;When calculating the discriminant, if either or both of a or c is small, then the discriminant ;will be near b^2, and using the minus sign in either form will result in subtraction of two ;nearly equal numbers, b-sqrt(d) ~= b-sqrt(b^2). As it happens, using the + sign in the /2a ;form produces the same root as the - sign in the 2c/ form, so we can use the + sign from ;both forms to get each root without ever subtracting the two nearly equal numbers. The ;following code uses this idea, but works when b is negative as well. ; ;:Params: ; a: in, required ; Quadratic coefficient. May be an array of any shape. All values must be nonzero, ; zero values will return roots of NaN, even if there is a solution to the resulting ; linear equation. ; b: in, required ; Linear coefficient. May be array, but must be same shape as a ; c: in, required ; Constant coefficient. May be array, but must be same shape as a ;:Keywords: ; d: out, optional ; Discriminant. Same shape as a. Wherever there is a negative value in this ; array, there are no real roots, and root1 and root2 will have NaN in ; the corresponding elements ; root1: out, optional ; Root found by using +/2a form of quadratic formula ; root2: out, optional ; Root found by using 2c/+ form of quadratic formula ;:Categories: ; utility ;- pro eve_quadratic_formula,a,b,c,d=d,root1=root1,root2=root2 s=b*0d +1d w=where(b lt 0,count) if count gt 0 then s[w]=-1d d=b^2-4*a*c q=(b+s*sqrt(d))/2d root1=q/a; root2=c/q; end