Data Analysis Mathematics Linear Algebra Statistics
New Version 7.0!  QuickStart Samples

# Chebyshev Series QuickStart Sample (Visual Basic)

Illustrates the basic use of the ChebyshevSeries class in Visual Basic.

```Option Infer On

' The ChebyshevSeries class resides in the
' Extreme.Mathematics.Curves namespace.
Imports Extreme.Mathematics.Curves
' The Constants class and Func(Of Double, Double) delegate reside in the
' Extreme.Mathematics namespace.
Imports Extreme.Mathematics

Namespace Extreme.Numerics.QuickStart.VB

Module ChebyshevExpansions

' Illustrates the use of the ChebyshevSeries class
' in the Extreme.Mathematics.Curve namespace of the Extreme
' Optimization Numerical Libraries for .NET.
Sub Main()
' Chebyshev polynomials form an alternative basis
' for polynomials. A Chebyshev expansion is a
' polynomial expressed as a sum of Chebyshev
' polynomials.
'
' Using the ChebyshevSeries class instead of
' Polynomial can have two major advantages:
'   1. They are numerically more stable. Higher
'      accuracy is maintained even for large problems.
'   2. When approximating other functions with
'      polynomials, the coefficients in the
'      Chebyshev expansion will tend to decrease
'      in size, where those of the normal polynomial
'      approximation will tend to oscillate wildly.

' Index variable.
Dim index As Int32

'
' Constructing Chebyshev expansions
'

' Chebyshev expansions are defined over an interval.
' The first constructor requires you to specify the
' boundaries of the interval, and the coefficients
' of the expansion.
Dim coefficients = New Double() {1, 0.5, -0.3, 0.1}
Dim chebyshev1 As New ChebyshevSeries(0, 2, coefficients)
' If you omit the boundaries, they are assumed to be
' -1 and +1:
Dim chebyshev2 As New ChebyshevSeries(coefficients)

'
' Chebyshev approximations
'

' A third way to construct a Chebyshev series is as an
' approximation to an arbitrary function. For more
' about the Func(Of Double, Double) delegate, see the
' FunctionDelegates QuickStart Sample.
'
' Chebyshev expansions allow us to obtain an
' excellent approximation at minimal cost.
'
' The following creates a Chebyshev approximation
' of degree 7 to Cos(x) over the interval (0, 2):
Dim cos As Func(Of Double, Double) = AddressOf Math.Cos
Dim approximation1 =
ChebyshevSeries.GetInterpolatingPolynomial(cos, 0, 2, 7)
Console.WriteLine("Chebyshev approximation of cos(x):")
For index = 0 To 7
Console.WriteLine("  c{0} = {1}", index, _
approximation1.Parameters(index))
Next

' The largest errors are approximately at the
' zeroes of the Chebyshev polynomial of degree 8:
For index = 0 To 8
Dim zero As Double = _
1 + Math.Cos(index * Constants.Pi / 8)
Dim err As Double = _
approximation1.ValueAt(zero) - Math.Cos(zero)
Console.WriteLine(" Error {0} = {1}", index, err)
Next

'
' Least squares approximations
'

' We will now calculate the least squares polynomial
' of degree 7 through 33 points.
' First, calculate the points:
Dim xValues = New Double(32) {}
Dim yValues = New Double(32) {}
For index = 0 To 32
Dim angle As Double = index * Constants.Pi / 32
xValues(index) = 1 + Math.Cos(angle)
yValues(index) = Math.Cos(xValues(index))
Next
' Next, define a ChebyshevBasis object for the
' approximation we want: interval (0,2) and degree
' is 7.
Dim basis As New ChebyshevBasis(0, 2, 7)
' Now we can calculate the least squares fit:
Dim approximation2 =
CType(basis.LeastSquaresFit(xValues, yValues, xValues.Length),
ChebyshevSeries)
' We can see it is close to the original
' approximation we found earlier:
For index = 0 To 7
Console.WriteLine("  c{0} = {1}", index, _
approximation2.Parameters(index))
Next

Console.Write("Press Enter key to exit...")