|
|
@ -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): |
|
|
|