.lmfit.poly
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 M F I T . P O L Y 
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:35:50 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: 28 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
# 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 model function which is to be fitted using
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#	  a number of pararams which are all stored in @A (beginning at
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#	  A[1]!!!). You also need to return the partial derivatives of
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	  the model function wrt all params.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#	- the interface is documented between +++++++ lines
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
# fit polynomial (sum of A_i x^i) to data
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
# NB:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#	Feb 25, 1999: - created
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
#	Mar 14, 1999: - cosmetic changes
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
#	Jul 31, 1999: - argument typechecking
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
#   Mar 17, 2001: - param->arg
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#	Jan 12, 2006: - specify order with -o as in [.lsfit.poly]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
#	Jul 28, 2006: - Version 3.3 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
# THE FOLLOWING VARIABLES MUST BE SET GLOBALLY (i.e. during loading)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
#	$modelOpts			string of allowed options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#	$modelOptsUsage		usage information string for options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
#	$modelMinArgs		min # of arguments of model
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
#	$modelArgsUsage		usage information string for arguments
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
# The following variables may be set later but not after &modelInit()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
#	$modelNFit			number of params to fit in model
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#	@nameA				symbolic names of model parameters
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
$modelOpts = "o:";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
$modelOptsUsage = "-o)rder <n>";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
$modelMinArgs = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
$modelArgsUsage = "[c0 [c1 [...]]]";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
&antsInfo("non-linear method deprecated; use `lsfit' instead");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
# &modelUsage()		mangle parameters; NB: there may be `infinite' # of
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
#					filenames after model arguments; this usually sets
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
#					@A (the model parameters) but these can later be
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
#					calculated heuristically during &modelInit()
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
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
sub modelUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
	my($c);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
	die("$0 (.lmfit.poly): ERROR! -o required\n")	# order of polynomial
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
		unless (defined($opt_o) && $opt_o >= 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
	$modelNFit = &antsCardOpt($opt_o)+1;			
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
	for ($c=0; $c<$modelNFit; $c++) {				# init coefficients
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
		if ($#ARGV >= 0 && ! -r $ARGV[0]) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
			$A[$c+1] = &antsFloatArg();
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
			$A[$c+1] = nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
		$nameA[$c+1] = "c$c";						# and names
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
	&antsUsageError() unless ($#ARGV < 0 || -r $ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
# &modelInit()		initializes model after reading of data
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
sub modelInit()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
	my($c);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
	for ($c=0; $c<$modelNFit; $c++) {				# init coefficients
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
		$A[$c+1] = 10**-$c unless (numberp($A[$c+1]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
	}
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
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
# &modelEvaluate(x,A,dyda)	evaluate polynomial and derivatives
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
#		x					x value (NOT xfnr)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
#		A					reference to @A
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
#		dyda				reference to array for partial derivatives
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
#							(wrt individaul params in @A)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
#		<ret val>			y value
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
sub modelEvaluate($$$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
	my($x,$AR,$dydaR) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
	my($i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
	my($pow) = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
	my($y) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
	for ($i=1; $i<=$modelNFit; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
		$y += $AR->[$i]*$pow;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
		$dydaR->[$i] = $pow;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
		$pow *= $x;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
	return $y;
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
}