Extreme Optimization™: Complexity made simple.

Numerical Components
for .NET

  • Home
  • •
  • Features
    • Math Library
    • Vector and Matrix Library
    • Statistics Library
    • Performance
    • Usability
  • •
  • Documentation
    • Introduction
    • Math Library User's Guide
    • Vector and Matrix Library User's Guide
    • Statistics Library User's Guide
    • Reference
  • •
  • Support
    • Frequently Asked Questions
    • QuickStart Samples
    • Sample Applications
    • Downloads
  • •
  • Blog
  • •
  • Company
    • About us
    • Testimonials
    • Customers
    • Press Releases
    • Careers
    • Contact us
Introduction
Expand Mathematics Library User's GuideMathematics Library User's Guide
Expand Vector and Matrix Library User's GuideVector and Matrix Library User's Guide
Expand Statistics Library User's GuideStatistics Library User's Guide
Expand ReferenceReference
  • Home
    • Features
    • Solutions
    • Documentation
    • QuickStart Samples
    • Sample Applications
    • Downloads
    • Technical Support
    • Download trial
    • How to buy
    • Blog
    • Company
    • Resources
  • Documentation
    • Introduction
    • Mathematics Library User's Guide
    • Vector and Matrix Library User's Guide
    • Statistics Library User's Guide
    • Reference
  • Mathematics Library User's Guide
    • General Classes
    • Complex Numbers
    • Arbitrary Precision Arithmetic
    • Curves
    • Curve Fitting
    • Solving Equations
    • Optimization
    • Calculus
    • Fast Fourier Transforms
    • Special Functions
    • Generic Arithmetic
    • Appendices
  • Curves
    • Curve Basics
    • Simple Curves
    • Polynomials
    • Chebyshev Expansions
    • Piecewise Curves and Cubic Splines
    • Comparing Curve classes and RealFunction delegates
  • Polynomials
Collapse imageExpand ImageCopy imageCopyHover image
       




Polynomials

A polynomial is a linear function that is a combination of the argument raised to different integer powers. Polynomials are among the most common mathematical objects. The Extreme Optimization Mathematics Library for .NET has extensive support for common polynomials and Chebyshev polynomials.

The PolynomialBase class

All polynomial classes are derived from PolynomialBase This class defines a number of properties shared by all polynomial classes. PolynomialBase is itself derived from LinearCombination.

The Parameters of a polynomial are the coefficients of the polynomial.

The Degree of a polynomial is the highest power that appears in the sum. The number of parameters of the polynomial equals the degree plus one.

General polynomials are implemented by the Polynomial class. The Constant, Line, and Quadratic classes all inherit from Polynomial. They represent polynomials of fixed degree 0, 1, and 2, respectively. An instance of one of these specialized classes can be substituted whenever a Polynomial instance is used in an expression.

Constructing polynomials

The Polynomial class has three constructors: The first constructor takes the degree of the polynomial as its only argument. All coefficients are initially set to zero. The second constructor takes an array of Double values containing the coefficients. The third constructor takes a single Vector argument. This Vector should contain the coefficients of the polynomial. The following example illustrates three different ways of constructing the polynomial.

x 3 - 5x2 + 9x + 2

C# Copy imageCopy
Polynomial p1 = new Polynomial(3);
p1.Coefficients[3] = 1;
p1.Coefficients[2] = -5;
p1.Coefficients[1] = 9;
p1.Coefficients[0] = 2;
Polynomial p2 = new Polynomial(new double[] {2, 9, -5, 1});
Vector coefficients = new Vector(2, 9, -5, 1);
Polynomial p3 = new Polynomial(coefficients);
Visual Basic Copy imageCopy
Dim p1 As Polynomial = new Polynomial(3);
p1.Coefficients(3) = 1
p1.Coefficients(2) = -5
p1.Coefficients(1) = 9
p1.Coefficients(0) = 2
Dim p2 As Polynomial = New Polynomial(New Double() {1, -5, 9, 2})
Dim coefficients As Vector = Vector.Create(2, 9, -5, 1)
Dim p3 As Polynomial = New Polynomial(coefficients)

