ein einfaches Problem vor:Math Domain Fehler aufgrund disrespected Einschränkung in scipy SLSQP minimieren
Um das Problem mit scipy.optimize.minimize
zu lösen:
import numpy as np
from scipy.optimize import minimize
from math import log
def func(x):
return log(x[0])
def func_deriv(x):
return np.array([1/x[0]])
cons = ({'type': 'ineq',
'fun' : lambda x: x[0] - 1e-4,
'jac' : lambda x: np.array([1])})
minimize(func, [1.0], jac=func_deriv, constraints=cons, method='SLSQP')
Das Skript trifft ValueError
weil log(x)
mit negativ bewertet x
. Es scheint, dass der Funktionswert ausgewertet wird, selbst wenn die Bedingung nicht erfüllt ist.
Ich verstehe, dass bounds
in minimize()
könnte das Problem vermeiden, aber das ist nur eine Vereinfachung meines ursprünglichen Problems. In meinem ursprünglichen Problem kann die Einschränkung x >= 1e-4
nicht einfach als Grenzen von x
dargestellt werden, sondern eher von der Form g(x) >= C
, so bounds
würde nicht helfen.
Ich benutze immer Grenzen für diesen Zweck sogar auf Kosten von zusätzlichen Variablen oder Einschränkungen (aber ich verwende typischerweise fortgeschrittenere Algorithmen als scipy.optimize). Z.B. In deinem Fall würde ich 'y = g (x)' hinzufügen und dann die Grenzen auf 'y' setzen. Stattdessen können Sie die Rückgabe von Einschränkungsfunktionswerten durchmachen, die (sehr) negativ (d. H. Nicht machbar) sind. –
@ErwinKalvelagen Das ist eine Lösung, aber ich muss dann eine modifizierte Version von "log (x)" entwickeln, die sehr negativ ist und ableitbar ist, selbst wenn "x" etwas kleiner als Null ist. Darf ich fragen, welche fortschrittlichen Algorithmen Sie normalerweise verwenden? – peter
@peter Ich denke, er bezieht sich auf die kommerziellen Tools wie Knigro, Baron, Conopt und Co. (oder im Allgemeinen NLP-Löser von AMPL unterstützt). Eine Open-Source-Alternative, die Sie untersuchen können, wäre ipopt (oder andere, wenn Ihr vollständiges Problem konvex ist). – sascha