#!/usr/bin/env ruby
#require("gsl")
#require("../gsl_test2.rb")
require("./test_multifit.rb")
include GSL::Test
include Math
Brown_N = 20;
Brown_P = 4;
Brown_X = GSL::Matrix.alloc([24.3485677, 4.71448798, -2.19486633, 2.69405755],
[22.4116222, 3.93075538, -1.42344852, 2.5233557],
[17.88886, 2.9290853, 0.125174936, -3.96823353],
[17.3237176, 2.99606803, 2.03285653, 2.28992327],
[17.0906508, 3.02485425, 0.296995153, 0.0876226126],
[16.578006, 3.1036312, -0.18617941, 0.103262914],
[15.692993, 3.33088442, 0.0706406887, 1.05923955],
[14.3232177, 3.85604218, -2.3762839, -3.09486813],
[14.1279266, 3.97896121, 0.446109351, 1.40023753],
[13.6081961, 4.16435075, -1.51250057, -1.52510626],
[13.4295245, 4.22697223, -0.196985195, 0.532009293],
[13.0176117, 4.3579261, -0.353131208, 0.301377627],
[12.2713535, 4.62398535, -0.00183585584, 0.894170703],
[11.0316144, 5.13967727, -2.38978772, -2.89510064],
[10.8807981, 5.24558004, 0.230495952, 1.27315117],
[10.4029264, 5.41141257, -1.5116632, -1.47615921],
[10.2574435, 5.46211045, -0.299855732, 0.451893162],
[9.87863876, 5.57914292, -0.368885288, 0.358086545],
[9.1894983, 5.82082741, -0.230157969, 0.621476534],
[8.00589008, 6.27788753, -1.46022815, -1.33468082])
Brown_F = GSL::Vector.alloc(
2474.05541,
1924.69004,
1280.63194,
1244.81867,
1190.53739,
1159.34935,
1108.44426,
1090.11073,
1015.92942,
1002.43533,
971.221084,
949.589435,
911.359899,
906.522994,
840.525729,
833.950164,
807.557511,
791.00924,
761.09598,
726.787783)
Brown_cov = GSL::Matrix.alloc(
[ 1.8893186910e-01, -4.7099989571e-02, 5.2154168404e-01, 1.6608168209e-02],
[-4.7099989571e-02, 1.1761534388e-02, -1.2987843074e-01, -4.1615942391e-03],
[ 5.2154168404e-01, -1.2987843074e-01, 1.4653936514e+00, 1.5738321686e-02],
[ 1.6608168209e-02, -4.1615942391e-03, 1.5738321686e-02, 4.2348042340e-02]
)
Brown_x0 = GSL::Vector.alloc(25, 5, -5, -1)
brown_f = Proc.new { |x, t, y, f|
for i in 0...Brown_N
ti = 0.2 * (i + 1);
ui = x[0] + x[1] * ti - exp(ti);
vi = x[2] + x[3] * sin(ti) - cos(ti);
f[i] = ui*ui + vi*vi
end
GSL::SUCCESS
}
brown_df = Proc.new { |x, t, y, df|
for i in 0...Brown_N
ti = 0.2 * (i + 1);
ui = x[0] + x[1] * ti - exp(ti);
vi = x[2] + x[3] * sin(ti) - cos(ti);
df.set(i, 0, 2.0*ui)
df.set(i, 1, 2.0*ui*ti)
df.set(i, 2, 2.0*vi)
df.set(i, 3, 2.0*vi*sin(ti))
end
GSL::SUCCESS
}
fdf = GSL::MultiFit::Function_fdf.alloc(brown_f, brown_df, Brown_P)
fdf.set_data(GSL::Vector.alloc(Brown_N), GSL::Vector.alloc(Brown_N))
test_lmder(fdf, Brown_x0, Brown_X.vector_view, Brown_F, Brown_cov.vector_view)
syntax highlighted by Code2HTML, v. 0.9.1