ruby-gsl Sample: solve.rb


#!/usr/local/bin/ruby


require "GSL"
include GSL

# Test module Solver

STDERR.puts "Running root-finding tests (fsolver)..."

a = 1
b = 0
c = -5
f = Function::new { |x| (a*x + b) * x + c }

[Solver::FSolver::BISECTION, Solver::FSolver::BRENT, Solver::FSolver::FALSEPOS].each do |m|
  
  status = GSL_CONTINUE
  iter = 0
  max_iter = 100

  x_lo = 0.0
  x_hi = 5.0
  r = 0.0
  r_exp = Math::sqrt(5.0)

  s = Solver::FSolver::new(m)
  s.set(f, x_lo, x_hi)

  puts "\nUsing #{s} method"

  printf "%5s [%9s, %9s] %9s %10s %9s\n", "iter", "lower", "upper", 
    "root", "err", "err(est)"

  while status == GSL_CONTINUE && iter < max_iter
    iter += 1
    status = s.iterate
    r = s.root
    x_lo = s.x_lower
    x_hi = s.x_upper
    status = Solver::test_interval(x_lo, x_hi, 0, 0.001)

    puts "Converged:" if status == GSL_SUCCESS

    printf "%5d [%.7f, %.7f] %.7f %+.7f %.7f\n", iter,  x_lo, x_hi,
      r, r - r_exp,  x_hi - x_lo
  end

end

STDERR.puts "\ndone."


Back