mirror of
				https://github.com/gonum/gonum.git
				synced 2025-10-31 02:26:59 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright ©2019 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 (
 | |
| 	"math"
 | |
| 	"testing"
 | |
| 
 | |
| 	"gonum.org/v1/gonum/floats"
 | |
| 	"gonum.org/v1/gonum/integrate/testquad"
 | |
| )
 | |
| 
 | |
| func TestRomberg(t *testing.T) {
 | |
| 	for i, test := range []struct {
 | |
| 		integral testquad.Integral
 | |
| 		n        int
 | |
| 		tol      float64
 | |
| 	}{
 | |
| 		{integral: testquad.Constant(0), n: 3, tol: 0},
 | |
| 		{integral: testquad.Constant(0), n: 1<<5 + 1, tol: 0},
 | |
| 		{integral: testquad.Poly(0), n: 3, tol: 1e-14},
 | |
| 		{integral: testquad.Poly(0), n: 1<<5 + 1, tol: 1e-14},
 | |
| 		{integral: testquad.Poly(1), n: 3, tol: 1e-14},
 | |
| 		{integral: testquad.Poly(1), n: 1<<5 + 1, tol: 1e-14},
 | |
| 		{integral: testquad.Poly(2), n: 3, tol: 1e-14},
 | |
| 		{integral: testquad.Poly(2), n: 1<<5 + 1, tol: 1e-14},
 | |
| 		{integral: testquad.Poly(3), n: 3, tol: 1e-14},
 | |
| 		{integral: testquad.Poly(3), n: 1<<5 + 1, tol: 1e-14},
 | |
| 		{integral: testquad.Poly(4), n: 5, tol: 1e-14},
 | |
| 		{integral: testquad.Poly(4), n: 1<<5 + 1, tol: 1e-14},
 | |
| 		{integral: testquad.Poly(5), n: 5, tol: 1e-14},
 | |
| 		{integral: testquad.Poly(5), n: 1<<5 + 1, tol: 1e-14},
 | |
| 		{integral: testquad.Sin(), n: 1<<3 + 1, tol: 1e-10},
 | |
| 		{integral: testquad.Sin(), n: 1<<5 + 1, tol: 1e-14},
 | |
| 		{integral: testquad.XExpMinusX(), n: 1<<3 + 1, tol: 1e-9},
 | |
| 		{integral: testquad.XExpMinusX(), n: 1<<5 + 1, tol: 1e-14},
 | |
| 		{integral: testquad.Sqrt(), n: 1<<10 + 1, tol: 1e-5},
 | |
| 		{integral: testquad.ExpOverX2Plus1(), n: 1<<4 + 1, tol: 1e-7},
 | |
| 		{integral: testquad.ExpOverX2Plus1(), n: 1<<6 + 1, tol: 1e-14},
 | |
| 	} {
 | |
| 		n := test.n
 | |
| 		a := test.integral.A
 | |
| 		b := test.integral.B
 | |
| 
 | |
| 		x := make([]float64, n)
 | |
| 		floats.Span(x, a, b)
 | |
| 
 | |
| 		y := make([]float64, n)
 | |
| 		for i, xi := range x {
 | |
| 			y[i] = test.integral.F(xi)
 | |
| 		}
 | |
| 
 | |
| 		dx := (b - a) / float64(n-1)
 | |
| 		got := Romberg(y, dx)
 | |
| 
 | |
| 		want := test.integral.Value
 | |
| 		diff := math.Abs(got - want)
 | |
| 		if diff > test.tol {
 | |
| 			t.Errorf("Test #%d: %v, n=%v: unexpected result; got=%v want=%v diff=%v",
 | |
| 				i, test.integral.Name, n, got, want, diff)
 | |
| 		}
 | |
| 	}
 | |
| }
 | 
