diff --git a/svdfit.pl b/svdfit.pl new file mode 100644 --- /dev/null +++ b/svdfit.pl @@ -0,0 +1,68 @@ +#====================================================================== +# . / S V D F I T . P L +# doc: Sat Jul 31 22:09:25 1999 +# dlm: Sat Jul 31 22:45:40 1999 +# (c) 1999 A.M. Thurnherr +# uE-Info: 61 36 NIL 0 0 72 2 2 4 ofnI +#====================================================================== + +# SVDFIT routine from Numerical Recipes adapted to ANTS + +# HISTORY: +# Jul 31, 1999: - manually converted from c-source + +# Notes: +# - x,y,sig are field numbers for data in $ants_ +# - if sig is a negative number, -sig is used as constant input stddev +# - @a, @u, @v, @w, &funcs passed as refs +# - chi square is returned + +require "$ANTS/nrutil.pl"; +require "$ANTS/svbksb.pl"; +require "$ANTS/svdcmp.pl"; + +{ # BEGIN static scope + +my($TOL) = 1.0e-5; + +sub svdfit($$$$$$$$) +{ + my($xfnr,$yfnr,$sig,$aR,$uR,$vR,$wR,$funcsR) = @_; + my($j,$i); # int + my($chisq,$wmax,$tmp,$thresh,$sum); # float + my(@b,@afunc); # float[] + + &vector(\@b,1,$#ants_); + &vector(\@afunc,1,$#{$aR}); + for ($i=0; $i<=$#ants_; $i++) { + next if ($antsFlagged[$i]); + &$funcsR($ants_[$i][$xfnr],\@afunc); + $tmp = 1.0 / (($sig > 0) ? $ants_[$i][$sig] : -$sig); + for ($j=1; $j<=$#{$aR}; $j++) { + $uR->[$i][$j] = $afunc[$j]*$tmp; + } + $b[$i] = $ants_[$i][$yfnr]*$tmp; + } + &svdcmp($uR,$wR,$vR); + for ($j=1; $j<=$#{$aR}; $j++) { + $wmax = $wR->[$j] if ($wR->[$j] > $wmax); + } + $thresh = $TOL*$wmax; + for ($j=1; $j<=$#{$aR}; $j++) { + $wR->[$j] = 0 if ($wR->[$j] < $thresh); + } + &svbksb($uR,$wR,$vR,\@b,$aR); + for ($i=0; $i<=$#ants_; $i++) { + next if ($antsFlagged[$i]); + &$funcsR($ants_[$i][$xfnr],\@afunc); + for ($j=1; $j<=$#{$aR}; $j++) { + $sum += $aR->[$j]*$afunc[$j]; + } + $tmp = ($ants_[$i][$yfnr] - $sum) / + (($sig > 0) ? $ants_[$i][$sig] : -$sig); + $chisq += $tmp * $tmp; + } + return $chisq; +} + +} # END static scope