class GSL::MultiFit::MultidLM
Attributes
chi2[RW]
covar[RW]
dof[RW]
my_chi2[RW]
position[RW]
Public Class Methods
alloc(*args)
click to toggle source
# File lib/gsl_extras.rb, line 859 def self.alloc(*args) new(*args) end
new(yproc = nil, fproc, dfproc, ndata, ndims, nparams)
click to toggle source
# File lib/gsl_extras.rb, line 863 def initialize(yproc = nil, fproc, dfproc, ndata, ndims, nparams) @fproc = Proc.new do |x, t, y, sigma, f| # gridpoints = (0...@ndims).to_a.map do |i| # @gridpoints.col(i) # end fproc.call(x, *@gridpoints, y, sigma, f) end @dfproc = Proc.new do |x, t, y, sigma, jac| # gridpoints = (0...@ndims).to_a.map do |i| # @gridpoints.col(i) # end # puts 'hello' dfproc.call(x, *@gridpoints, y, sigma, jac) end @yproc = yproc # fproc # @dfproc = dfproc @ndata = ndata; @ndims = ndims; @nparams = nparams @f = GSL::MultiFit::Function_fdf.alloc(@fproc, @dfproc, @nparams) @solver = GSL::MultiFit::FdfSolver.alloc(FdfSolver::LMDER, @ndata, @nparams) end
Public Instance Methods
eval(*points)
click to toggle source
# File lib/gsl_extras.rb, line 922 def eval(*points) raise "yproc not set" unless @yproc @yproc.call(@solver.position, *points) end
set_data(xstart, *gridpoints, y, sigma)
click to toggle source
# File lib/gsl_extras.rb, line 886 def set_data(xstart, *gridpoints, y, sigma) # p 'g', gridpoints.size @gridpoints = gridpoints; @y = y; @x = xstart.dup; @sigma = sigma @t = GSL::Vector.alloc(@y.size) @t.set_all(0.0) # t should never be used. @f.set_data(@t, @y, @sigma) @solver.set(@f, @x) end
solve(print_out = false)
click to toggle source
# File lib/gsl_extras.rb, line 895 def solve(print_out = false) (puts "Warning: due to a bug, print out doesn't work with less than 3 params"; print_out = false) if @nparams < 3 # p @nparams, @solver.send(:p) iter = 0 @solver.print_state(iter) if print_out begin iter += 1 status = @solver.iterate @solver.print_state(iter) if print_out status = @solver.test_delta(1e-7, 1e-7) end while status == GSL::CONTINUE and iter < 500 @covar = @solver.covar(0.0) @position = @solver.position @my_chi2 = 0.0 # gp = @gridpoints.transpose for i in 0...@y.size @my_chi2 += (@y[i] - eval(*@gridpoints.map{|vec| vec[i]}))**2.0 / @sigma[i]**2.0 end @chi2 = (@solver.f.dnrm2)**2 @dof = @ndata - @nparams @solved = true @solver.position end