Piecewise Curves in C# QuickStart Sample
Illustrates working with piecewise constant and piecewise linear curves using classes from the Numerics.NET.Curves namespace in C#.
View this sample in: Visual Basic F# IronPython
using System;
using Numerics.NET;
// The piecewise curve classes reside in the
// Numerics.NET.Curves namespace.
using Numerics.NET.Curves;
namespace Numerics.NET.QuickStart.CSharp
{
/// <summary>
/// Illustrates the use of the PiecewiseConstantCurve and
/// PiecewiseLinearCurve classes.
/// </summary>
class PiecewiseCurves
{
static void Main(string[] args)
{
// The license is verified at runtime. We're using
// a 30 day trial key here. For more information, see
// https://numerics.net/trial-key
Numerics.NET.License.Verify("64542-18980-57619-62268");
// A piecewise curve is a curve that has a different definition
// on subintervals of its domain.
//
// This QuickStart Sample illustrates constant and linear piecewise
// curves, which - as the name suggest - are constant or linear
// on each interval.
//
// For an example of cubic splines, see the CubicSplines QuickStart
// Sample.
//
//
// Piecewise constants
//
// All piecewise curves inherit from the PiecewiseCurve class.
// Piecewise constant curves are implemented by the
// PiecewiseConstantCurve class. It has three constructors.
// The first constructor takes two double arrays as parameters.
// These contain the x and y values of the data points:
double[] xValues = {1, 2, 3, 4, 5, 6};
double[] yValues = {1, 3, 4, 3, 4, 2};
var constant1 = new PiecewiseConstantCurve(xValues, yValues);
// The second constructor takes two vectors, containing the
// x and y-values of the data points:
var xVector = Vector.Create(xValues);
var yVector = Vector.Create(yValues);
var constant2 = new PiecewiseConstantCurve(xVector, yVector);
// The third constructor only takes one parameter: an array of
// Point structures that represent the data point.
var dataPoints = new Point[] {new Point(1, 1), new Point(2, 3), new Point(3, 4),
new Point(4, 3), new Point(5, 4), new Point(6, 2)};
var constant3 = new PiecewiseConstantCurve(dataPoints);
//
// Curve Parameters
//
// The shape of any curve is determined by a set of parameters.
// These parameters can be retrieved and set through the
// Parameters collection. The number of parameters for a curve
// is given by this collection's Count property.
//
// Piecewise constant curves have 2n parameters, where n is the number of
// data points. The first n parameters are the x-values. The next
// n parameters are the y-values.
Console.WriteLine("constant1.Parameters.Count = {0}",
constant1.Parameters.Count);
// Parameters can easily be retrieved:
Console.WriteLine("constant1.Parameters[0] = {0}",
constant1.Parameters[0]);
// Parameters can also be set:
constant1.Parameters[0] = 1;
//
// Curve Methods
//
// The ValueAt method returns the y value of the
// curve at the specified x value:
Console.WriteLine($"constant1.ValueAt(2.4) = {constant1.ValueAt(2.4)}");
// The SlopeAt method returns the slope of the curve
// a the specified x value:
Console.WriteLine($"constant1.SlopeAt(2.4) = {constant1.SlopeAt(2.4)}");
// The slope at the data points is Double.NaN if the value of the constant
// is different on either side of the data point:
Console.WriteLine($"constant1.SlopeAt(2) = {constant1.SlopeAt(2)}");
// Piecewise constant curves do not have a defined derivative.
// The GetDerivative method returns a GeneralCurve:
Curve derivative = constant1.GetDerivative();
Console.WriteLine($"Type of derivative: {derivative.GetType().ToString()}");
Console.WriteLine($"derivative(2.4) = {derivative.ValueAt(2.4)}");
// You can get a Line that is the tangent to a curve
// at a specified x value using the TangentAt method:
Polynomial tangent = constant1.TangentAt(2.4);
Console.WriteLine("Slope of tangent line at 2.4 = {0}",
tangent.Parameters[1]);
// The integral of a piecewise constant curve can be calculated exactly.
Console.WriteLine("Integral of constant1 between 1.4 and 4.6 = {0}",
constant1.Integral(1.4, 4.6));
//
// Piecewise linear curves
//
// Piecewise linear curves are used for linear interpolation
// between data points. They are implemented by the
// PiecewiseLinearCurve class. It has three constructors,
// similar to the constructors for the PiecewiseLinearCurve
// class..These constructors create the linear interpolating
// curve between the data points.
// The first constructor takes two double arrays as parameters.
// These contain the x and y values of the data points:
double[] xValues2 = {1, 2, 3, 4, 5, 6};
double[] yValues2 = {1, 3, 4, 3, 4, 2};
var line1 = new PiecewiseLinearCurve(xValues2, yValues2);
// The second constructor takes two vectors, containing the
// x and y-values of the data points:
var xVector2 = Vector.Create(xValues2);
var yVector2 = Vector.Create(yValues2);
var line2 = new PiecewiseLinearCurve(xVector2, yVector2);
// The third constructor only takes one parameter: an array of
// Point structures that represent the data point.
Point[] dataPoints2 = new Point[] {new Point(1, 1), new Point(2, 3), new Point(3, 4),
new Point(4, 3), new Point(5, 4), new Point(6, 2)};
PiecewiseLinearCurve line3 = new PiecewiseLinearCurve(dataPoints);
//
// Curve Parameters
//
// Piecewise linear curves have 2n parameters, where n is the number of
// data points. The first n parameters are the x-values. The next
// n parameters are the y-values.
Console.WriteLine("line1.Parameters.Count = {0}",
line1.Parameters.Count);
// Parameters can easily be retrieved:
Console.WriteLine("line1.Parameters[0] = {0}",
line1.Parameters[0]);
// Parameters can also be set:
line1.Parameters[0] = 1;
//
// Curve Methods
//
// The ValueAt method returns the y value of the
// curve at the specified x value:
Console.WriteLine($"line1.ValueAt(2.4) = {line1.ValueAt(2.4)}");
// The SlopeAt method returns the slope of the curve
// a the specified x value:
Console.WriteLine($"line1.SlopeAt(2.4) = {line1.SlopeAt(2.4)}");
// The slope at the data points is Double.NaN if the slope of the line
// is different on either side of the data point:
Console.WriteLine($"line1.SlopeAt(2) = {line1.SlopeAt(2)}");
// Piecewise line curves do not have a defined derivative.
// The GetDerivative method returns a GeneralCurve:
derivative = line1.GetDerivative();
Console.WriteLine($"Type of derivative: {derivative.GetType().ToString()}");
Console.WriteLine($"derivative(2.4) = {derivative.ValueAt(2.4)}");
// You can get a Line that is the tangent to a curve
// at a specified x value using the TangentAt method:
tangent = line1.TangentAt(2.4);
Console.WriteLine("Slope of tangent line at 2.4 = {0}",
tangent.Parameters[1]);
// The integral of a piecewise line curve can be calculated exactly.
Console.WriteLine("Integral of line1 between 1.4 and 4.6 = {0}",
line1.Integral(1.4, 4.6));
Console.Write("Press Enter key to exit...");
Console.ReadLine();
}
}
}