Mit Python 3.6 versuche ich eine Funktion mit scipy.optimize.minimize
zu minimieren. Mein Minimierungsproblem als zwei Einschränkungen, und ich kann eine Lösung finden. Bisher habe ich folgendes:Fehlermeldung beim Versuch, eine Funktion mit scipy mit jacobian zu minimieren
import numpy as np
from scipy.optimize import minimize
array = np.array([[3.0, 0.25, 0.75],
[0.1, 0.65, 2.50],
[0.80, 2.5, 1.20],
[0.0, 0.25, 0.15],
[1.2, 2.40, 3.60]])
matrix = np.array([[1.0, 1.5, -2.],
[0.5, 3.0, 2.5],
[1.0, 0.25, 0.75]])
def fct1(x):
return -sum(x.dot(array.T))
def fct2(x):
return x.dot(matrix).dot(x)
x0 = np.ones(3)/3
cons = ({'type': 'eq', 'fun': lambda x: x.sum() - 1.0},
{'type': 'eq', 'fun': lambda x: fct2(x) - tgt})
tgt = 0.15
w = minimize(fct1, x0, method='SLSQP', constraints=cons)['x']
res1 = fct1(w)
res2 = fct2(w)
ich jetzt versuche, mein Optimierer zu bekommen, schneller zu laufen, da dies nur ein vereinfachtes Problem. Am Ende sind meine Arrays und Matrizen viel größer. In einer früheren Frage kam jemand mit der Idee der Definition des jacobian meiner Funktion bis zu optimieren, so fügte ich folgend:
def fct1_deriv(x):
return -sum(np.ones_like(x).dot(array.T))
w = minimize(fct1, x0, method='SLSQP', jac=fct1_deriv, constraints=cons)['x']
Problem ist ich die folgende Fehlermeldung erhalten, wenn zu laufen versuchen:
0-th dimension must be fixed to 4 but got 2
Traceback (most recent call last):
File "C:\Anaconda2\envs\py36\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-111-d1b854178c13>", line 1, in <module>
w = minimize(fct1, x0, method='SLSQP', jac=fct1_deriv, constraints=cons)['x']
File "C:\Anaconda2\envs\py36\lib\site-packages\scipy\optimize\_minimize.py", line 458, in minimize
constraints, callback=callback, **options)
File "C:\Anaconda2\envs\py36\lib\site-packages\scipy\optimize\slsqp.py", line 410, in _minimize_slsqp
slsqp(m, meq, x, xl, xu, fx, c, g, a, acc, majiter, mode, w, jw)
_slsqp.error: failed in converting 8th argument `g' of _slsqp.slsqp to C/Fortran array
Irgendwelche Ideen, was das Problem sein könnte? Die Verbindung zu meiner vorherigen Antwort ist hier:
Ich habe versucht, Ihre Lösung auszuführen, und es gibt mir immer noch die gleiche Fehlermeldung. Ich glaube jedoch nicht, dass mein Jacobi ein 3-Vektor sein sollte. Mein Jacobi ist die Ableitung meiner Optimierungsfunktion, die einen einzelnen Wert und keinen 3 Vektor ergibt. Meine Jacobi sollte daher auch einen einzigen Wert ergeben. Die Tatsache, dass ich einen Vektor verwende, dient nur dazu, meine Funktion ein wenig sauberer zu machen. –
Ist es möglich, dass meine Funktion zur Optimierung eine lineare Funktion ist, wäre die Jacobi unbrauchbar, da sie nicht länger eine Funktion meines Arrays x ist? –