gaussj.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
#                    G A U S S J . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Wed Feb 24 17:06:55 1999
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    dlm: Fri Jan  6 10:23:44 2012
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: 46 0 NIL 0 0 72 2 2 4 NIL 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
# GAUSSJ 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
# Notes:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#	- both @A and @B passed by ref
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#	Feb 24, 1999: - apparently created
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	Jul 19, 2001: - apparently fiddled
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#	Jan  6, 2011: - added code to check for numericity of input
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
sub gaussj($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
	my($AR,$BR) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
	my($n) = $#{$AR};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
	my($m) = $#{$BR->[1]};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
	my(@indxc,@indxr,@ipiv);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
	my($i,$icol,$irow,$j,$k,$l,$ll);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
	my($big,$dum,$pivinv);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
	my($temp);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
#	print(STDERR "n = $n, m = $m\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#	for ($i=1; $i<=$n; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#		for ($j=1; $j<=$n; $j++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#			print(STDERR "A[$i][$j] = $AR->[$i][$j]\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
#		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
#	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
	&vector(\@indxc,1,$n);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
	&vector(\@indxr,1,$n);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
	&vector(\@ipiv, 1,$n);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
	for ($j=1; $j<=$n; $j++) { $ipiv[$j] = 0; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
	for ($i=1; $i<=$n; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
		$big = 0.0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
		for ($j=1; $j<=$n; $j++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
			if ($ipiv[$j] != 1) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
				for ($k=1; $k<=$n; $k++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
					if ($ipiv[$k] == 0) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
						croak("GAUSSJ: non-numeric A[$j][$k]\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
							unless numberp($AR->[$j][$k]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
						if (abs($AR->[$j][$k]) >= $big) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
							$big = abs($AR->[$j][$k]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
							$irow = $j;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
							$icol = $k;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
						}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
					} elsif ($ipiv[$k] > 1) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
						croak("GAUSSJ: Singular Matrix-1");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
					}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
		++($ipiv[$icol]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
		if ($irow != $icol) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
			for ($l=1; $l<=$n; $l++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
				$temp = $AR->[$irow][$l];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
				$AR->[$irow][$l] = $AR->[$icol][$l];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
				$AR->[$icol][$l] = $temp;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
			for ($l=1; $l<=$m; $l++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
				croak("GAUSSJ: non-numeric B[$irow][$l]\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
						unless numberp($BR->[$irow][$l]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
				croak("GAUSSJ: non-numeric B[$icol][$l]\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
						unless numberp($BR->[$icol][$l]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
				$temp = $BR->[$irow][$l];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
				$BR->[$irow][$l] = $BR->[$icol][$l];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
				$BR->[$icol][$l] = $temp;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
		$indxr[$i] = $irow;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
		$indxc[$i] = $icol;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
		if ($AR->[$icol][$icol] == 0.0) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
			croak("GAUSSJ: Singular Matrix-2");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
		$pivinv = 1.0/$AR->[$icol][$icol];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
		$AR->[$icol][$icol] = 1.0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
		for ($l=1; $l<=$n; $l++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
			$AR->[$icol][$l] *= $pivinv;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
		for ($l=1; $l<=$m; $l++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
			$BR->[$icol][$l] *= $pivinv;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
		for ($ll=1; $ll<=$n; $ll++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
			if ($ll != $icol) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
				$dum = $AR->[$ll][$icol];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
				$AR->[$ll][$icol] = 0.0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
				for ($l=1; $l<=$n; $l++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
					$AR->[$ll][$l] -= $AR->[$icol][$l]*$dum;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
				for ($l=1; $l<=$m; $l++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
					$BR->[$ll][$l] -= $BR->[$icol][$l]*$dum;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
	for ($l=$n; $l>=1; $l--) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
		if ($indxr[$l] != $indxc[$l]) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
			for ($k=1; $k<=$n; $k++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
				$temp = $AR->[$k][$indxr[$l]];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
				$AR->[$k][$indxr[$l]] = $AR->[$k][$indxc[$l]];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
				$AR->[$k][$indxc[$l]] = $temp;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
1;