mirror of
https://github.com/gonum/gonum.git
synced 2025-10-05 23:26:52 +08:00
41 lines
1.2 KiB
Go
41 lines
1.2 KiB
Go
// 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 integrate
|
|
|
|
import "sort"
|
|
|
|
// Trapezoidal estimates the integral of a function f
|
|
// \int_a^b f(x) dx
|
|
// from a set of evaluations of the function using the trapezoidal rule.
|
|
// The trapezoidal rule makes piecewise linear approximations to the function,
|
|
// and estimates
|
|
// \int_x[i]^x[i+1] f(x) dx
|
|
// as
|
|
// (x[i+1] - x[i]) * (f[i] + f[i+1])/2
|
|
// where f[i] is the value of the function at x[i].
|
|
// More details on the trapezoidal rule can be found at:
|
|
// https://en.wikipedia.org/wiki/Trapezoidal_rule
|
|
//
|
|
// The (x,f) input data points must be sorted along x. stat.SortWeighted can
|
|
// be used to do this. The x and f slices must be of equal length and have
|
|
// length greater than one.
|
|
func Trapezoidal(x, f []float64) float64 {
|
|
switch {
|
|
case len(x) != len(f):
|
|
panic("integrate: slice length mismatch")
|
|
case len(x) < 2:
|
|
panic("integrate: input data too small")
|
|
case !sort.Float64sAreSorted(x):
|
|
panic("integrate: input must be sorted")
|
|
}
|
|
|
|
integral := 0.0
|
|
for i := 0; i < len(x)-1; i++ {
|
|
integral += 0.5 * (x[i+1] - x[i]) * (f[i+1] + f[i])
|
|
}
|
|
|
|
return integral
|
|
}
|