#!/usr/local/bin/ruby require "GSL" include GSL::Fit # Test Least-Squares Fitting # Usage: # $ ./fit.rb > tmp # $ for n in data fit hi lo; do grep "^$n" tmp | cut -d ':' -f 2 > $n; done # $ graph -TX -X x -Y y -y 0 20 -m 0 -S 2 -Ie data -S 0 -I a -m 1 fit -m 2 hi lo STDERR.puts "Running tests for Least-Squares Fitting..." x = [1970, 1980, 1990, 2000] y = [ 12, 11, 14, 13] w = [ 0.1, 0.2, 0.3, 0.4] res = wlinear(x, w, y) c0 = res[0] c1 = res[1] cov00 = res[2] cov01 = res[3] cov11 = res[4] chisq = res[5] puts "Best fit: Y = %g + %g X" % [c0, c1] puts "Covariance matrix:" puts " [ %g, %g\n %g, %g ]" % [cov00, cov01, cov01, cov11] puts "Chi-squared: #{chisq}" x.each_index do |i| puts "data: #{x[i]} #{y[i]} #{1/Math::sqrt(w[i])}" end (-30).upto(130) do |i| xf = x[0] + (i/100.0) * (x[3]-x[0]) yf, yf_err = linear_est(xf, c0, c1, cov00, cov01, cov11) puts "fit: #{xf} #{yf}" puts "hi: #{xf} #{yf+yf_err}" puts "lo: #{xf} #{yf-yf_err}" end STDERR.puts "\ndone."