polint.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
#                    P O L I N T . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Thu Nov 23 20:38:46 2000
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    dlm: Tue Aug  5 14:06:31 2008
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 2000 A.M. Thurnherr
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    uE-Info: 17 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
# 2nd edition NR polint.c 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
#	Nov 23, 2000: - created for [.interp.poly]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#	Jan 12, 2006: - BUG: higher-order polynomials could not be used
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#						 to interpolate linear function
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#   Jul  1, 2006: - Version 3.3 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	Jul 28, 2006: - cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#	Aug  5, 2008: - BUG: [.interp.poly] takes data from ref, not @ants_
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
# NOTES:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
#	- &vector()-allocated arrays are numbered from 1
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
#	- (nan,nan) is returned on non-numeric required @ants_ values
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
#	- in contrast to the NR routine, the error value returned is +ve
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
require "$ANTS/nrutil.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
sub polint($$$$$$)								# ($y,$dy) = &polint(...)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
	my($dR,$xf,$xv,$ti,$n,$yf) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
	my($y,$dy);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
	my($i,$m); my($ns) = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
	my($den,$dif,$dift,$ho,$hp,$w);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
	my(@c,@d);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
	for ($i=0; $i<$n; $i++) {					# check for nans
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
		return (nan,nan)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
			unless (numberp($dR->[$ti+$i][$xf]) &&
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
					numberp($dR->[$ti+$i][$yf]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
	$dif = abs($xv - $dR->[$ti][$xf]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
	&vector(\@c,1,$n);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
	&vector(\@d,1,$n);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
	for ($i=1; $i<=$n; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
		$dift = abs($xv - $dR->[$ti+$i-1][$xf]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
		if ($dift < $dif) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
			$ns  = $i;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
			$dif = $dift;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
		$c[$i] = $dR->[$ti+$i-1][$yf];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
		$d[$i] = $dR->[$ti+$i-1][$yf];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
	$y = $dR->[$ti+$ns---1][$yf];				# WHAT A CONSTRUCT :-)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
	for ($m=1; $m<$n; $m++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
		for ($i=1; $i<=$n-$m; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
			$ho  = $dR->[$ti+$i-1][$xf] - $xv;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
			$hp  = $dR->[$ti+$i+$m-1][$xf] - $xv;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
			$w   = $c[$i+1] - $d[$i];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
			$den = $ho - $hp;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
### The following two lines of code are the original, which makes polint
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
### fail when interpolating a linear function with a higher-order polynomial,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
### as is done in [ubtest/resample.TF]. 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
###			croak("$0 (polint.pl): ERROR!") if ($den == 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
###			$den   = $w / $den;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
### The following line of code is the replacement that solves the bug.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
			$den   = $w / $den unless ($den == 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
			$d[$i] = $hp * $den;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
			$c[$i] = $ho * $den;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
		$dy = (2*$ns < ($n-$m)) ? $c[$ns+1] : $d[$ns--];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
		$y += $dy;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
	return ($y,abs($dy));
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
1;