Notice that the coefficients in the constructors for p2 and p3 are listed in order of degree. The nth element of the array or Vector is the coefficient of degree n.

You can also create a polynomial using one of several static methods.

The GetInterpolatingPolynomial(array<Double>[]()[], array<Double>[]()[]) method returns the polynomial that interpolates a set of points. The x-coordinates of the points must be distinct. The x and y-coordinates must be given as two separate Double arrays. The following creates the interpolating polynomial through a set of four points:

C# Copy imageCopy
double[] xValues = new double[] {1, 2, 3, 4};
double[] yValues = new double[] {1, 4, 10, 8};
Polynomial p4;
p4 = Polynomial.GetInterpolatingPolynomial(xValues, yValues);
Visual Basic Copy imageCopy
Dim xValues As Double() = New Double() {1, 2, 3, 4}
Dim yValues As Double() = New Double() {1, 4, 10, 8}
Dim p4 As Polynomial
p4 = Polynomial.GetInterpolatingPolynomial(xValues, yValues);

The FromRoots(array<Double>[]()[]) method constructs a Polynomial whose roots are given by the arguments passed to the method. The roots are provided as a Double array. They can be in any order. The same root can appear multiple times. The following constructs a polynomial with roots 1, 2 (twice), and 4:

C# Copy imageCopy
double[] roots = new double[] {1, 2, 2, 4};
Polynomial p5 = Polynomial.FromRoots(roots);
Visual Basic Copy imageCopy
Dim roots As Double() = New Double() {1, 2, 3, 4}
Dim p5 As Polynomial = Polynomial.FromRoots(roots);

The LeastSquaresFit()()() method constructs a Polynomial that is the least squares fit of a specified degree through a given set of points.

C# Copy imageCopy
double[] xValues = new double[7];
double[] yValues = new double[7];
double angle = 0;
for(int index = 0; index < 7; index++)
{
    xValues[index] = Math.Cos(angle);
    yValues[index] = -Math.Sin(angle);
    angle = angle + Constants.Pi / 6;
}
Polynomial p6 = Polynomial.LeastSquaresFit(xValues, yValues, 4);
Visual Basic Copy imageCopy
Dim xValues As Double() = New Double(7)
Dim yValues As Double() = New Double(7)
Dim angle As Double = 0
Dim index As Integer
For index = 0 to 6
    xValues(index) = Math.Cos(angle)
    yValues(index) = -Math.Sin(angle)
    angle = angle + Constants.Pi / 6
Next
Dim p6 As Polynomial = Polynomial.LeastSquaresFit(xValues, yValues, 4);

Working with polynomials

Polynomial implements all methods and properties of the Curve class.

The ValueAt(Double) method returns the value of the polynomial at a specified point. SlopeAt(Double) returns the derivative. These methods are overloaded to take both real and DoubleComplex arguments. The complex version returns a complex number.

C# Copy imageCopy
Console.WriteLine("p1.ValueAt(2) = {0}", p1.ValueAt(2));
Console.WriteLine("p1.SlopeAt(2) = {0}", p1.SlopeAt(2));
DoubleComplex z = new DoubleComplex(1, -2);
Console.WriteLine("p1.ValueAt(1-2i) = {0}", p1.ValueAt(z));
Visual Basic Copy imageCopy
Console.WriteLine("p1.ValueAt(2) = {0}", p1.ValueAt(2))
Console.WriteLine("p1.SlopeAt(2) = {0}", p1.SlopeAt(2))
Dim z As DoubleComplex = New DoubleComplex(1, -2)
Console.WriteLine("p1.ValueAt(1-2i) = {0}", p1.ValueAt(z))

The GetDerivative()()() method returns the polynomial that is the derivative of a polynomial. If the derivative is a constant, a line, or a quadratic curve, an instance of the corresponding type is returned.

