.lsfit.bilin
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
#                    . L S F I T . B I L I N 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Wed Feb 24 09:40:06 1999
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    dlm: Fri Jul 28 13:36:36 2006
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: 32 41 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
# What you need to provide if you wanna fit a different
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
# linear model function to your data:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
#	- a number of global variables to be set during loading
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#	- a number of subs to perform admin tasks (usage, init, ...)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#	- a sub to evaluate the basis funs at a given x value; each
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#	  y value must be stored in @A (beginning with
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#	  A[1]!!!).
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	- the interface is documented between +++++++ lines
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
# fit bi-linear function to data, i.e. y = A + B*x1 + C*x2
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
#	Aug 01, 1999: - adapted from [.lsfit.poly]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
#	Aug 02, 1999: - added &antsDescription()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#	Sep 26, 1999: - cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
#				  - added vars & covars
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
#	Sep 27, 1999: - changed from covar to sigmas
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
#	Oct 01, 1999: - cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#	Oct 06, 1999: - added -l
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
#   Mar 17, 2001: - param->arg
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
#	May  2, 2001: - updated doc
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#	Nov 17, 2005: - commented out antsDescription()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#				  - updated stats on -p
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#	Jul 28, 2006: - Version 3.3 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
# NOTES:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#	- could be easily extended to multidimensional linear fit but
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
#	  what's the use?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
#	- -p zeroes param C for bilinear spice method (T = A + B*sig + C*neph)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#	  so that residual field becomes spice anomaly (linearly correlated
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#	  with neph)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
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
# THE FOLLOWING VARIABLES MUST BE SET GLOBALLY (i.e. during loading)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
#	$modelOpts			string of allowed options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
#	$modelOptsUsage		usage information string for options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
#	$modelMinArgs		min # of arguments of model
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
#	$modelArgsUsage		usage information string for arguments
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
# The following variables may be set later but not after &modelInit()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
#	$modelNFit			number of params to fit in model
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
#	@nameA				symbolic names of model parameters
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
# You should call &antsDescription() for the -ct options here
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
$modelOpts = "pl:";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
$modelOptsUsage = "[-p)artial f/r] [-l)imit r_BC <min,max>]";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
$modelMinArgs = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
$modelArgsUsage = "<2nd x-field>";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
$modelNFit = 3;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
$nameA[1] = "A"; $nameA[2] = "B"; $nameA[3] = "C";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
$A[1] = nan; $A[2] = nan; $A[3] = nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
#&antsDescription("c","bilin_$nameA[1]",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
#				 "c","bilin_$nameA[2]",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
#				 "c","bilin_$nameA[3]");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
#&antsDescription("t","bilin_sigma_$nameA[1]",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
#				 "t","bilin_sigma_$nameA[2]",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
#				 "t","bilin_sigma_$nameA[3]",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
#				 "t","bilin_ccc_$nameA[1]_$nameA[2]",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
#				 "t","bilin_ccc_$nameA[1]_$nameA[3]",
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
#				 "t","bilin_ccc_$nameA[2]_$nameA[3]");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
# &modelUsage()		mangle parameters; NB: there may be `infinite' # of
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
#					filenames after model arguments; this usually sets
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
#					@A (the model parameters) but these can later be
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
#					calculated heuristically during &modelInit()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
sub modelUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
	if (defined($opt_l)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
		($minBC,$maxBC) = split(',',$opt_l);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
		&antsUsageError("\n>>> error with -l")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
			unless (defined($maxBC) && $maxBC > $minBC);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
	$x2fnr = &antsFieldArg();
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
	&antsUsageError() unless ($#ARGV < 0 || -r $ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
# &modelInit()		initializes model after reading of data
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
sub modelInit() {}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
# &modelEvaluate(idx,xfnr,vals)	evaluate basis funs at x (NB: x1, x2)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
#		idx				       	current index in @ants_
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
#		xfnr					field number of x field
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
#		vals					reference to return values (1-relative!)
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
sub modelEvaluate($$$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
	my($idx,$xfnr,$valsR) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
	my($i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
	$valsR->[1] = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
	$valsR->[2] = $ants_[$idx][$xfnr];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
	$valsR->[3] = $ants_[$idx][$x2fnr];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
# &modelCleanup()	cleans up after fitting but before output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
sub modelCleanup() 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
	if (defined($opt_l)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
		my($ccc) = $covar[2][3]/(sqrt($covar[2][2])*sqrt($covar[3][3]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
		if ($ccc < $minBC || $ccc > $maxBC) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
			&antsInfo("CCC B/C = %.3g out of range, fit discarded",$ccc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
			$suppressFit = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
	if ($opt_p) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   137
		&antsInfo("parameter $nameA[3] = %.3g discarded",$A[3]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
		$A[3] = 'discarded';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
		$covar[3][3] = $RMS = $sig = nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   141
}