[TOC]
using System;
using CenterSpace.NMath.Core;
using CenterSpace.NMath.Analysis;
namespace CenterSpace.NMath.Analysis.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.
SecantRootFinder 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.
NewtonRaphsonRootFinder 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 NMathFunctions.DoubleUnaryFunction(F));
private static OneVariableFunction derivative = new OneVariableFunction(new NMathFunctions.DoubleUnaryFunction(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
[TOC]