.lmfit.exp
author A.M. Thurnherr <athurnherr@yahoo.com>
Sat, 24 Jul 2021 09:38:16 -0400
changeset 46 70e566505a12
parent 39 56bdfe65a697
permissions -rw-r--r--
V7.3
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 . E X P 
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:40:56 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: 30 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 exponential A[3]+A[2]*exp(A[1]*x) to data
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
# NOTES:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
#	- initial parameter estimates are crucial
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#	- there is currently no heuristics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
#	Mar 11, 1999: - created from [./.mfit.poly] & [./.mfit.gauss]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#	Jul 31, 1999: - typecheck usage
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
#	Jan 16, 2006: - added notes
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#	Jul 28, 2006: - Version 3.3 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
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
# THE FOLLOWING VARIABLES MUST BE SET GLOBALLY (i.e. during loading)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
#	$modelOpts			string of allowed options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
#	$modelOptsUsage		usage information string for options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#	$modelMinArgs		min # of arguments of model
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#	$modelArgsUsage		usage information string for arguments
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
# The following variables may be set later but not after &modelInit()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#	$modelNFit			number of params to fit in model
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#	@nameA				symbolic names of model parameters
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
$modelOpts = "";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
$modelOptsUsage = "";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
$modelMinArgs = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
$modelArgsUsage = "[exp [mul [add guess]]]";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
$modelNFit = 3;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
$nameA[1] = "exp";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
$nameA[2] = "mul";		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
$nameA[3] = "add";	
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
# &modelUsage()		mangle parameters; NB: there may be `infinite' # of
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
#					filenames after model arguments; this usually sets
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
#					@A (the model parameters) but these can later be
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
#					calculated heuristically during &modelInit()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
sub modelUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
	$A[1] = nan; $A[2] = nan; $A[3] = nan;				# usage
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
	$A[1] = &antsFloatArg() if ($#ARGV >= 0 && ! -r $ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
	$A[2] = &antsFloatArg() if ($#ARGV >= 0 && ! -r $ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
	$A[3] = &antsFloatArg() if ($#ARGV >= 0 && ! -r $ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
	&antsUsageError() unless ($#ARGV < 0 || -r $ARGV[0]);
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
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
# &modelInit()		initializes model after reading of data
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
#
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
sub modelInit()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
	$A[1] = 1 unless (numberp($A[1]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
	$A[2] = 1 unless (numberp($A[2]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
	$A[3] = 0 unless (numberp($A[3]));
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
# &modelEvaluate(x,A,dyda)	evaluate polynom and derivatives
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
#		x					x value (NOT xfnr)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
#		A					reference to @A
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
#		dyda				reference to array for partial derivatives
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
#							(wrt individaul params in @A)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
#		<ret val>			y value
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
sub modelEvaluate($$$)					# y = A[3]+A[2]*exp(A[1]*x)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
	my($x,$AR,$dydaR) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
	my($e) = exp($AR->[1]*$x);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
	$dydaR->[1] = $AR->[2]*$x*$e;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
	$dydaR->[2] = $e;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
	$dydaR->[3] = 1;					# partial derivatives
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
	return $AR->[3] + $AR->[2]*$e;
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
# &modelCleanup()	cleans up after fitting but before output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
sub modelCleanup()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
}