2016-05-05 11 views
1

Ich bin mit scipy.optimize.minimize zu arbeiten, und ich bin zu optimieren 3 Parameter mit einer Funktion wie diesescipy.optimize.minimize Spur der objektiven Funktion halten

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

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

    return test 

In dieser Antwort finanziere ich einen kleinen Einblick How to display progress of scipy.optimize function? so kam ich mit dieser Funktion aus:

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

so wird mein Code aussehen diese

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

aber ich bekomme diese Fehlermeldung:

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

ich den Fehler verstehen, aber wie soll ich es vermeiden?

Antwort

1

Sie können immer DIY es, wenn Sie die Funktion selbst instrumentieren können. Das einzige knifflige Bit ist die Iterationszahl. Dafür können Sie entweder einen globalen oder (IMO, besser) den Zähler an die Funktion selbst anhängen:

>>> 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]) 
Verwandte Themen