* wpylib.math.fitting.fit_func: Added optional Funct_hook argument to
be called (for debugging purposes) every time "the" Funct function is called.
This commit is contained in:
@@ -124,6 +124,7 @@ class fit_result(result_base):
|
|||||||
def fit_func(Funct, Data=None, Guess=None, x=None, y=None,
|
def fit_func(Funct, Data=None, Guess=None, x=None, y=None,
|
||||||
debug=0,
|
debug=0,
|
||||||
outfmt=1,
|
outfmt=1,
|
||||||
|
Funct_hook=None,
|
||||||
method='leastsq', opts={}):
|
method='leastsq', opts={}):
|
||||||
"""
|
"""
|
||||||
Performs a function fitting.
|
Performs a function fitting.
|
||||||
@@ -156,6 +157,15 @@ def fit_func(Funct, Data=None, Guess=None, x=None, y=None,
|
|||||||
* via Data argument (which is a multi-column dataset, where the first row
|
* via Data argument (which is a multi-column dataset, where the first row
|
||||||
is the "y" argument).
|
is the "y" argument).
|
||||||
|
|
||||||
|
Debugging and other investigations can be done with Funct_hook, which,
|
||||||
|
if defined, will be called every time right after Funct is called.
|
||||||
|
It is called with the following parameters:
|
||||||
|
Funct_hook(C, x, y, f, r)
|
||||||
|
where
|
||||||
|
f := f(C,x)
|
||||||
|
r := f(C,x) - y
|
||||||
|
Note that the reference to the hook object is passed as the first argument
|
||||||
|
to facilitate object oriented programming.
|
||||||
"""
|
"""
|
||||||
global last_fit_rslt, last_chi_sqr
|
global last_fit_rslt, last_chi_sqr
|
||||||
from scipy.optimize import fmin, fmin_bfgs, leastsq, anneal
|
from scipy.optimize import fmin, fmin_bfgs, leastsq, anneal
|
||||||
@@ -173,13 +183,22 @@ def fit_func(Funct, Data=None, Guess=None, x=None, y=None,
|
|||||||
elif Guess == None: # VERY OLD, DO NOT USE ANYMORE!
|
elif Guess == None: # VERY OLD, DO NOT USE ANYMORE!
|
||||||
Guess = [ y.mean() ] + [0.0, 0.0] * len(x)
|
Guess = [ y.mean() ] + [0.0, 0.0] * len(x)
|
||||||
|
|
||||||
if debug < 20:
|
if Funct_hook != None:
|
||||||
fun_err = lambda CC, xx, yy: abs(Funct(CC,xx) - yy)
|
if not hasattr(Funct_hook, "__call__"):
|
||||||
|
raise TypeError, "Funct_hook argument must be a callable function."
|
||||||
|
def fun_err(CC, xx, yy):
|
||||||
|
ff = Funct(CC,xx)
|
||||||
|
r = (ff - yy)
|
||||||
|
Funct_hook(CC, xx, yy, ff, r)
|
||||||
|
return r
|
||||||
|
fun_err2 = lambda CC, xx, yy: numpy.sum(abs(fun_err(CC, xx, yy))**2)
|
||||||
|
elif debug < 20:
|
||||||
|
fun_err = lambda CC, xx, yy: (Funct(CC,xx) - yy)
|
||||||
fun_err2 = lambda CC, xx, yy: numpy.sum(abs(Funct(CC,xx) - yy)**2)
|
fun_err2 = lambda CC, xx, yy: numpy.sum(abs(Funct(CC,xx) - yy)**2)
|
||||||
else:
|
else:
|
||||||
def fun_err(CC, xx, yy):
|
def fun_err(CC, xx, yy):
|
||||||
ff = Funct(CC,xx)
|
ff = Funct(CC,xx)
|
||||||
r = abs(ff - yy)
|
r = (ff - yy)
|
||||||
print " err: %s << %s << %s, %s" % (r, ff, CC, xx)
|
print " err: %s << %s << %s, %s" % (r, ff, CC, xx)
|
||||||
return r
|
return r
|
||||||
def fun_err2(CC, xx, yy):
|
def fun_err2(CC, xx, yy):
|
||||||
|
|||||||
Reference in New Issue
Block a user