func expensive(v float64) float64 { for i := 0; i < 100; i++ { v = math.J0(v) } return v }
/* Test evaluation of interpolation at x EDGE CASES: - test for linear extrapolation outside data bounds */ func TestSplineOuts(t *testing.T) { //Data represents Bessel function of 1st kind xs := Arange(0, 20, 500) ys := Arange(0, 20, 500) PPmap(math.J1, ys) bvd := MakeBiVariateData(xs, ys) spl := CubicSpline(bvd) for i, _ := range xs { yi := ys[i] xi := xs[i] if !areSimilar(yi, spl.F(xi)) { t.Error("Spline does not conform to yi = f(xi) rule") } if !areSimilar(spl.coeffs[i], spl.DF(xi)*(20.0/500.0)) { t.Error("Spline does not conform to Di*h = df(xi) rule") } } //Check integration over (0, 20) with closed-form answer relError := relativeError(1.0-math.J0(20.0), spl.Integral(0.0, 20.0)) if relError > 1E-5 { t.Error("Spline did not integrate accurately enough. Error:", relError) } }
func TestFindRoot1(t *testing.T) { out, conv := FindRoot(math.J0, 0.0, 4.0) if !conv { t.Error("FindRoot failed to converge.") } else { if math.Abs(out-2.4048255576957727) > 1E-14 { t.Error("FindRoot didn't compute the right value.") t.Error("Expected:", 2.4048255576957727) t.Error("Got:", out) t.Error("Evaluates to:", math.J0(out)) } } }
// float32 version of math.J0 func J0(x float32) float32 { return float32(math.J0(float64(x))) }