SciPy TypeError в задаче с ограниченной минимизацией: «отсутствует 5 обязательных позиционных аргументов:» - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь использовать SciPy для минимизации функции:

def effort(e,v1,v2,v3,v4,v5):
    return -e

относительно ограничений (часть кода, в которой ограничения определены, успешно компилируется).

Сама минимизация :

from scipy.optimize import minimize

x0 = np.array([0.5, 1,0,0,0,0])
res = minimize(effort, x0, method='trust-constr',
                constraints=[linear_constraint, nonlinear_constraint],
                options={'verbose': 1}, bounds=bounds)
print(res.x)

В качестве примера я использовал следующий код:

from scipy.optimize import minimize
from scipy.optimize import rosen, rosen_der, rosen_hess, rosen_hess_prod

x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hess=rosen_hess,
                constraints=[linear_constraint, nonlinear_constraint],
                options={'verbose': 1}, bounds=bounds)
print(res.x)

Я получаю следующую ошибку:

TypeError                                 Traceback (most recent call last)
<ipython-input-3-9ebbcf16d7f7> in <module>
      5 res = minimize(effort, x0, method='trust-constr',
      6                 constraints=[linear_constraint, nonlinear_constraint],
----> 7                 options={'verbose': 1}, bounds=bounds)
      8 print(res.x)

/opt/conda/lib/python3.6/site-packages/scipy/optimize/_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    620         return _minimize_trustregion_constr(fun, x0, args, jac, hess, hessp,
    621                                             bounds, constraints,
--> 622                                             callback=callback, **options)
    623     elif meth == 'dogleg':
    624         return _minimize_dogleg(fun, x0, args, jac, hess,

/opt/conda/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py in _minimize_trustregion_constr(fun, x0, args, grad, hess, hessp, bounds, constraints, xtol, gtol, barrier_tol, sparse_jacobian, callback, maxiter, verbose, finite_diff_rel_step, initial_constr_penalty, initial_tr_radius, initial_barrier_parameter, initial_barrier_tolerance, factorization_method, disp)
    330     # Define Objective Function
    331     objective = ScalarFunction(fun, x0, args, grad, hess,
--> 332                                finite_diff_rel_step, finite_diff_bounds)
    333 
    334     # Put constraints in list format when needed

/opt/conda/lib/python3.6/site-packages/scipy/optimize/_differentiable_functions.py in __init__(self, fun, x0, args, grad, hess, finite_diff_rel_step, finite_diff_bounds)
     73 
     74         self._update_fun_impl = update_fun
---> 75         self._update_fun()
     76 
     77         # Gradient evaluation

/opt/conda/lib/python3.6/site-packages/scipy/optimize/_differentiable_functions.py in _update_fun(self)
    162     def _update_fun(self):
    163         if not self.f_updated:
--> 164             self._update_fun_impl()
    165             self.f_updated = True
    166 

/opt/conda/lib/python3.6/site-packages/scipy/optimize/_differentiable_functions.py in update_fun()
     70 
     71         def update_fun():
---> 72             self.f = fun_wrapped(self.x)
     73 
     74         self._update_fun_impl = update_fun

/opt/conda/lib/python3.6/site-packages/scipy/optimize/_differentiable_functions.py in fun_wrapped(x)
     67         def fun_wrapped(x):
     68             self.nfev += 1
---> 69             return fun(x, *args)
     70 
     71         def update_fun():

TypeError: effort() missing 5 required positional arguments: 'v1', 'v2', 'v3', 'v4', and 'v5'

Я уточнил, что effort должен быть записан без аргументов в качестве аргумента minimize.

Также я уточнил, что матрицы Якоби и Гесса являются опциями в качестве аргументов minimize.

Я искал ошибку типа a function missing required positional arguments, но мне не удалось выяснить, почему компиляция не удалась в этом случае. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 27 января 2020

Код для rosen (в примере, с которым вы работаете):

def rosen(x):
    """
    The Rosenbrock function.

    The function computed is::

        sum(100.0*(x[1:] - x[:-1]**2.0)**2.0 + (1 - x[:-1])**2.0)

    Parameters
    ----------
    x : array_like
        1-D array of points at which the Rosenbrock function is to be computed.

    ....
    """
    x = asarray(x)
    r = numpy.sum(100.0 * (x[1:] - x[:-1]**2.0)**2.0 + (1 - x[:-1])**2.0,
                  axis=0)
    return r

Таким образом, хотя x0 = np.array([0.5, 0]) имеет два значения, функция имеет только один позиционный аргумент, x. Внутренне rosen обрабатывает x как массив.

В такой функции, как effort(e,v1,v2,v3,v4,v5), e - это переменная, которая изменяется minimize, а v1,v2,... - дополнительные переменные, которые передаются через args параметр. minimize не меняет тех; это просто «настройки».

...