using System; using CenterSpace.NMath.Core; namespace CenterSpace.NMath.Examples.CSharp { class RootFindingExample { /// <summary> /// A .NET example in C# showing how to find a root of a univariate function /// using the secant and Newton-Raphson methods. /// </summary> static void Main( string[] args ) { Console.WriteLine(); // Find a root of the function 4x^3 + 0.4x - 9 in the interval // -1000 < x < 1000 using the secant method. var finder1 = new SecantRootFinder(); double root = finder1.Find( function, -1000, 1000 ); Console.Write( "Secant root finder found a root at " + root ); Console.WriteLine( " in " + finder1.Iterations + " iterations." ); Console.WriteLine(); // Function evaluated at the root is within tolerance of zero. Console.WriteLine( "The function evaluated at the root: " + function.Evaluate( root ) ); Console.WriteLine(); // If you know the derivative of the function, you can use the // Newton-Raphson root finder. var finder2 = new NewtonRaphsonRootFinder(); root = finder2.Find( function, derivative, -1000, 1000 ); Console.Write( "Newton-Raphson root finder found the root" ); Console.WriteLine( " in " + finder2.Iterations + " iterations." ); Console.WriteLine(); // Reducing the tolerance speeds up the calculation. finder2.Tolerance = 0.1; root = finder2.Find( function, derivative, -1000, 1000 ); Console.Write( "Newton-Raphson root finder found the root" ); Console.WriteLine( " in " + finder2.Iterations + " iterations." ); Console.WriteLine(); // A negative tolerance causes the root finder to run until the maximum // number of iterations is reached. finder2.Tolerance = -1; root = finder2.Find( function, derivative, -1000, 1000 ); Console.Write( "Newton-Raphson root finder found the root" ); Console.WriteLine( " in " + finder2.Iterations + " iterations." ); Console.WriteLine(); Console.WriteLine(); Console.WriteLine( "Press Enter Key" ); Console.Read(); } private static OneVariableFunction function = new OneVariableFunction( new Func<double, double>( F ) ); private static OneVariableFunction derivative = new OneVariableFunction( new Func<double, double>( DF ) ); private static double F( double x ) { return 4 * Math.Pow( x, 3 ) + ( 0.4 * x ) - 9; } private static double DF( double x ) { return 12 * Math.Pow( x, 2 ) + 0.4; } } // class } // namespace← All NMath Code Examples