On 02/17/2014 08:23 PM, "André Walker-Loud <walksl...@gmail.com>" wrote:
Hello python tutors,

I am utilizing a 3rd party numerical minimization routine.  This routine 
requires an input function, which takes as arguments, only the variables with 
which to solve for.  But I don’t want to define all possible input functions, 
in a giant switch, but rather, if I know I am fitting a polynomial, I would 
like to just pass a list of parameters and have the code know how to construct 
this function.

To construct for example, a chisq function, you must pass not only the 
variables to solve for, but also the data, uncertainties, and perhaps other 
arguments.  So it requires a little hacking to get it to work.  With the help 
of my friends and looking at similar code, I have come up with two ways that 
work under my simple test cases, and I have a few questions about them.

The 3rd party minimizer utilizes the .func_code.co_varnames and 
.func_code.co_argcount to determine the name and number of variables to 
minimize.  eg.

g = lambda x,c_0,c_1: c_0 + c_1 * x
g.func_code.co_varnames
('x', 'c_0', 'c_1’)
g.func_code.co_argcount
3

so what is needed is a function
def f(c_0,c_1):
…#construct chi_sq(c_0,c_1,x,y,…)

What prevents you to make a simple function factory (see example below) is that the 3rd party module needs to use func_code.co_varnames & func_code.co_argcount, right? If yes, it is indeed annoying... and I have no good solution.

# func factory example:
def poly (*coefs):
    # coefs are here in reverse order for simplicity
    # but we could iterate backward below
    n = len(coefs)
    def f (x):
        y = 0
        for i in range(n):
            y += coefs[i] * x**i
        return y
    return f

# y = 3 + 2*x + 1*x^2
poly3 = poly(3,2,1)
print(poly3(1)) # 6
print(poly3(2)) # 11
print(poly3(3)) # 18

d
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to