#!/usr/bin/env ruby
# Ruby/GSL implementation of GSL "diff/test.c"
require("gsl")
require("./gsl_test.rb")
include GSL::Test
include Math
f1 = GSL::Function.alloc { |x| exp(x) }
df1 = GSL::Function.alloc { |x| exp(x) }
f2 = GSL::Function.alloc { |x|
if x >= 0.0; x*sqrt(x);
else; 0.0; end
}
df2 = GSL::Function.alloc { |x|
if x >= 0.0; 1.5*sqrt(x);
else; 0.0; end
}
f3 = GSL::Function.alloc { |x|
if x != 0.0; sin(1.0/x);
else; 0.0; end
}
df3 = GSL::Function.alloc { |x|
if x != 0.0; -cos(1.0/x)/(x*x);
else; 0.0; end
}
f4 = GSL::Function.alloc { |x| exp(-x*x) }
df4 = GSL::Function.alloc { |x| -2.0*x*exp(-x*x) }
f5 = GSL::Function.alloc { |x| x*x }
df5 = GSL::Function.alloc { |x| 2.0*x }
f6 = GSL::Function.alloc { |x| 1.0/x }
df6 = GSL::Function.alloc { |x| -1.0/(x*x) }
def test_diff(diff, f, df, x, desc)
expected = df.eval(x)
case diff
when "central"
result, abserr = f.diff_central(x)
when "forward"
result, abserr = f.diff_forward(x)
when "backward"
result, abserr = f.diff_backward(x)
else
raise("undefined operation")
end
GSL::Test::test_abs(result, expected, abserr, desc)
desc2 = sprintf("%s, valid error estimate", desc)
GSL::Test::test((result - expected).abs > abserr, desc2)
end
test_diff("central", f1, df1, 1.0, "exp(x), x=1, central diff")
test_diff("forward", f1, df1, 1.0, "exp(x), x=1, forward diff")
test_diff("backward", f1, df1, 1.0, "exp(x), x=1, backward diff")
test_diff("central", f2, df2, 0.1, "x^(3/2), x=0.1, central diff")
test_diff("forward", f2, df2, 0.1, "x^(3/2), x=0.1, forward diff")
test_diff("backward", f2, df2, 0.1, "x^(3/2), x=0.1, backward diff")
test_diff("central", f3, df3, 0.45, "sin(1/x), x=0.45, central diff")
test_diff("forward", f3, df3, 0.45, "sin(1/x), x=0.45, forward diff")
test_diff("backward", f3, df3, 0.45, "sin(1/x), x=0.45, backward diff")
test_diff("central", f4, df4, 0.5, "exp(-x^2), x=0.5, central diff")
test_diff("forward", f4, df4, 0.5, "exp(-x^2), x=0.5, forward diff")
test_diff("backward", f4, df4, 0.5, "exp(-x^2), x=0.5, backward diff")
test_diff("central", f5, df5, 0.0, "x^2, x=0, central diff")
test_diff("forward", f5, df5, 0.0, "x^2, x=0, forward diff")
test_diff("backward", f5, df5, 0.0, "x^2, x=0, backward diff")
test_diff("central", f6, df6, 10.0, "1/x, x=10, central diff")
test_diff("forward", f6, df6, 10.0, "1/x, x=10, forward diff")
test_diff("backward", f6, df6, 10.0, "1/x, x=10, backward diff")
syntax highlighted by Code2HTML, v. 0.9.1