svdfit.pl
author Andreas Thurnherr <ant@ldeo.columbia.edu>
Mon, 13 Apr 2020 11:06:22 -0400
changeset 40 c1803ae2540f
parent 0 a5233793bf69
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#                    . / S V D F I T . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Sat Jul 31 22:09:25 1999
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    dlm: Sat Jul 31 22:45:40 1999
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 1999 A.M. Thurnherr
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    uE-Info: 61 36 NIL 0 0 72 2 2 4 ofnI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
# SVDFIT routine from Numerical Recipes adapted to ANTS
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#	Jul 31, 1999: - manually converted from c-source
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
# Notes:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#   - x,y,sig are field numbers for data in $ants_
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#   - if sig is a negative number, -sig is used as constant input stddev
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#   - @a, @u, @v, @w, &funcs passed as refs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
#	- chi square is returned
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
require "$ANTS/nrutil.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
require "$ANTS/svbksb.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
require "$ANTS/svdcmp.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
{ # BEGIN static scope
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
my($TOL) = 1.0e-5;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
sub svdfit($$$$$$$$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
	my($xfnr,$yfnr,$sig,$aR,$uR,$vR,$wR,$funcsR) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
	my($j,$i);										# int
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
	my($chisq,$wmax,$tmp,$thresh,$sum);					# float
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
	my(@b,@afunc);									# float[]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
	&vector(\@b,1,$#ants_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
	&vector(\@afunc,1,$#{$aR});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
	for ($i=0; $i<=$#ants_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
		next if ($antsFlagged[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
		&$funcsR($ants_[$i][$xfnr],\@afunc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
		$tmp = 1.0 / (($sig > 0) ? $ants_[$i][$sig] : -$sig);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
		for ($j=1; $j<=$#{$aR}; $j++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
			$uR->[$i][$j] = $afunc[$j]*$tmp;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
		$b[$i] = $ants_[$i][$yfnr]*$tmp;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
	&svdcmp($uR,$wR,$vR);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
	for ($j=1; $j<=$#{$aR}; $j++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
		$wmax = $wR->[$j] if ($wR->[$j] > $wmax);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
	$thresh = $TOL*$wmax;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
	for ($j=1; $j<=$#{$aR}; $j++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
		$wR->[$j] = 0 if ($wR->[$j] < $thresh);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
	&svbksb($uR,$wR,$vR,\@b,$aR);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
	for ($i=0; $i<=$#ants_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
		next if ($antsFlagged[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
		&$funcsR($ants_[$i][$xfnr],\@afunc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
		for ($j=1; $j<=$#{$aR}; $j++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
			$sum += $aR->[$j]*$afunc[$j];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
		$tmp = ($ants_[$i][$yfnr] - $sum) /
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
				(($sig > 0) ? $ants_[$i][$sig] : -$sig);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
		$chisq += $tmp * $tmp;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
	return $chisq;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
} # END static scope