C# Copy imageCopy
Curve derivative = p1.GetDerivative();
Console.WriteLine("Slope at 2 (derivative) = {0}", 
    derivative.ValueAt(2));
Console.WriteLine("Type of derivative: {0}",
    derivative.GetType().FullName);
Visual Basic Copy imageCopy
Dim derivative As Curve = p1.GetDerivative()
Console.WriteLine("Slope at 2 (derivative) = {0}", _
    derivative.ValueAt(2))
Console.WriteLine("Type of derivative: {0}", _
    derivative.GetType().FullName)

Integral(Double, Double) evaluates the definite integral over a specified interval. The integral is calculated directly using the coefficients of the polynomial. No numerical approximations are used.

The parameters of a polynomial correspond to the coefficients of the polynomial. To make it easier to work with polynomial coefficients, an indexer property has been defined, which can be used to get and set individual coefficients directly. In Visual Basic .NET and other languages that don't support indexers, the indexed property Coefficient should be used instead.

C# Copy imageCopy
// We create the polynomial x^3 + x^2 - x - 2:
Polynomial p = new Polynomial(1, 1, -1, -2);
// The coefficient of x^1=x is '-1':
Console.WriteLine(p[1]);
// We can change the value of this coefficient.
p[1] = 0;
Visual Basic Copy imageCopy

' We create the polynomial x^3 + x^2 - x - 2:
Dim p As Polynomial = New Polynomial(1, 1, -1, -2)
' The coefficient of x^1=x is '-1':
Console.WriteLine(p.Coefficient(1))
' We can change the value of this coefficient.
p.Coefficient(1) = 0

Operations on polynomials

The result of adding or subtracting two polynomials is a new polynomial. Similarly, the result of multiplying two polynomials is a new polynomial.

The Polynomial class implements these operations through overloaded operators. Static methods are available for languages that don't support operator overloading. The following table summarizes these operations:

Polynomial operators and their static (Shared) method equivalents
Operator Static method equivalent Description
+p (no equivalent) Returns the polynomial p.
-p Negate(LinearCombination) Returns the negation of the polynomial p.
p1 + p2 Add(Polynomial, Polynomial) Adds the polynomials p1 and p2.
p1 - p2 Subtract(Polynomial, Polynomial) Subtracts the polynomials p1 and p2.
p1 * p2 Multiply(Polynomial, Polynomial) Multiplies the polynomials p1 and p2.
a * p Multiply(Double, LinearCombination) Multiplies the polynomial p by the real number a.
p1 / p2 Divide(Polynomial, Polynomial) Divides the polynomial p1 by p2.
p / a Divide(LinearCombination, Double) Divides the polynomial p by the real number a.
p1 % p2 Modulus(Polynomial, Polynomial) Returns the remainder when dividing the polynomial p1 by p2.

The following example shows how to use these operators:

C# Copy imageCopy
Polynomial a = new Polynomial(2, -2, 4);
Polynomial b = new Polynomial(1, -3);
Polynomial c;
Console.WriteLine("a = {0}", a.ToString());
Console.WriteLine("b = {0}", b.ToString());
c = a + b;
Console.WriteLine("a + b = {0}", c.ToString());
c = a - b;
Console.WriteLine("a - b = {0}", c.ToString());
c = a * b;
Console.WriteLine("a * b = {0}", c.ToString());
c = a / b;
Console.WriteLine("a / b = {0}", c.ToString());
c = a % b;
Console.WriteLine("a % b = {0}", c.ToString());
Visual Basic Copy imageCopy
Dim a As Polynomial = New Polynomial(2, -2, 4)
Dim b As Polynomial = New Polynomial(1, -3)
Dim c As Polynomial = New Polynomial
Console.WriteLine("a = {0}", a.ToString())
Console.WriteLine("b = {0}", b.ToString())
c = Polynomial.Add(a, b)
Console.WriteLine("a + b = {0}", c.ToString())
c = Polynomial.Subtract(a, b)
Console.WriteLine("a - b = {0}", c.ToString())
c = Polynomial.Multiply(a, b)
Console.WriteLine("a * b = {0}", c.ToString())
c = Polynomial.Divide(a, b)
Console.WriteLine("a / b = {0}", c.ToString())
c = Polynomial.Modulus(a, b)
Console.WriteLine("a % b = {0}", c.ToString())

