From 8249d26267962fd301c3266241177307dfa11d8e Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Fri, 21 Feb 2014 21:45:54 +0100 Subject: [PATCH] RootFinding: expose cubic in facade class --- src/Numerics/FindRoots.cs | 9 +++++++++ src/Numerics/RootFinding/Cubic.cs | 14 ++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Numerics/FindRoots.cs b/src/Numerics/FindRoots.cs index d3817640..5860c987 100644 --- a/src/Numerics/FindRoots.cs +++ b/src/Numerics/FindRoots.cs @@ -106,6 +106,15 @@ namespace MathNet.Numerics return new Tuple(q/a, c/q); } + /// + /// Find all three complex roots of the cubic equation d + c*x + b*x^2 + a*x^3 = 0. + /// Note the special coefficient order ascending by exponent (consistent with polynomials). + /// + public static Tuple Cubic(double d, double c, double b, double a) + { + return RootFinding.Cubic.Roots(b/a, c/a, d/a); + } + /// /// Find all roots of the Chebychev polynomial of the first kind. /// diff --git a/src/Numerics/RootFinding/Cubic.cs b/src/Numerics/RootFinding/Cubic.cs index 7921ca21..f6d81479 100644 --- a/src/Numerics/RootFinding/Cubic.cs +++ b/src/Numerics/RootFinding/Cubic.cs @@ -20,7 +20,7 @@ namespace MathNet.Numerics.RootFinding /// /// Q and R are transformed variables. /// - private static void QR(double a2, double a1, double a0, ref double Q, ref double R) + private static void QR(double a2, double a1, double a0, out double Q, out double R) { Q = (3 * a1 - a2 * a2)/9.0; R = (9.0 * a2 * a1 - 27 * a0 - 2 * a2 * a2 * a2)/54.0; @@ -36,15 +36,14 @@ namespace MathNet.Numerics.RootFinding public static Tuple RealRoots(double a2, double a1, double a0) { - var Q = double.NaN; - var R = double.NaN; - QR(a2, a1, a0, ref Q, ref R); + double Q, R; + QR(a2, a1, a0, out Q, out R); var Q3 = Q * Q * Q; var D = Q3 + R * R; var shift = -a2 / 3d; - double x1 = double.NaN; + double x1; double x2 = double.NaN; double x3 = double.NaN; @@ -72,9 +71,8 @@ namespace MathNet.Numerics.RootFinding public static Tuple Roots(double a2, double a1, double a0) { // use eqn (54)-(56) - var Q = double.NaN; - var R = double.NaN; - QR(a2, a1, a0, ref Q, ref R); + double Q, R; + QR(a2, a1, a0, out Q, out R); var D = Q * Q * Q + R * R;