2016-05-05 4 views
1

Я работаю с scipy.optimize.minimize, и я оптимизацией 3 параметров с функцией как этогоscipy.optimize.minimize отслеживать целевую функцию

def foo(A,x,y,z):

test = my_function(A[0],A[1],A[2],x,y,z) 

    return test 

В этом ответе я финансировать некоторое представление How to display progress of scipy.optimize function? поэтому я вышел с этой функцией:

def callbackF(Xi,x,y,z)

global Nfeval

print '{0:4d} {1: 3.6f} {2: 3.6f} {3: 3.6f} {4: 3.6f}'.format(Nfeval, Xi[0], Xi[1], Xi[2], foo(Xi , x,y,z))

Nfeval += 1

так что мой код будет выглядеть следующим образом

Optimal = minimize(fun=foo, x0=[fi, alfa, Ks ] , args=(x,y,z), method='BFGS', callback=callbackF , tol=1e-2)

, но я получаю эту ошибку:

TypeError: callbackF() takes exactly 4 arguments (1 given)

Я понимаю ошибку, но как я должен избежать?

ответ

1

Вы всегда можете сделать это, если сможете самостоятельно выполнить функцию. Единственный сложный бит - это счетчик итераций. Для этого вы можете либо использовать глобальный, либо (ИМО, лучше) присоединить счетчик к самой функции:

>>> import numpy as np 
>>> from scipy.optimize import minimize 
>>> 
>>> def f(x): 
...  res = np.sum(x**2) 
...  f.count += 1 
...  print('x = ', x, ' res = ', res, ' j = ', f.count) 
...  return res 
... 
>>> f.count = 0 
>>> minimize(f, x0=5) 
x = [ 5.] res = 25.0 j = 1 
x = [ 5.00000001] res = 25.000000149 j = 2 
x = [ 5.] res = 25.0 j = 3 
x = [-5.] res = 25.0 j = 4 
x = [-5.] res = 25.0 j = 5 
x = [-4.99999999] res = 24.999999851 j = 6 
x = [ 0.0005] res = 2.5e-07 j = 7 
x = [ 0.0005] res = 2.5e-07 j = 8 
x = [ 0.00050001] res = 2.50014901383e-07 j = 9 
x = [ -7.45132485e-09] res = 5.55222420558e-17 j = 10 
x = [ -7.45132485e-09] res = 5.55222420558e-17 j = 11 
x = [ 7.44983634e-09] res = 5.55000615146e-17 j = 12 
     fun: 5.552224205575604e-17 
hess_inv: array([[ 0.5]]) 
     jac: array([ -1.48851092e-12]) 
    message: 'Optimization terminated successfully.' 
    nfev: 12 
     nit: 2 
    njev: 4 
    status: 0 
    success: True 
     x: array([ -7.45132485e-09]) 
Смежные вопросы