How to minimize a function with parameters in Python?

I have the following function f, where the parameters a, b, and c are used in the calculation but are not explicitly passed as arguments:

a = #some_value
b = #some_value
c = #some_value
def f(x):
    """Evaluates some function that depends on parameters a, b, and c"""
    someNumber = #some calculation using a, b, c
    return someNumber

Ideally, I would define the function as def f(x, a, b, c), but SciPy’s optimization toolbox doesn’t allow for minimizing functions with parameters in the argument list. Since I need to minimize f with respect to x and run it for multiple values of a, b, and c, is there a way to minimize Python functions that depend on parameters and optimize over x while varying a, b, and c?

You can use functools.partial to create a new function where the parameters a, b, and c are fixed, and only x remains variable for minimization.

from scipy.optimize import minimize
from functools import partial

# Define the function with parameters
a = 1
b = 2
c = 3
def f(x, a, b, c):
    """Evaluates some function that depends on parameters a, b, and c"""
    return (x - a)**2 + (x - b)**2 + (x - c)**2

# Create a partial function with fixed parameters a, b, and c
f_partial = partial(f, a=a, b=b, c=c)

# Now minimize with respect to x
result = minimize(f_partial, x0=0)
print(result)

This solution binds the parameters and allows minimize to optimize f with respect to x while keeping the other parameters constant.

You can use a lambda function to pass the parameters and keep the minimize function signature consistent with how it expects a function that only takes x as an argument.

from scipy.optimize import minimize

# Define the function with parameters
a = 1
b = 2
c = 3
def f(x, a, b, c):
"""Evaluates some function that depends on parameters a, b, and c"""
return (x - a)**2 + (x - b)**2 + (x - c)**2

# Minimize using a lambda function to pass parameters
result = minimize(lambda x: f(x, a, b, c), x0=0)
print(result)

This approach allows you to minimize with respect to x and still pass in parameters a, b, and c dynamically.

You can define a wrapper function that includes the parameters and calls your original function, then pass that to minimize.

from scipy.optimize import minimize

# Define the function with parameters
a = 1
b = 2
c = 3
def f(x, a, b, c):
    """Evaluates some function that depends on parameters a, b, and c"""
    return (x - a)**2 + (x - b)**2 + (x - c)**2

# Wrapper function to minimize f with fixed parameters
def wrapped_f(x):
    return f(x, a, b, c)

# Now minimize with respect to x using the wrapper
result = minimize(wrapped_f, x0=0)
print(result)

In this case, the wrapper function wrapped_f keeps the parameters fixed, and minimize optimizes only over x.