magladde
magladde

Reputation: 634

python scipy fmin not completing succesfully

I have a function that I am attempting to minimize for multiple values. For some values it terminates successfully however for others the error

Warning: Maximum number of function evaluations has been exceeded.

Is the error that is given. I am unsure of the role of maxiter and maxfun and how to increase or decrease these in order to successfully get to the minimum. My understanding is that these values are optional so I am unsure of what the default values are.

# create starting parameters, parameters equal to sin(x)
a = 1
k = 0
h = 0
wave_params = [a, k, h]

def wave_func(func_params):
    """This function calculates the difference between a sinewave (sin(x)) and raw_data (different sin wave)
    This is the function that will be minimized by modulating a, b, k, and h parameters in order to minimize
    the difference between curves."""
    a = func_params[0]
    b = 1
    k = func_params[1]
    h = func_params[2]

    y_wave = a * np.sin((x_vals-h)/b) + k
    error = np.sum((y_wave - raw_data) * (y_wave - raw_data))

    return error

wave_optimized = scipy.optimize.fmin(wave_func, wave_params)

Upvotes: 1

Views: 853

Answers (1)

Adam
Adam

Reputation: 33

You can try using scipy.optimize.minimize with method='Nelder-Mead' https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html.
https://docs.scipy.org/doc/scipy/reference/optimize.minimize-neldermead.html#optimize-minimize-neldermead

Then you can just do

minimum = scipy.optimize.minimize(wave_func, wave_params, method='Nelder-Mead')
n_function_evaluations = minimum.nfev
n_iterations = minimum.nit

or you can customize the search algorithm like this:

minimum = scipy.optimize.minimize(
    wave_func, wave_params, method='Nelder-Mead',
    options={'maxiter': 10000, 'maxfev': 8000}
)

I don't know anything about fmin, but my guess is that it behaves extremely similarly.

Upvotes: 0

Related Questions