Gabriel Das Neves
Gabriel Das Neves

Reputation: 13

Minimizing function with 2 arguments

I'm trying to minimize a function with 2 arguments:

def c_Gamma_gamma_fv(cf, cv):
    return np.abs((4 * eta_gamma * charges**2 * a_q * cf).sum() + 4.* cf *a_tau/3. + a_w * cv)**2/Gamma_gamma

def mu_fv(cf, cv):
    return np.array([cf**4, cf**2 * cv**2, cf**2 * 
c_Gamma_gamma_fv(cf, cv), cv**2 * c_Gamma_gamma_fv(cf, cv), cf**4, cv**2 * cf**2, cf**2 * cv**2,
                 cv**4, cv**2 * cf**2, cv**4])

def chi_square_fv(cf, cv):
    return ((mu_fv(cf, cv) - mu_data) @ inv_cov @ (mu_fv(cf, cv) - mu_data))

x0 = [1., 1.]
res_fv = minimize(chi_square_fv, x0)

but, I'm getting the error "TypeError: chi_square_fv() missing 1 required positional argument: 'cv'". But, when I do the following:

print(chi_square_fv(1.,1.))

I get the output

38.8312698786

I'm not understanding this and I'm new to this type of procedure. How do I proceed? OBS: Gamma_gamma is just a constant of the code.

Upvotes: 1

Views: 279

Answers (2)

Yilun Zhang
Yilun Zhang

Reputation: 9018

Since you didn't provide us with all the variable values in your code, I would have to guess.

I think the problem is about how you pass in the parameters. x0 = [1.,1.] specifies x0 as a list with 2 values, which is ONE entity. However, in your chi_square_fv, the inputs are two separate values rather than a list.

You can try to change your chi_square_fv function:

def chi_square_fv(clist):
    cf, cv = clist
    return ((mu_fv(cf, cv) - mu_data) @ inv_cov @ (mu_fv(cf, cv) - mu_data))

Upvotes: 1

vittore
vittore

Reputation: 17589

If you read docs on minimize you will find optional args argument ( and also see @sacha's comment )

So since your function of two arguments and you want to minimize it across one of them you need to pass values for other's

minimize(chi_square_fv, x0, args=(cv,))

Which will pass some cv value as second parameter to the function chi_square_fv

Upvotes: 0

Related Questions