github.com/gonum/lapack@v0.0.0-20181123203213-e4cdc5a0bff9/testlapack/dlae2.go (about) 1 // Copyright ©2016 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 testlapack 6 7 import ( 8 "fmt" 9 "math" 10 "testing" 11 ) 12 13 type Dlae2er interface { 14 Dlae2(a, b, c float64) (rt1, rt2 float64) 15 } 16 17 func Dlae2Test(t *testing.T, impl Dlae2er) { 18 for _, test := range []struct { 19 a, b, c float64 20 }{ 21 {-10, 5, 3}, 22 {3, 5, -10}, 23 {0, 3, 0}, 24 {1, 3, 1}, 25 {1, -3, 1}, 26 {5, 0, 3}, 27 {3, 0, -5}, 28 {1, 3, 1.02}, 29 {1.02, 3, 1}, 30 {1, -3, -9}, 31 } { 32 a := test.a 33 b := test.b 34 c := test.c 35 rt1, rt2 := impl.Dlae2(a, b, c) 36 37 errStr := fmt.Sprintf("a = %v, b = %v, c = %v", a, b, c) 38 // Check if rt1 and rt2 are eigenvalues by checking if det(a - λI) = 0 39 a1 := a - rt1 40 c1 := c - rt1 41 det := a1*c1 - b*b 42 if math.Abs(det) > 1e-10 { 43 t.Errorf("First eigenvalue mismatch. %s. Det = %v", errStr, det) 44 } 45 46 a2 := a - rt2 47 c2 := c - rt2 48 det = a2*c2 - b*b 49 if math.Abs(det) > 1e-10 { 50 t.Errorf("Second eigenvalue mismatch. %s. Det = %v", errStr, det) 51 } 52 } 53 }