Chebyshev Series in Visual Basic QuickStart Sample

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

View this sample in: C# F# IronPython

Option Infer On

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

Module ChebyshevExpansions

    ' Illustrates the use of the ChebyshevSeries class 
    ' in the Numerics.NET.Curve namespace of Numerics.NET.
    Sub Main()
        ' 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")

        ' 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(coefficients, 0, 2)
        ' 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...")
        Console.ReadLine()

    End Sub

End Module