| // Copyright ©2016 The Gonum Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package fd_test |
| |
| import ( |
| "fmt" |
| "math" |
| |
| "gonum.org/v1/gonum/diff/fd" |
| "gonum.org/v1/gonum/mat" |
| ) |
| |
| func ExampleDerivative() { |
| f := func(x float64) float64 { |
| return math.Sin(x) |
| } |
| // Compute the first derivative of f at 0 using the default settings. |
| fmt.Println("f'(0) ≈", fd.Derivative(f, 0, nil)) |
| // Compute the first derivative of f at 0 using the forward approximation |
| // with a custom step size. |
| df := fd.Derivative(f, 0, &fd.Settings{ |
| Formula: fd.Forward, |
| Step: 1e-3, |
| }) |
| fmt.Println("f'(0) ≈", df) |
| |
| f = func(x float64) float64 { |
| return math.Pow(math.Cos(x), 3) |
| } |
| // Compute the second derivative of f at 0 using |
| // the centered approximation, concurrent evaluation, |
| // and a known function value at x. |
| df = fd.Derivative(f, 0, &fd.Settings{ |
| Formula: fd.Central2nd, |
| Concurrent: true, |
| OriginKnown: true, |
| OriginValue: f(0), |
| }) |
| fmt.Println("f''(0) ≈", df) |
| |
| // Output: |
| // f'(0) ≈ 1 |
| // f'(0) ≈ 0.9999998333333416 |
| // f''(0) ≈ -2.999999981767587 |
| } |
| |
| func ExampleJacobian() { |
| f := func(dst, x []float64) { |
| dst[0] = x[0] + 1 |
| dst[1] = 5 * x[2] |
| dst[2] = 4*x[1]*x[1] - 2*x[2] |
| dst[3] = x[2] * math.Sin(x[0]) |
| } |
| jac := mat.NewDense(4, 3, nil) |
| fd.Jacobian(jac, f, []float64{1, 2, 3}, &fd.JacobianSettings{ |
| Formula: fd.Central, |
| Concurrent: true, |
| }) |
| fmt.Printf("J ≈ %.6v\n", mat.Formatted(jac, mat.Prefix(" "))) |
| |
| // Output: |
| // J ≈ ⎡ 1 0 0⎤ |
| // ⎢ 0 0 5⎥ |
| // ⎢ 0 16 -2⎥ |
| // ⎣ 1.62091 0 0.841471⎦ |
| } |