.interp.linear.orig
author Andreas Thurnherr <ant@ldeo.columbia.edu>
Mon, 13 Apr 2020 11:06:22 -0400
changeset 40 c1803ae2540f
parent 39 56bdfe65a697
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#                    . I N T E R P . L I N E A R 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Wed Nov 22 21:01:09 2000
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    dlm: Fri Sep 23 16:32:20 2011
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: 62 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
# linear interpolation
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 22, 2000: - created
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#	Jul 28, 2006: - Version 3.3 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#				  - added xf to ISInit() args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#	Aug 22, 2006: - modified to allow use with [match]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	Aug  5, 2008: - added idr param to IS_init()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#	Sep 23, 2011: - added support for xfnr==-1 (%RECNO)
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
#	- the [.interp.*] routines assume that x increases strictly monotonically;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
#	  for utilities dealing with non-monotonic data, use [.nminterp.*] instead
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
#	- the [.interp.*] routines are written to work on multiple buffers,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#	  rather than just @ants_; this implies that data created by IS_init()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
#	  must be stored separately for each buffer
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
# THE FOLLOWING VARIABLES MUST BE SET GLOBALLY (i.e. during loading)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#	$IS_opts			string of allowed options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#	$IS_optsUsage		usage information string for options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#
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
$IS_opts = "";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
$IS_optsUsage = "";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
# &IS_usage() 	mangle parameters (options, really)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
sub IS_usage() {}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
# &IS_init(br,f,xf)			init interpolation of field f
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
#		br					data buffer reference
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
#		idr					init-data reference
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
#       f					field number
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
#		xf					x field number or -1 for %RECNO
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
#       <ret val>           none
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
#
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
sub IS_init($$$$) {}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
# &IS_interpolate(bR,idR,xf,xv,xi,f)	interpolate field f
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
#		bR							data buffer reference
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
#		idR							init-data reference
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
#		xf							x field or -1 for %RECNO
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
#		xv							x value
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
#		xi							index of last record with x-value <= x
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
#		f							field number to interpolate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
#		<ret val>					interpolated value
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
# NB:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
#	- handle f == xf
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
#	- return NaN if any of the y values required is NaN
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
#
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
sub IS_interpolate($$$$$$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
	my($bR,$idR,$xf,$xv,$xi,$f) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
	return $xv if ($xf == $f);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
	return nan unless (numberp($bR->[$xi][$f]) && numberp($bR->[$xi+1][$f]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
	my($sc) = ($xf < 0)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
			? ($xv - $bR->[$xi][$xf]) / ($bR->[$xi+1][$xf] - $bR->[$xi][$xf]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
			: ($xv - $bR->[$xi][$xf]) / ($bR->[$xi+1][$xf] - $bR->[$xi][$xf]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
	return $bR->[$xi][$f] + $sc * ($bR->[$xi+1][$f] - $bR->[$xi][$f]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
1;