Class: GSL::MultiFit::MultidLM

Inherits:
Object
  • Object
show all
Defined in:
lib/gsl_extras.rb

Direct Known Subclasses

MultidLMNumDiff

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(yproc = nil, fproc, dfproc, ndata, ndims, nparams) ⇒ MultidLM

Returns a new instance of MultidLM.



863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
# 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

Instance Attribute Details

#chi2Object

Returns the value of attribute chi2.



920
921
922
# File 'lib/gsl_extras.rb', line 920

def chi2
  @chi2
end

#covarObject

Returns the value of attribute covar.



920
921
922
# File 'lib/gsl_extras.rb', line 920

def covar
  @covar
end

#dofObject

Returns the value of attribute dof.



920
921
922
# File 'lib/gsl_extras.rb', line 920

def dof
  @dof
end

#my_chi2Object

Returns the value of attribute my_chi2.



920
921
922
# File 'lib/gsl_extras.rb', line 920

def my_chi2
  @my_chi2
end

#positionObject

Returns the value of attribute position.



920
921
922
# File 'lib/gsl_extras.rb', line 920

def position
  @position
end

Class Method Details

.alloc(*args) ⇒ Object



859
860
861
# File 'lib/gsl_extras.rb', line 859

def self.alloc(*args)
	new(*args)
end

Instance Method Details

#eval(*points) ⇒ Object



922
923
924
925
# 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) ⇒ Object



886
887
888
889
890
891
892
893
# 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) ⇒ Object



895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
# 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