SciPy (рдЙрдЪреНрдЪрд╛рд░рдг рд╕рд╛рдИ рдкрд╛рдИ) рдПрдХ рд╕реБрдкреА-рдЖрдзрд╛рд░рд┐рдд рдЧрдгрд┐рдд рдкреИрдХреЗрдЬ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реА рдФрд░ рдлреЛрд░рдЯреНрд░рд╛рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред SciPy рдЖрдкрдХреЗ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдкрд╛рдпрдерди рд╕рддреНрд░ рдХреЛ MATLAB, IDL, рдСрдХреНрдЯреЗрд╡, R, рдпрд╛ SciLab рдЬреИрд╕реЗ рд╕рдВрдкреВрд░реНрдг рдбреЗрдЯрд╛ рд╡рд┐рдЬреНрдЮрд╛рди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЧрдгрд┐рддреАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдмреБрдирд┐рдпрд╛рджреА рддрдХрдиреАрдХреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ - scipy.optimize рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдЪрд░ рдХреЗ рд╕реНрдХреЗрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ред рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЕрдиреБрдХреВрд▓рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИ
рдкрд░рд┐рдЪрдп
scipy.optimize рдкреИрдХреЗрдЬ рдореЗрдВ рд╕рд╢рд░реНрдд рдФрд░ рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рджреЛрдиреЛрдВ рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ minimize()
. рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рдзрд┐ рдХрд╛ рдЪреБрдирд╛рд╡, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╢реЛрдзрдХрд░реНрддрд╛ рдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рдЖрддрд╛ рд╣реИред
рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреБрдХреНрдд рдЕрдиреБрдХреВрд▓рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ minimize(..., method="")
.
рдХрдИ рдЪрд░ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрд▓рдмреНрдз рд╣реИ:
trust-constr
- рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдиреНрдпреВрдирддрдо рдЦреЛрдЬреЗрдВредрд╡рд┐рдХреА рдЖрд▓реЗрдЦ ,рд╣реЗрдмреНрд░реЗ рдкрд░ рд▓реЗрдЦ ;SLSQP
- рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдорд┐рдХ рджреНрд╡рд┐рдШрд╛рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рд▓реИрдЧреНрд░реЗрдВрдЬ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдЯреЛрдирд┐рдпрди рд╡рд┐рдзрд┐редрд╡рд┐рдХреА рдЖрд▓реЗрдЦ .TNC
- рдХрд╛рдЯреЗ рдЧрдП рдиреНрдпреВрдЯрди рдмрд╛рдзрд┐рдд, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рдЪрд░ рдХреЗ рд╕рд╛рде рдЧреИрд░-рд░реЗрдЦреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИредрд╡рд┐рдХреА рдЖрд▓реЗрдЦ .L-BFGS-B
- рдмреНрд░реЛрдпрдбреЗрди-рдлреНрд▓реЗрдЪрд░-рдЧреЛрд▓реНрдбрдлрд╛рд░реНрдм-рд╢реИрдиреЛ рдЯреАрдо рдХреА рдПрдХ рд╡рд┐рдзрд┐, рд╣реЗрд╕рд┐рдпрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рд╡реИрдХреНрдЯрд░ рдХреА рдЖрдВрд╢рд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рдХрдо рдореЗрдореЛрд░реА рдЦрдкрдд рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЧрдИредрд╡рд┐рдХреА рдЖрд▓реЗрдЦ ,рд╣реЗрдмреНрд░реЗ рдкрд░ рд▓реЗрдЦ .COBYLA
- рд░реЗрдЦреАрдп рд╕рдиреНрдирд┐рдХрдЯрди рджреНрд╡рд╛рд░рд╛ MARE рд╡рд┐рд╡рд╢ рдЕрдиреБрдХреВрд▓рди, рд░реИрдЦрд┐рдХ рд╕рдиреНрдирд┐рдХрдЯрди рдХреЗ рд╕рд╛рде рд╡рд┐рд╡рд╢ рдЕрдиреБрдХреВрд▓рди (рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдЧрдгрдирд╛ рдХреЗ рдмрд┐рдирд╛)редрд╡рд┐рдХреА рдЖрд▓реЗрдЦ .
рдЪреБрдиреА рдЧрдИ рд╡рд┐рдзрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд░реНрддреЗрдВ рдФрд░ рдкреНрд░рддрд┐рдмрдВрдз рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
- рд╡рд░реНрдЧ рд╡рд╕реНрддреБ
Bounds
рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрд▓-рдмреАрдПрдлрдЬреАрдПрд╕-рдмреА, рдЯреАрдПрдирд╕реА, рдПрд╕рдПрд▓рдПрд╕рдХреНрдпреВрдкреА, рдЯреНрд░рд╕реНрдЯ-рдХреЙрдиреНрд╕рдЯреНрд░; - рд╕реВрдЪрд┐
(min, max)
рд╕рдорд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП L-BFGS-B, TNC, SLSQP, Trust-constr; - рдПрдХ рд╡рд╕реНрддреБ рдпрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА
LinearConstraint
,NonlinearConstraint
COBYLA, SLSQP, рдЯреНрд░рд╕реНрдЯ-рдХреЙрдиреНрд╕рдЯреНрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП; - рд╢рдмреНрджрдХреЛрд╢ рдпрд╛ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреА рд╕реВрдЪреА
{'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt}
COBYLA, SLSQP рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдПред
рд▓реЗрдЦ рдХреА рд░реВрдкрд░реЗрдЦрд╛:
1) рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЯреНрд░рд╕реНрдЯ рдХреНрд╖реЗрддреНрд░ (рд╡рд┐рдзрд┐ = "рдЯреНрд░рд╕реНрдЯ-рдХреЙрдиреНрд╕реНрдЯреНрд░") рдореЗрдВ рдПрдХ рд╕рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ Bounds
, LinearConstraint
, NonlinearConstraint
;
2) рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рдиреНрдпреВрдирддрдо рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ (рд╡рд┐рдзрд┐ = "рдПрд╕рдПрд▓рдПрд╕рдХреНрдпреВрдкреА") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ {'type', 'fun', 'jac', 'args'}
;
3) рд╡реЗрдм рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдорд┐рдд рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред
рд╕рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐ = "рднрд░реЛрд╕рд╛-constr"
рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди trust-constr
рдкрд░ рдЖрдзрд╛рд░рд┐рдд
рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рдиреНрдпреВрдирддрдо рдЬреНрдЮрд╛рдд рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЧрдгрд┐рддреАрдп рд╕реВрддреНрд░реАрдХрд░рдг:
рд╕рдЦреНрдд рд╕рдорд╛рдирддрд╛ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдирд┐рдЪрд▓реА рд╕реАрдорд╛ рдХреЛ рдКрдкрд░реА рд╕реАрдорд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ .
рдПрдХ-рддрд░рдлрд╝рд╛ рдмрд╛рдзрд╛ рдХреЗ рд▓рд┐рдП, рдКрдкрд░реА рдпрд╛ рдирд┐рдЪрд▓реА рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ np.inf
рд╕рдВрдмрдВрдзрд┐рдд рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде.
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рджреЛ рдЪрд░реЛрдВ рдХреЗ рдЬреНрдЮрд╛рдд рд░реЛрд╕реЗрдирдмреНрд░реЙрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдиреНрдпреВрдирддрдо рдЬреНрдЮрд╛рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдП рдЧрдП рд╣реИрдВ:
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдЕрдиреВрдард╛ рд╕рдорд╛рдзрд╛рди рд╣реИ , рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рдФрд░ рдЪреМрдерд╛ рдкреНрд░рддрд┐рдмрдВрдз рд╣реА рдорд╛рдиреНрдп рд╣реИред
рдЖрдЗрдП рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рддрдХ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ scipy рдореЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реАрдорд╛рдПрдВ ╨╕ рдЖрдЗрдП рдЗрд╕реЗ рдмрд╛рдЙрдВрдбреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред
from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])
рд╕реАрдорд╛рдПрдВ ╨╕ рдЖрдЗрдП рдЗрд╕реЗ рд░реИрдЦрд┐рдХ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреЗрдВ:
рдЖрдЗрдП рдЗрди рдмрд╛рдзрд╛рдУрдВ рдХреЛ LinearConstraint рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])
рдФрд░ рдЕрдВрдд рдореЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд░реВрдк рдореЗрдВ рдЕрд░реЗрдЦреАрдп рдмрд╛рдзрд╛:
рд╣рдо рдЗрд╕ рдмрд╛рдзрд╛ рдХреЗ рд▓рд┐рдП рдЬреИрдХреЛрдмрд┐рдпрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рдПрдХ рдордирдорд╛рдирд╛ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╣реЗрд╕рд┐рдпрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд░реИрдЦрд┐рдХ рд╕рдВрдпреЛрдЬрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ :
рдЕрдм рд╣рдо рдПрдХ рдЕрд░реИрдЦрд┐рдХ рдмрд╛рдзрд╛ рдХреЛ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ NonlinearConstraint
:
from scipy.optimize import NonlinearConstraint
def cons_f(x):
return [x[0]**2 + x[1], x[0]**2 - x[1]]
def cons_J(x):
return [[2*x[0], 1], [2*x[0], -1]]
def cons_H(x, v):
return v[0]*np.array([[2, 0], [0, 0]]) + v[1]*np.array([[2, 0], [0, 0]])
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=cons_H)
рдпрджрд┐ рдЖрдХрд╛рд░ рдмрдбрд╝рд╛ рд╣реИ, рддреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╡рд┐рд░рд▓ рд░реВрдк рдореЗрдВ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
from scipy.sparse import csc_matrix
def cons_H_sparse(x, v):
return v[0]*csc_matrix([[2, 0], [0, 0]]) + v[1]*csc_matrix([[2, 0], [0, 0]])
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1,
jac=cons_J, hess=cons_H_sparse)
рдпрд╛ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ LinearOperator
:
from scipy.sparse.linalg import LinearOperator
def cons_H_linear_operator(x, v):
def matvec(p):
return np.array([p[0]*2*(v[0]+v[1]), 0])
return LinearOperator((2, 2), matvec=matvec)
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1,
jac=cons_J, hess=cons_H_linear_operator)
рд╣реЗрд╕реНрд╕рд┐рдпрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдк рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ HessianUpdateStrategy
BFGS
╨╕ SR1
.
from scipy.optimize import BFGS
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=BFGS())
рд╣реЗрд╕рд┐рдпрди рдХреА рдЧрдгрдирд╛ рдкрд░рд┐рдорд┐рдд рдЕрдВрддрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = cons_J, hess = '2-point')
рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬреИрдХреЛрдмрд┐рдпрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдкрд░рд┐рдорд┐рдд рдЕрдВрддрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЗрд╕рд┐рдпрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдкрд░рд┐рдорд┐рдд рдЕрдВрддрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╣реЗрд╕рд┐рдпрди рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ HessianUpdateStrategy рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = '2-point', hess = BFGS ())
рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
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)
`gtol` termination condition is satisfied.
Number of iterations: 12, function evaluations: 8, CG iterations: 7, optimality: 2.99e-09, constraint violation: 1.11e-16, execution time: 0.033 s.
[0.41494531 0.17010937]
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╣реЗрд╕рд┐рдпрди рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ LinearOperator рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
def rosen_hess_linop(x):
def matvec(p):
return rosen_hess_prod(x, p)
return LinearOperator((2, 2), matvec=matvec)
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hess=rosen_hess_linop,
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
рдпрд╛ рд╣реЗрд╕реНрд╕рд┐рдпрди рдХрд╛ рдЙрддреНрдкрд╛рдж рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдордирдорд╛рдирд╛ рд╡реЗрдХреНрдЯрд░ hessp
:
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hessp=rosen_hess_prod,
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЗрд╕рд┐рдпрди рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ SR1
(рдЕрд░реНрдз-рдиреНрдпреВрдЯреЛрдирд┐рдпрди рд╕рдиреНрдирд┐рдХрдЯрди)ред рдврд╛рд▓ рдХрд╛ рдЕрдиреБрдорд╛рди рдкрд░рд┐рдорд┐рдд рдЕрдВрддрд░реЛрдВ рд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
from scipy.optimize import SR1
res = minimize(rosen, x0, method='trust-constr', jac="2-point", hess=SR1(),
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
рд╕рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐ = "SLSQP"
SLSQP рд╡рд┐рдзрд┐ рдХреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдореНрди рд░реВрдк рдореЗрдВ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдЬрд╣рд╛рдБ ╨╕ - рд╕рдорд╛рдирддрд╛ рдпрд╛ рдЕрд╕рдорд╛рдирддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХрд╛ рд╕реЗрдЯред - рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдирд┐рдЪрд▓реА рдФрд░ рдКрдкрд░реА рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕реЗрдЯред
рд░реИрдЦрд┐рдХ рдФрд░ рдЕрд░реЗрдЦреАрдп рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдХреБрдВрдЬрд┐рдпреЛрдВ рд╡рд╛рд▓реЗ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ type
, fun
╨╕ jac
.
ineq_cons = {'type': 'ineq',
'fun': lambda x: np.array ([1 - x [0] - 2 * x [1],
1 - x [0] ** 2 - x [1],
1 - x [0] ** 2 + x [1]]),
'jac': lambda x: np.array ([[- 1.0, -2.0],
[-2 * x [0], -1.0],
[-2 * x [0], 1.0]])
}
eq_cons = {'type': 'eq',
'fun': lambda x: np.array ([2 * x [0] + x [1] - 1]),
'jac': lambda x: np.array ([2.0, 1.0])
}
рдиреНрдпреВрдирддрдо рдХреА рдЦреЛрдЬ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ:
x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='SLSQP', jac=rosen_der,
constraints=[eq_cons, ineq_cons], options={'ftol': 1e-9, 'disp': True},
bounds=bounds)
print(res.x)
Optimization terminated successfully. (Exit mode 0)
Current function value: 0.34271757499419825
Iterations: 4
Function evaluations: 5
Gradient evaluations: 4
[0.41494475 0.1701105 ]
рдЕрдиреБрдХреВрд▓рди рдЙрджрд╛рд╣рд░рдг
рдкрд╛рдВрдЪрд╡реАрдВ рддрдХрдиреАрдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЖрдЗрдП рдПрдХ рд╡реЗрдм рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрд╛рджрди рдЕрдиреБрдХреВрд▓рди рдХреЛ рджреЗрдЦреЗрдВ, рдЬреЛ рд╣рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд▓реЗрдХрд┐рди рд╕реНрдерд┐рд░ рдЖрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рд╣рдо рдЦреБрдж рдХреЛ рдПрдХ рдЧреИрд▓реА рдХреЗ рдирд┐рджреЗрд╢рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬреЛ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрддреНрдкрд╛рдж рдмрдирд╛рддреА рд╣реИ:
- x0 - рд▓реИрдВрдбрд┐рдВрдЧ рдкреЗрдЬ рдмреЗрдЪрдирд╛, 10 tr рд╕реЗред
- X1 - рдХреЙрд░реНрдкреЛрд░реЗрдЯ рд╡реЗрдмрд╕рд╛рдЗрдЯреЗрдВ, 20 tr рд╕реЗред
- x2 - рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░, 30 рдЯреНрд░ рд╕реЗред
рд╣рдорд╛рд░реА рдорд┐рддреНрд░рддрд╛рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдЯреАрдо рдореЗрдВ рдЪрд╛рд░ рдЬреВрдирд┐рдпрд░, рджреЛ рдорд┐рдбрд┐рд▓ рдФрд░ рдПрдХ рд╕реАрдирд┐рдпрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрдирдХрд╛ рдорд╛рд╕рд┐рдХ рдХрд╛рд░реНрдп рд╕рдордп рдирд┐рдзрд┐:
- рдЬреВрди:
4 * 150 = 600 ╤З╨╡╨╗ * ╤З╨░╤Б
, - рдордзреНрдп:
2 * 150 = 300 ╤З╨╡╨╗ * ╤З╨░╤Б
, - рд╡рд░рд┐рд╖реНрда:
150 ╤З╨╡╨╗ * ╤З╨░╤Б
.
рдкрд╣рд▓реЗ рдЙрдкрд▓рдмреНрдз рдХрдирд┐рд╖реНрда рдХреЛ (x0, x1, x2), рдордзреНрдп - (10, 20, 30), рд╡рд░рд┐рд╖реНрда - (7, 15, 20) рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╕рд╛рдЗрдЯ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рддреИрдирд╛рддреА рдкрд░ (5, 10, 15) рдШрдВрдЯреЗ рдЦрд░реНрдЪ рдХрд░рдиреЗ рджреЗрдВ ) рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдордп рдХреЗ рдШрдВрдЯреЗред
рдХрд┐рд╕реА рднреА рд╕рд╛рдорд╛рдиреНрдп рдирд┐рджреЗрд╢рдХ рдХреА рддрд░рд╣, рд╣рдо рдорд╛рд╕рд┐рдХ рд▓рд╛рдн рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рдлрд▓рддрд╛ рдХреА рдУрд░ рдкрд╣рд▓рд╛ рдХрджрдо рдЙрджреНрджреЗрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реИ value
рдкреНрд░рддрд┐ рдорд╛рд╣ рдЙрддреНрдкрд╛рджрд┐рдд рдЙрддреНрдкрд╛рджреЛрдВ рд╕реЗ рдЖрдп рдХреА рд░рд╛рд╢рд┐ рдХреЗ рд░реВрдк рдореЗрдВ:
def value(x):
return - 10*x[0] - 20*x[1] - 30*x[2]
рдпрд╣ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ; рдЕрдзрд┐рдХрддрдо рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп, рдЙрджреНрджреЗрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд┐рдкрд░реАрдд рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рдиреНрдпреВрдирддрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛ рдХрджрдо рд╣рдорд╛рд░реЗ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдФрд░ рдХрд╛рдо рдХреЗ рдШрдВрдЯреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдирд╛ рд╣реИ:
рд╕рдорддреБрд▓реНрдп рдХреНрдпрд╛ рд╣реИ:
ineq_cons = {'type': 'ineq',
'fun': lambda x: np.array ([600 - 10 * x [0] - 20 * x [1] - 30 * x[2],
300 - 7 * x [0] - 15 * x [1] - 20 * x[2],
150 - 5 * x [0] - 10 * x [1] - 15 * x[2]])
}
рдПрдХ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рддрд┐рдмрдВрдз рдпрд╣ рд╣реИ рдХрд┐ рдЙрддреНрдкрд╛рдж рдЖрдЙрдЯрдкреБрдЯ рдХреЗрд╡рд▓ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
bnds = Bounds ([0, 0, 0], [np.inf, np.inf, np.inf])
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕рдмрд╕реЗ рд╕реБрдЦрдж рдзрд╛рд░рдгрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрдо рдХреАрдордд рдФрд░ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рдХрд╛рд░рдг, рд╕рдВрддреБрд╖реНрдЯ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рдХрддрд╛рд░ рд▓рдЧрд╛рддрд╛рд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд▓рдЧреА рд░рд╣рддреА рд╣реИред рд╣рдо рд╡рд┐рд╡рд╢ рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╛рд╕рд┐рдХ рдЙрддреНрдкрд╛рджрди рдорд╛рддреНрд░рд╛ рд╕реНрд╡рдпрдВ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ scipy.optimize
:
x0 = np.array([10, 10, 10])
res = minimize(value, x0, method='SLSQP', constraints=ineq_cons, bounds=bnds)
print(res.x)
[7.85714286 5.71428571 3.57142857]
рдЖрдЗрдП рдкреВрд░реНрдг рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдЗрд╖реНрдЯрддрдо рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде рд░реЛрд╡рд░реНрд╕ рдХреЗ рдорд╛рд╕рд┐рдХ рднрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ x = (8, 6, 3)
:
- рдЬреВрди:
8 * 10 + 6 * 20 + 3 * 30 = 290 ╤З╨╡╨╗ * ╤З╨░╤Б
; - рдордзреНрдп:
8 * 7 + 6 * 15 + 3 * 20 = 206 ╤З╨╡╨╗ * ╤З╨░╤Б
; - рд╡рд░рд┐рд╖реНрда:
8 * 5 + 6 * 10 + 3 * 15 = 145 ╤З╨╡╨╗ * ╤З╨░╤Б
.
рдирд┐рд╖реНрдХрд░реНрд╖: рдирд┐рд░реНрджреЗрд╢рдХ рдХреЛ рдЕрдкрдирд╛ рд╕реБрдпреЛрдЧреНрдп рдЕрдзрд┐рдХрддрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐ рдорд╛рд╣ 8 рд▓реИрдВрдбрд┐рдВрдЧ рдкреГрд╖реНрда, 6 рдордзреНрдпрдо рдЖрдХрд╛рд░ рдХреА рд╕рд╛рдЗрдЯреЗрдВ рдФрд░ 3 рд╕реНрдЯреЛрд░ рдмрдирд╛рдирд╛ рдЗрд╖реНрдЯрддрдо рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд░рд┐рд╖реНрда рдХреЛ рдорд╢реАрди рд╕реЗ рдКрдкрд░ рджреЗрдЦреЗ рдмрд┐рдирд╛ рдЬреБрддрд╛рдИ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдордзреНрдп рдХрд╛ рднрд╛рд░ рд▓рдЧрднрдЧ 2/3 рд╣реЛрдЧрд╛, рдХрдирд┐рд╖реНрдареЛрдВ рдХрд╛ рднрд╛рд░ рдЖрдзреЗ рд╕реЗ рднреА рдХрдо рд╣реЛрдЧрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рд▓реЗрдЦ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдмреБрдирд┐рдпрд╛рджреА рддрдХрдиреАрдХреЛрдВ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдмрддрд╛рддрд╛ рд╣реИ scipy.optimize
, рд╕рд╢рд░реНрдд рдиреНрдпреВрдиреАрдХрд░рдг рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ scipy
рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╢реИрдХреНрд╖рдгрд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдЗрддрдиреА рд╣рд╛рд╕реНрдпрдкреНрд░рдж рдкреНрд░рдХреГрддрд┐ рдХрд╛ рд╣реИред
рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдЖрднрд╛рд╕реА рдЙрджрд╛рд╣рд░рдг рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдИ.рдПрд▓. рдЕрдХреБрд▓рд┐рдЪ рдХреА рдкреБрд╕реНрддрдХ "рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рдЧрдгрд┐рддреАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред" рдЕрдзрд┐рдХ рдХрдЯреНрдЯрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ scipy.optimize
рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рд╕реЗ рдПрдХ 3рдбреА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП (
рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдореБрдЦреНрдп рд╕реНрд░реЛрдд рд╣реИ scipy
рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ
рдзрдиреНрдпрд╡рд╛рдж
рд╕реНрд░реЛрдд: www.habr.com