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