github.com/gopherd/gonum@v0.0.4/interp/interp_example_test.go (about)

     1  // Copyright ©2020 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package interp_test
     6  
     7  import (
     8  	"fmt"
     9  	"math"
    10  	"os"
    11  	"text/tabwriter"
    12  
    13  	"github.com/gopherd/gonum/interp"
    14  )
    15  
    16  func ExamplePredictor() {
    17  	// An example of fitting different interpolation
    18  	// algorithms to (X, Y) data with widely varying slope.
    19  	//
    20  	// Cubic interpolators have to balance the smoothness
    21  	// of the generated curve with suppressing ugly wiggles
    22  	// (compare the output of AkimaSpline with that of
    23  	// FritschButland).
    24  	xs := []float64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
    25  	ys := []float64{0, 0.001, 0.002, 0.1, 1, 2, 2.5, -10, -10.01, 2.49, 2.53, 2.55}
    26  
    27  	var pc interp.PiecewiseConstant
    28  	var pl interp.PiecewiseLinear
    29  	var as interp.AkimaSpline
    30  	var fb interp.FritschButland
    31  
    32  	predictors := []interp.FittablePredictor{&pc, &pl, &as, &fb}
    33  	for i, p := range predictors {
    34  		err := p.Fit(xs, ys)
    35  		if err != nil {
    36  			panic(fmt.Sprintf("Error fitting %d-th predictor: %v", i, err))
    37  		}
    38  	}
    39  
    40  	n := len(xs)
    41  	dx := 0.25
    42  	nPts := int(math.Round(float64(n-1)/dx)) + 1
    43  
    44  	w := tabwriter.NewWriter(os.Stdout, 8, 0, 1, ' ', tabwriter.AlignRight)
    45  	fmt.Fprintln(w, "x\tPC\tPL\tAS\tFB\t")
    46  	for i := 0; i < nPts; i++ {
    47  		x := xs[0] + float64(i)*dx
    48  		fmt.Fprintf(w, "%.2f", x)
    49  		for _, predictor := range predictors {
    50  			y := predictor.Predict(x)
    51  			fmt.Fprintf(w, "\t%.2f", y)
    52  		}
    53  		fmt.Fprintln(w, "\t")
    54  	}
    55  	fmt.Fprintln(w)
    56  	w.Flush()
    57  	// Output:
    58  	//        x      PC      PL      AS      FB
    59  	//     0.00    0.00    0.00    0.00    0.00
    60  	//     0.25    0.00    0.00    0.00    0.00
    61  	//     0.50    0.00    0.00    0.00    0.00
    62  	//     0.75    0.00    0.00    0.00    0.00
    63  	//     1.00    0.00    0.00    0.00    0.00
    64  	//     1.25    0.00    0.00    0.00    0.00
    65  	//     1.50    0.00    0.00    0.00    0.00
    66  	//     1.75    0.00    0.00    0.00    0.00
    67  	//     2.00    0.00    0.00    0.00    0.00
    68  	//     2.25    0.10    0.03   -0.01    0.01
    69  	//     2.50    0.10    0.05   -0.01    0.03
    70  	//     2.75    0.10    0.08    0.02    0.06
    71  	//     3.00    0.10    0.10    0.10    0.10
    72  	//     3.25    1.00    0.33    0.26    0.22
    73  	//     3.50    1.00    0.55    0.49    0.45
    74  	//     3.75    1.00    0.78    0.75    0.73
    75  	//     4.00    1.00    1.00    1.00    1.00
    76  	//     4.25    2.00    1.25    1.24    1.26
    77  	//     4.50    2.00    1.50    1.50    1.54
    78  	//     4.75    2.00    1.75    1.75    1.79
    79  	//     5.00    2.00    2.00    2.00    2.00
    80  	//     5.25    2.50    2.12    2.22    2.17
    81  	//     5.50    2.50    2.25    2.37    2.33
    82  	//     5.75    2.50    2.38    2.47    2.45
    83  	//     6.00    2.50    2.50    2.50    2.50
    84  	//     6.25  -10.00   -0.62    0.83    0.55
    85  	//     6.50  -10.00   -3.75   -2.98   -3.75
    86  	//     6.75  -10.00   -6.88   -7.18   -8.04
    87  	//     7.00  -10.00  -10.00  -10.00  -10.00
    88  	//     7.25  -10.01  -10.00  -11.16  -10.00
    89  	//     7.50  -10.01  -10.00  -11.55  -10.01
    90  	//     7.75  -10.01  -10.01  -11.18  -10.01
    91  	//     8.00  -10.01  -10.01  -10.01  -10.01
    92  	//     8.25    2.49   -6.88   -7.18   -8.06
    93  	//     8.50    2.49   -3.76   -2.99   -3.77
    94  	//     8.75    2.49   -0.63    0.82    0.53
    95  	//     9.00    2.49    2.49    2.49    2.49
    96  	//     9.25    2.53    2.50    2.50    2.51
    97  	//     9.50    2.53    2.51    2.51    2.52
    98  	//     9.75    2.53    2.52    2.52    2.52
    99  	//    10.00    2.53    2.53    2.53    2.53
   100  	//    10.25    2.55    2.53    2.54    2.54
   101  	//    10.50    2.55    2.54    2.54    2.54
   102  	//    10.75    2.55    2.54    2.55    2.55
   103  	//    11.00    2.55    2.55    2.55    2.55
   104  }