#!/usr/bin/env ruby
require("gsl")
require("../gsl_test2.rb")
include GSL::Test
include Math
def test_lmder(fdf, x, xx, f, cov)
s = GSL::MultiFit::FdfSolver.alloc("lmsder", fdf.n, fdf.p)
s.set(fdf, x)
iter = 0
begin
status = s.iterate
for i in 0...fdf.p
test_rel(s.x[i], xx[fdf.p*iter+i], 1e-5, "lmsder, iter=#{iter}, x#{i}")
end
test_rel(Blas.dnrm2(s.f), f[iter], 1e-5, "lmsder, iter=#{iter}, f")
iter += 1
end while iter < 20
covar = s.covar(0.0)
for i in 0...fdf.p
for j in 0...fdf.p
test_rel(covar[i][j], cov[i*fdf.p+j], 1e-7,
"gsl_multifit_covar cov(#{i},#{j})")
end
end
end
def test_fdf(name, fdf, x, x_final, f_sumsq, sigma)
s = GSL::MultiFit::FdfSolver.alloc("lmsder", fdf.n, fdf.p)
s.set(fdf, x)
iter = 0
begin
status = s.iterate
# status = GSL::MultiFit::test_delta(s.dx, s.x, 0.0, 1e-7)
status = s.test_delta(0.0, 1e-7)
iter += 1
end while status == GSL::CONTINUE and iter < 1000
covar = s.covar(0.0)
for i in 0...fdf.p
test_rel(s.x[i], x_final[i], 1e-5, "#{name}, lmsder, x#{i}")
end
s2 = pow(Blas.dnrm2(s.f), 2.0)
test_rel(s2, f_sumsq, 1e-5, "#{name}, lmsder, |f|^2")
for i in 0...fdf.p
ei = sqrt(s2/(fdf.n-fdf.p))*sqrt(covar[i][i]);
test_rel(ei, sigma[i], 1e-4, "#{name}, sigma(#{i})")
end
end
GSL::IEEE::env_setup()
syntax highlighted by Code2HTML, v. 0.9.1