File: ell_complete_test.go

package info (click to toggle)
golang-gonum-v1-gonum 0.15.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 18,792 kB
  • sloc: asm: 6,252; fortran: 5,271; sh: 377; ruby: 211; makefile: 98
file content (55 lines) | stat: -rw-r--r-- 1,594 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Copyright ©2017 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 mathext

import (
	"math"
	"testing"
)

// TestCompleteKE checks if the Legendre's relation for m=0.0001(0.0001)0.9999
// is satisfied with accuracy 1e-14.
func TestCompleteKE(t *testing.T) {
	t.Parallel()
	const tol = 1.0e-14

	for m := 1; m <= 9999; m++ {
		mf := float64(m) / 10000
		mp := 1 - mf
		K, Kp := CompleteK(mf), CompleteK(mp)
		E, Ep := CompleteE(mf), CompleteE(mp)
		legendre := math.Abs(E*Kp + Ep*K - K*Kp - math.Pi/2)
		if legendre > tol {
			t.Fatalf("legendre > tol: m=%v, legendre=%v, tol=%v", mf, legendre, tol)
		}
	}
}

// TestCompleteBD checks if the relations between two associate elliptic integrals B(m), D(m)
// and more common Legendre's elliptic integrals K(m), E(m) are satisfied with accuracy 1e-14
// for m=0.0001(0.0001)0.9999.
//
// K(m) and E(m) can be computed without cancellation problems as following:
//
//	K(m) = B(m) + D(m),
//	E(m) = B(m) + (1-m)D(m).
func TestCompleteBD(t *testing.T) {
	t.Parallel()
	const tol = 1.0e-14

	for m := 1; m <= 9999; m++ {
		mf := float64(m) / 10000
		B, D := CompleteB(mf), CompleteD(mf)
		K, E := CompleteK(mf), CompleteE(mf)
		difference1 := math.Abs(K - (B + D))
		difference2 := math.Abs(E - (B + (1-mf)*D))
		if difference1 > tol {
			t.Fatalf("difference1 > tol: m=%v, difference1=%v, tol=%v", mf, difference1, tol)
		}
		if difference2 > tol {
			t.Fatalf("difference2 > tol: m=%v, difference2=%v, tol=%v", mf, difference2, tol)
		}
	}
}