.lmfit.sqrt
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 . S Q R T 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Fri Oct 10 15:50:42 2014
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    dlm: Sat Oct 11 09:30:48 2014
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 2014 A.M. Thurnherr
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    uE-Info: 27 32 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 square root A[1]*sqrt(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 may be important
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
#	Oct 10, 2014: - created from [.lmfit.exp]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#	Oct 11, 2014: - made it work
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
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
# THE FOLLOWING VARIABLES MUST BE SET GLOBALLY (i.e. during loading)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
#	$modelOpts			string of allowed options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
#	$modelOptsUsage		usage information string for options
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#	$modelMinArgs		min # of arguments of model
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
#	$modelArgsUsage		usage information string for arguments
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
# The following variables may be set later but not after &modelInit()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#	$modelNFit			number of params to fit in model
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
#	@nameA				symbolic names of model parameters
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
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
$modelOpts = "";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
$modelOptsUsage = "";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
$modelMinArgs = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
$modelArgsUsage = "[scale guess]";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
$modelNFit = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
$nameA[1] = "scale";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
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
# &modelUsage()		mangle parameters; NB: there may be `infinite' # of
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
#					filenames after model arguments; this usually sets
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
#					@A (the model parameters) but these can later be
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
#					calculated heuristically during &modelInit()
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
sub modelUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
	$A[1] = nan; 			
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
	$A[1] = &antsFloatArg() if ($#ARGV >= 0 && ! -r $ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
	&antsUsageError() unless ($#ARGV < 0 || -r $ARGV[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
# &modelInit()		initializes model after reading of data
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
sub modelInit()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
	$A[1] = 1 unless (numberp($A[1]));		# scale
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
}
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
# &modelEvaluate(x,A,dyda)	evaluate polynom and derivatives
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
#		x					x value (NOT xfnr)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
#		A					reference to @A
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
#		dyda				reference to array for partial derivatives
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
#							(wrt individaul params in @A)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
#		<ret val>			y value
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
sub modelEvaluate($$$)					# y  = A[1]*sqrt(*x)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
{										
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
	my($x,$AR,$dydaR) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
	my($v) = sqrt($x);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
	$dydaR->[1] = $v;					# dy/dA[1] = sqrt(x)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
	return $AR->[1]*$v;
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
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
# &modelCleanup()	cleans up after fitting but before output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
sub modelCleanup()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
}