SciPy (рдЙрдЪреНрдЪрд╛рд░рд┐рдд sai pie) рд╣реЗ рдПрдХ numpy-рдЖрдзрд╛рд░рд┐рдд рдЧрдгрд┐рдд рдкреЕрдХреЗрдЬ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ C рдЖрдгрд┐ Fortran рд▓рд╛рдпрдмреНрд░рд░реА рджреЗрдЦреАрд▓ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗрдд. SciPy рддреБрдордЪреЗ рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рдкрд╛рдпрдерди рд╕рддреНрд░ MATLAB, IDL, Octave, R рдХрд┐рдВрд╡рд╛ SciLab рд╕рд╛рд░рдЦреНрдпрд╛ рд╕рдВрдкреВрд░реНрдг рдбреЗрдЯрд╛ рд╡рд┐рдЬреНрдЮрд╛рди рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдмрджрд▓рддреЗ.
рдпрд╛ рд▓реЗрдЦрд╛рдд, рдЖрдореНрд╣реА рдЧрдгрд┐рддреАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧрдЪреА рдореВрд▓рднреВрдд рддрдВрддреНрд░реЗ рдкрд╛рд╣реВ - scipy.optimize рдкреЕрдХреЗрдЬ рд╡рд╛рдкрд░реВрди рдЕрдиреЗрдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреНрдпрд╛ рд╕реНрдХреЗрд▓рд░ рдлрдВрдХреНрд╢рдирд╕рд╛рдареА рд╕рд╢рд░реНрдд рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рдгреЗ. рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдЕрд▓реНрдЧреЛрд░рд┐рджрдордЪреА рдЖрдзреАрдЪ рдЪрд░реНрдЪрд╛ рдХреЗрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ
рдкрд░рд┐рдЪрдп
scipy.optimize рдкреЕрдХреЗрдЬрдордзреАрд▓ рд╕рд╢рд░реНрдд рдЖрдгрд┐ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдлрдВрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рдкреНрд░рджрд╛рди рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. minimize()
. рддрдерд╛рдкрд┐, рд╣реЗ рдЬреНрдЮрд╛рдд рдЖрд╣реЗ рдХреА рд╕рд░реНрд╡ рд╕рдорд╕реНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрдгрддреАрд╣реА рд╕рд╛рд░реНрд╡рддреНрд░рд┐рдХ рдкрджреНрдзрдд рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдкреБрд░реЗрд╢реА рдкрджреНрдзрдд рдирд┐рд╡рдбрдгреЗ, рдиреЗрд╣рдореАрдкреНрд░рдорд╛рдгреЗ, рд╕рдВрд╢реЛрдзрдХрд╛рдЪреНрдпрд╛ рдЦрд╛рдВрджреНрдпрд╛рд╡рд░ рдпреЗрддреЗ.
рдлрдВрдХреНрд╢рди рдЖрд░реНрдЧреНрдпреБрдореЗрдВрдЯ рд╡рд╛рдкрд░реВрди рдпреЛрдЧреНрдп рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓рд╛ рдЖрд╣реЗ minimize(..., method="")
.
рдЕрдиреЗрдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреНрдпрд╛ рдлрдВрдХреНрд╢рдирдЪреНрдпрд╛ рд╕рд╢рд░реНрдд рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рдирд╕рд╛рдареА, рдЦрд╛рд▓реАрд▓ рдкрджреНрдзрддреАрдВрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ:
trust-constr
тАФ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреНрд╖реЗрддреНрд░рд╛рдордзреНрдпреЗ рд╕реНрдерд╛рдирд┐рдХ рдХрд┐рдорд╛рди рд╢реЛрдзрд╛.рд╡рд┐рдХреА рд▓реЗрдЦ ,Habr├й рд╡рд░ рд▓реЗрдЦ ;SLSQP
тАФ рдорд░реНрдпрд╛рджрд╛рдВрд╕рд╣ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЪрддреБрд░реНрднреБрдЬ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рд▓реЕрдЧреНрд░реЗрдВрдЬ рдкреНрд░рдгрд╛рд▓реА рд╕реЛрдбрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдиреНрдпреВрдЯреЛрдирд┐рдпрди рдкрджреНрдзрдд.рд╡рд┐рдХреА рд▓реЗрдЦ .TNC
- рдЯреНрд░рдВрдХреЗрдЯреЗрдб рдиреНрдпреВрдЯрди рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд, рдкреБрдирд░рд╛рд╡реГрддреНрддреАрдЪреА рдорд░реНрдпрд╛рджрд┐рдд рд╕рдВрдЦреНрдпрд╛, рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рд╕реНрд╡рддрдВрддреНрд░ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рд╕рд╣ рдиреЙрдирд▓рд╛рдЗрдирд░ рдлрдВрдХреНрд╢рдиреНрд╕рд╕рд╛рдареА рдЪрд╛рдВрдЧрд▓реЗ.рд╡рд┐рдХреА рд▓реЗрдЦ .L-BFGS-B
тАФ BroydenтАУFletcherтАУGoldfarbтАУShanno рдЯреАрдордЪреА рдПрдХ рдкрджреНрдзрдд, рд╣реЗрд╕рд┐рдпрди рдореЕрдЯреНрд░рд┐рдХреНрд╕рдордзреВрди рд╡реЗрдХреНрдЯрд░реНрд╕рдЪреНрдпрд╛ рдЖрдВрд╢рд┐рдХ рд▓реЛрдбрд┐рдВрдЧрдореБрд│реЗ рдХрдореА рдореЗрдорд░реА рд╡рд╛рдкрд░рд╛рд╕рд╣ рд▓рд╛рдЧреВ рдХреЗрд▓реА рдЧреЗрд▓реА.рд╡рд┐рдХреА рд▓реЗрдЦ ,Habr├й рд╡рд░ рд▓реЗрдЦ .COBYLA
тАФ рд░реЗрдЦреАрдп рдЕрдВрджрд╛рдЬрд╛рдиреБрд╕рд╛рд░ MARE рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди, рд░реЗрдЦреАрдп рдЕрдВрджрд╛рдЬреЗ (рдЧреНрд░реЗрдбрд┐рдпрдВрдЯ рдЧрдгрдирд╛рд╢рд┐рд╡рд╛рдп) рдорд░реНрдпрд╛рджрд┐рдд рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди.рд╡рд┐рдХреА рд▓реЗрдЦ .
рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛ рдкрджреНрдзрддреАрдиреБрд╕рд╛рд░, рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдЯреА рдЖрдгрд┐ рдирд┐рд░реНрдмрдВрдз рд╡реЗрдЧрд│реНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗрдд:
- рд╡рд░реНрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ
Bounds
L-BFGS-B, TNC, SLSQP, рдЯреНрд░рд╕реНрдЯ-рдХрдиреНрд╕реНрдЯреНрд░ рдпрд╛ рдкрджреНрдзрддреАрдВрд╕рд╛рдареА; - рдпрд╛рджреА
(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) рд╢рдмреНрджрдХреЛрд╖рд╛рдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдирд┐рд░реНрдмрдВрдзрд╛рдВрд╕рд╣ рдХрд┐рдорд╛рди рд╡рд░реНрдЧ рдкрджреНрдзрддреА (рдкрджреНрдзрдд = "SLSQP") рд╡рд╛рдкрд░реВрди рдЕрдиреБрдХреНрд░рдорд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рд╛ {'type', 'fun', 'jac', 'args'}
;
3) рд╡реЗрдм рд╕реНрдЯреБрдбрд┐рдУрдЪреЗ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рдкрд░реВрди рдЙрддреНрдкрд╛рджрд┐рдд рдЙрддреНрдкрд╛рджрдирд╛рдВрдЪреНрдпрд╛ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рдирдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рд╛.
рд╕рд╢рд░реНрдд рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдкрджреНрдзрдд="trust-constr"
рдкрджреНрдзрддреАрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА trust-constr
рдЖрдзрд╛рд░реАрдд
рд╕рд╛рдорд╛рдиреНрдп рд╕реНрд╡рд░реВрдкрд╛рдд рдХрд┐рдорд╛рди рд╢реЛрдзрдгреНрдпрд╛рдЪреНрдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдЧрдгрд┐рддреАрдп рд╕реВрддреНрд░реАрдХрд░рдг:
рдХрдареЛрд░ рд╕рдорд╛рдирддрд╛ рдорд░реНрдпрд╛рджрд╛рдВрд╕рд╛рдареА, рдЦрд╛рд▓рдЪреА рд╕реАрдорд╛ рд╡рд░рдЪреНрдпрд╛ рдмрд╛рдЙрдВрдбрдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдиреЗ рд╕реЗрдЯ рдХреЗрд▓реА рдЬрд╛рддреЗ .
рдПрдХреЗрд░реА рдорд░реНрдпрд╛рджрд╛рдВрд╕рд╛рдареА, рд╡рд░рдЪреА рдХрд┐рдВрд╡рд╛ рдЦрд╛рд▓рдЪреА рдорд░реНрдпрд╛рджрд╛ рд╕реЗрдЯ рдХреЗрд▓реА рдЖрд╣реЗ np.inf
рд╕рдВрдмрдВрдзрд┐рдд рдЪрд┐рдиреНрд╣рд╛рд╕рд╣.
рджреЛрди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреЗ рдХрд┐рдорд╛рди рдЬреНрдЮрд╛рдд рд░реЛрд╕реЗрдирдмреНрд░реЙрдХ рдлрдВрдХреНрд╢рди рд╢реЛрдзрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:
рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рддреНрдпрд╛рдЪреНрдпрд╛ рдкрд░рд┐рднрд╛рд╖рд╛рдЪреНрдпрд╛ рдбреЛрдореЗрдирд╡рд░ рдЦрд╛рд▓реАрд▓ рдирд┐рд░реНрдмрдВрдз рд╕реЗрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗрдд:
рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдмрд┐рдВрджреВрд╡рд░ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЙрдкрд╛рдп рдЖрд╣реЗ , рдЬреНрдпрд╛рд╕рд╛рдареА рдлрдХреНрдд рдкрд╣рд┐рд▓реЗ рдЖрдгрд┐ рдЪреМрдереЗ рдирд┐рд░реНрдмрдВрдз рд╡реИрдз рдЖрд╣реЗрдд.
рдЪрд▓рд╛ рдЦрд╛рд▓рдкрд╛рд╕реВрди рд╡рд░рдкрд░реНрдпрдВрддрдЪреНрдпрд╛ рдирд┐рд░реНрдмрдВрдзрд╛рдВрдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реВрдпрд╛ рдЖрдгрд┐ рдЖрдкрдг рддреЗ рд╕реНрдХрд┐рдкрдордзреНрдпреЗ рдХрд╕реЗ рд▓рд┐рд╣реВ рд╢рдХрддреЛ рддреЗ рдкрд╛рд╣реВ рдпрд╛.
рдирд┐рд░реНрдмрдВрдз ╨╕ Bounds рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рдкрд░реВрди рддреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реВ.
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')
рдорд░реНрдпрд╛рджрд╛рдВрд╕рд╛рдареА рдЬреЗрдХреЛрдмрд┐рдпрди рдореЕрдЯреНрд░рд┐рдХреНрд╕ рджреЗрдЦреАрд▓ рдорд░реНрдпрд╛рджрд┐рдд рдлрд░рдХ рд╡рд╛рдкрд░реВрди рдореЛрдЬрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рддрдерд╛рдкрд┐, рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рд╣реЗрд╕рд┐рдпрди рдореЕрдЯреНрд░рд┐рдХреНрд╕ рдорд░реНрдпрд╛рджрд┐рдд рдлрд░рдХ рд╡рд╛рдкрд░реВрди рдореЛрдЬрд▓реЗ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА. Hessian рд▓рд╛ рдлрдВрдХреНрд╢рди рдХрд┐рдВрд╡рд╛ 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 tr рдкрд╛рд╕реВрди.
рдЖрдордЪреНрдпрд╛ рдореИрддреНрд░реАрдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╕рдВрдШрд╛рдордзреНрдпреЗ рдЪрд╛рд░ рдХрдирд┐рд╖реНрда, рджреЛрди рдордзреНрдпрдо рдЖрдгрд┐ рдПрдХ рд╡рд░рд┐рд╖реНрда рдпрд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЖрд╣реЗ. рддреНрдпрд╛рдВрдЪрд╛ рдорд╛рд╕рд┐рдХ рдХрд╛рдордХрд╛рдЬрд╛рдЪрд╛ рд╡реЗрд│ рдирд┐рдзреА:
- рдЬреВрди:
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
рдкреВрд░реНрдгрдкрдгреЗ рд╢реИрдХреНрд╖рдгрд┐рдХ рд╣реЗрддреВрдВрд╕рд╛рдареА, рдореНрд╣рдгреВрдирдЪ рджрд┐рд▓реЗрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдЕрд╢рд╛ рдХреЙрдорд┐рдХ рд╕реНрд╡рд░реВрдкрд╛рдЪреЗ рдЖрд╣реЗ.
рдмрд░реЗрдЪ рд╕рд┐рджреНрдзрд╛рдВрдд рдЖрдгрд┐ рдЖрднрд╛рд╕реА рдЙрджрд╛рд╣рд░рдгреЗ рдЖрдврд│реВ рд╢рдХрддрд╛рдд, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, I.L. Akulich рдЪреНрдпрд╛ рдкреБрд╕реНрддрдХрд╛рдд "рдЙрджрд╛рд╣рд░рдгреЗ рдЖрдгрд┐ рд╕рдорд╕реНрдпрд╛рдВрдордзреНрдпреЗ рдЧрдгрд┐рддреАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ." рдЕрдзрд┐рдХ рд╣рд╛рд░реНрдбрдХреЛрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ scipy.optimize
рдкреНрд░рддрд┐рдорд╛рдВрдЪреНрдпрд╛ рд╕рдВрдЪрд╛рдордзреВрди 3D рд░рдЪрдирд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА (
рдорд╛рд╣рд┐рддреАрдЪрд╛ рдореБрдЦреНрдп рд╕реНрддреНрд░реЛрдд рдЖрд╣реЗ scipy
рдЖрдкрд▓реЗ рд╕реНрд╡рд╛рдЧрдд рдЖрд╣реЗ
╨б╨┐╨░╤Б╨╕╨▒╨╛
рд╕реНрддреНрд░реЛрдд: www.habr.com