C# One Variable Function Example

[TOC]

using System;

using CenterSpace.NMath.Core;

namespace CenterSpace.NMath.Core.Examples.CSharp
{
  /// <summary>
  /// A .NET example in C# showing how to create and manipulate functions of one variable.
  /// </summary>
  class OneVariableFunctionExample
  {

    static double MyFunction(double x)
    {
      return Math.Sin(x) + Math.Pow(x, 3) / Math.PI;
    }

    static void Main(string[] args)
    {
      Console.WriteLine();

      // Class OneVariableFunction encapsulates an arbitrary function, and
      // works with other numerical classes to approximate integrals and
      // derivatives. 

      // A OneVariableFunction is constructed from an NMathFunctions.DoubleUnaryFunction,
      // a function delegate that takes a single double parameter and returns a double.
      // For example, to encapsulate MyFunction (see above):
      NMathFunctions.DoubleUnaryFunction d =
         new NMathFunctions.DoubleUnaryFunction(MyFunction);
      OneVariableFunction f = new OneVariableFunction(d);

      // The Evaluate() method evaluates a function at a given x-value.
      Console.WriteLine("f(pi) = {0}\n", f.Evaluate(Math.PI));

      // Evaluate() also accepts a vector of x-values, and returns a vector of
      // y-values, such that y[i] = f( x[i] ). This code evaluates f at 10 points
      // between 0 and 1:
      DoubleVector x = new DoubleVector(10, 0, 1.0 / 10);

      Console.WriteLine("x... ");
      Console.WriteLine(x);
      Console.WriteLine();

      DoubleVector y = f.Evaluate(x);
      Console.WriteLine("y...");
      Console.WriteLine(y.ToString("F3"));
      Console.WriteLine();

      // Class OneVariableFunction provides overloads of the arithmetic operators
      // (and equivalent named methods) that work with either with two function
      // objects, or with a function and a scalar. For example:
      OneVariableFunction g = (f + 1) / 2;
      g = f * g;
      Console.WriteLine("g(pi) = {0}", g.Evaluate(Math.PI));

      // Evaluate() accepts another OneVariableFunction, and returns a new
      // function encapsulating the composite, g( f(x) ).
      OneVariableFunction composite = g.Evaluate(f);
      Console.WriteLine("g( f(pi) ) = {0}\n", composite.Evaluate(Math.PI));

      // The Integrate() method approximates the integral of a function over a
      // given interval.
      double integral = f.Integrate(0, Math.PI / 2);
      Console.WriteLine("Integral of f from 0 to pi/2 = {0}", integral);

      // To perform integration, every OneVariableFunction has an IIntegrator
      // object associated with it. NMath Core integration classes such as
      // RombergIntegrator and GaussKronrodIntegrator implement the IIntegrator
      // interface. The default integrator for a OneVariableFunction is an instance
      // of RombergIntegrator, which may be changed using the Integrator property.
      f.Integrator = new GaussKronrodIntegrator();
      integral = f.Integrate(0, Math.PI / 2);
      Console.WriteLine("Integral of f from 0 to pi/2 using Gauss-Kronrod = {0}\n",
                         integral);

      // The Differentiate() method computes the derivative of a function at
      // a given x-value.
      double derivative = f.Differentiate(Math.PI / 2);
      Console.WriteLine("Derivative of f at pi/2 = {0}\n", derivative);

      // Derivative() returns a new function object encapsulating the first
      // derivative of a function.
      OneVariableFunction f1stDeriv = f.Derivative();
      OneVariableFunction f2ndDeriv = f1stDeriv.Derivative();
      Console.WriteLine("1st derivative of f at pi/2 = {0}",
                         f1stDeriv.Evaluate(Math.PI / 2));
      Console.WriteLine("2nd derivative of f at pi/2 = {0}",
                         f2ndDeriv.Evaluate(Math.PI / 2));

      Console.WriteLine();
      Console.WriteLine("Press Enter Key");
      Console.Read();

    }

  }// class

}// namespace

[TOC]