As with integers, division of polynomials is not always exact. The division operator returns a polynomial such that the degree of the remainder of the division is less than the degree of the divisor.

The Divide method has an Divide(Polynomial, Polynomial, Polynomial%) that allows you to obtain both the quotient and remainder at the same time. This method takes a third out parameter that will hold the remainder.

C# Copy imageCopy
Polynomial d;
c = Polynomial.Divide(a, b, out d);
Console.WriteLine("Using Divide method:");
Console.WriteLine("  a / b = {0}", c.ToString());
Console.WriteLine("  a % b = {0}", d.ToString());
Visual Basic Copy imageCopy
Dim d As Polynomial
c = Polynomial.Divide(a, b, out d)
Console.WriteLine("Using Divide method:")
Console.WriteLine("  a / b = {0}", c.ToString())
Console.WriteLine("  a % b = {0}", d.ToString())

Note also that Constant, Line, and Quadratic objects can be used in polynomial expressions, as they inherit from Polynomial.

Finding roots of polynomials

A polynomial of degree n has at most n real roots, some of which may occur several times. The FindRoots()()() method attempts to find all the real roots of a polynomial. For example, the polynomial x3 + x2 - 2 has one real root at x = 1:

C# Copy imageCopy
Polynomial polynomial1 = new Polynomial(1, 1, 0, -2);
double[] roots = polynomial1.FindRoots();
Console.WriteLine("Number of roots of p: {0}", roots.Length);
Console.WriteLine("Value of root 1 = {0}", roots[0]);
Visual Basic Copy imageCopy
Dim p As Polynomial = New Polynomial(1, 1, 0, -2)
Dim roots As Double() = polynomial1.FindRoots()
Console.WriteLine("Number of roots of p: {0}", roots.Length)
Console.WriteLine("Value of root 1 = {0}", roots(0))

In the complex domain, a polynomial of degree n always has n roots. The Polynomial class defines the FindComplexRoots()()() method, which returns an array of DoubleComplex numbers that are the approximate roots of the polynomial.

C# Copy imageCopy
Polynomial polynomial2 = new Polynomial(1, 1, 0, -2);
DoubleComplex[] roots = polynomial2.FindComplexRoots();
Console.WriteLine("Number of roots of p: {0}", roots.Length);
Console.WriteLine("Value of root 1 = {0}", roots[0]);
Console.WriteLine("Value of root 2 = {0}", roots[1]);
Console.WriteLine("Value of root 3 = {0}", roots[2]);
Visual Basic Copy imageCopy
Dim polynomial2 As Polynomial = New Polynomial(1, 1, 0, -2)
Dim roots As DoubleComplex() = polynomial2.FindComplexRoots()
Console.WriteLine("Number of roots of p: {0}", roots.Length)
Console.WriteLine("Value of root 1 = {0}", roots(0))
Console.WriteLine("Value of root 2 = {0}", roots(1))
Console.WriteLine("Value of root 3 = {0}", roots(2))

The roots are returned in order of increasing real part, and, if the real parts are equal, increasing imaginary part.

Send comments on this topic to support@extremeoptimization.com

Copyright © 2003-2010, Extreme Optimization. All rights reserved.
Extreme Optimization, Complexity made simple, M#, and M Sharp are trademarks of ExoAnalytics Inc.
Microsoft, Visual C#, Visual Basic, Visual Studio, Visual Studio.NET, and the Optimized for Visual Studio logo
are registered trademarks of Microsoft Corporation.