SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy (рдЙрдЪреНрдЪрд╛рд░рдг рд╕рд╛рдИ рдкрд╛рдИ) рдПрдХ numpy-рдЖрдзрд╛рд░рд┐рдд рдЧрдгрд┐рдд рдкреНрдпрд╛рдХреЗрдЬ рд╣реЛ рдЬрд╕рдорд╛ C рд░ Fortran рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдкрдирд┐ рд╕рдорд╛рд╡реЗрд╢ рдЫрдиреНред SciPy рд▓реЗ рддрдкрд╛рдИрдХреЛ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкрд╛рдЗрдерди рд╕рддреНрд░рд▓рд╛рдИ MATLAB, IDL, Octave, R, рд╡рд╛ SciLab рдЬрд╕реНрддрд╛ рдкреВрд░реНрдг рдбреЗрдЯрд╛ рд╡рд┐рдЬреНрдЮрд╛рди рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдкрд░рд┐рдгрдд рдЧрд░реНрджрдЫред

рдпрд╕ рд▓реЗрдЦрдорд╛, рд╣рд╛рдореА рдЧрдгрд┐рддреАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩрдХреЛ рдЖрдзрд╛рд░рднреВрдд рдкреНрд░рд╡рд┐рдзрд┐рд╣рд░реВ рд╣реЗрд░реНрдиреЗрдЫреМрдВ - scipy.optimize рдкреНрдпрд╛рдХреЗрдЬ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдзреЗрд░реИ рдЪрд░рд╣рд░реВрдХреЛ рд╕реНрдХреЗрд▓рд░ рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрджреИред рдЕрдирд┐рдпрдиреНрддреНрд░рд┐рдд рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рджрдорд╣рд░реВ рдкрд╣рд┐рд▓реЗ рдиреИ рдорд╛ рдЫрд▓рдлрд▓ рдЧрд░рд┐рдПрдХреЛ рдЫ рдЕрдиреНрддрд┐рдо рд▓реЗрдЦред рд╕реНрдХрд┐рдкреА рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рдердк рд╡рд┐рд╕реНрддреГрдд рд░ рдЕрдк-рдЯреБ-рдбреЗрдЯ рдорджреНрджрдд рд╕рдзреИрдВ рдорджреНрджрдд() рдЖрджреЗрд╢, Shift+Tab рд╡рд╛ рднрд┐рддреНрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ.

рдкрд░рд┐рдЪрдп

scipy.optimize рдкреНрдпрд╛рдХреЗрдЬрдорд╛ рд╕рд╢рд░реНрдд рд░ рдЕрдирд┐рдпрдиреНрддреНрд░рд┐рдд рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╕рди рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рд╕рд╛рдЭрд╛ рдЗрдиреНрдЯрд░рдлреЗрд╕ рдкреНрд░рдХрд╛рд░реНрдпрджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдЧрд░рд┐рдПрдХреЛ рдЫред minimize()ред рдпрджреНрдпрдкрд┐, рдпреЛ рдЬреНрдЮрд╛рдд рдЫ рдХрд┐ рд╕рдмреИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдХреБрдиреИ рд╡рд┐рд╢реНрд╡рд╡реНрдпрд╛рдкреА рд╡рд┐рдзрд┐ рдЫреИрди, рддреНрдпрд╕реИрд▓реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рдзрд┐рдХреЛ рдЫрдиреМрдЯ, рд╕рдзреИрдВрдХреЛ рд░реВрдкрдорд╛, рд╢реЛрдзрдХрд░реНрддрд╛рдХреЛ рдХрд╛рдБрдзрдорд╛ рдкрд░реНрдЫред
рдЙрдкрдпреБрдХреНрдд рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рдХрд╛рд░реНрдп рддрд░реНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ minimize(..., method="").
рдзреЗрд░реИ рдЪрд░рд╣рд░реВрдХреЛ рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рд╕рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рдирдХреЛ рд▓рд╛рдЧрд┐, рдирд┐рдореНрди рд╡рд┐рдзрд┐рд╣рд░реВрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд╣рд░реВ рдЙрдкрд▓рдмреНрдз рдЫрдиреН:

  • trust-constr - рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреНрд╖реЗрддреНрд░рдорд╛ рд╕реНрдерд╛рдиреАрдп рдиреНрдпреВрдирддрдо рдЦреЛрдЬреНрдиреБрд╣реЛрд╕реНред рд╡рд┐рдХрд┐ рд▓реЗрдЦ, Habr├й рдорд╛ рд▓реЗрдЦ;
  • SLSQP - рдмрд╛рдзрд╛рд╣рд░реВ рд╕рд╣рд┐рддрдХреЛ рдХреНрд░рдорд┐рдХ рдЪрддреБрд░реНрднреБрдЬ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ, Lagrange рдкреНрд░рдгрд╛рд▓реА рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдиреНрдпреВрдЯреЛрдирд┐рдпрди рд╡рд┐рдзрд┐ред рд╡рд┐рдХрд┐ рд▓реЗрдЦ.
  • TNC - рдХрд╛рдЯрд┐рдПрдХреЛ рдиреНрдпреВрдЯрди рд╕реАрдорд┐рдд, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рд╣рд░реВрдХреЛ рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛, рд╕реНрд╡рддрдиреНрддреНрд░ рдЪрд░рд╣рд░реВрдХреЛ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдХреЛ рд╕рд╛рде рдирдирд▓рд╛рдЗрдирд░ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд░рд╛рдореНрд░реЛред рд╡рд┐рдХрд┐ рд▓реЗрдЦ.
  • L-BFGS-B тАФ BroydenтАУFletcherтАУGoldfarbтАУShanno рдЯреЛрд▓реАрдмрд╛рдЯ рдПрдЙрдЯрд╛ рд╡рд┐рдзрд┐, рд╣реЗрд╕рд┐рдпрди рдореНрдпрд╛рдЯреНрд░рд┐рдХреНрд╕рдмрд╛рдЯ рднреЗрдХреНрдЯрд░рд╣рд░реВрдХреЛ рдЖрдВрд╢рд┐рдХ рд▓реЛрдбрд┐рдЩрдХреЛ рдХрд╛рд░рдгрд▓реЗ рдореЗрдореЛрд░реА рдЦрдкрдд рдХрдо рднрдПрдХреЛрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдпреЛред рд╡рд┐рдХрд┐ рд▓реЗрдЦ, Habr├й рдорд╛ рд▓реЗрдЦ.
  • COBYLA тАФ MARE Constrained Optimization by Linear approximation, constrained Optimization with linear approximation (gradient Calculation рдмрд┐рдирд╛)ред рд╡рд┐рдХрд┐ рд▓реЗрдЦ.

рдЫрдиреМрдЯ рдЧрд░рд┐рдПрдХреЛ рд╡рд┐рдзрд┐рдХреЛ рдЖрдзрд╛рд░рдорд╛, рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рд╕рд░реНрддрд╣рд░реВ рд░ рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ рдлрд░рдХ рд░реВрдкрдорд╛ рд╕реЗрдЯ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН:

  • рд╡рд░реНрдЧ рд╡рд╕реНрддреБ 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) рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреНрд╖реЗрддреНрд░ (рд╡рд┐рдзрд┐="trust-constr") рдорд╛ рдПрдХ рд╕рд╢рд░реНрдд рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдкреНрд░рдпреЛрдЧ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╡рд╕реНрддреБрд╣рд░реБ рдХреЛ рд░реВрдк рдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрд╡рд░реЛрдзрд╣рд░реБ рд╕рдВрдЧред Bounds, LinearConstraint, NonlinearConstraint ;
2) рдХрдо рд╕реЗ рдХрдо рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ (рд╡рд┐рдзрд┐ = "SLSQP") рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреНрд░рдордмрджреНрдз рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩрд▓рд╛рдИ рд╢рдмреНрджрдХреЛрд╢рдХреЛ рд░реВрдкрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реНред {'type', 'fun', 'jac', 'args'};
3) рд╡реЗрдм рд╕реНрдЯреБрдбрд┐рдпреЛрдХреЛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдирд┐рд░реНрдорд┐рдд рдЙрддреНрдкрд╛рджрдирд╣рд░реВрдХреЛ рдЕрдиреБрдХреВрд▓рдирдХреЛ рдЙрджрд╛рд╣рд░рдгрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рд╕рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐="trust-constr"

рд╡рд┐рдзрд┐рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди trust-constr рдорд╛ рдЖрдзрд╛рд░рд┐рдд EQSQP рд╕рдорд╛рдирддрд╛ рд░ рдЕрдиреНрдп рдХреЛ рд░реВрдк рдХреЛ рдмрд╛рдзрд╛ рд╕рдВрдЧ рд╕рдорд╕реНрдпрд╛рд╣рд░реБ рдХреЛ рд▓рд╛рдЧреА рдпрд╛рддреНрд░рд╛ рдЕрд╕рдорд╛рдирддрд╛ рдХреЛ рд░реВрдк рдорд╛ рдЕрд╡рд░реЛрдз рд╕рдВрдЧ рд╕рдорд╕реНрдпрд╛рд╣рд░реБ рдХреЛ рд▓рд╛рдЧреАред рджреБрдмреИ рд╡рд┐рдзрд┐рд╣рд░реВ рдПрд▓реНрдЧреЛрд░рд┐рджрдорд╣рд░реВрджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреНрд╖реЗрддреНрд░рдорд╛ рд╕реНрдерд╛рдиреАрдп рдиреНрдпреВрдирддрдо рдлреЗрд▓рд╛ рдкрд╛рд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рд▓рд╛рдЧреВ рдЧрд░рд┐рдиреНрдЫ рд░ рдареВрд▓рд╛-рдареВрд▓рд╛ рд╕рдорд╕реНрдпрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрдд рдЫрдиреНред

рд╕рд╛рдорд╛рдиреНрдп рд░реВрдкрдорд╛ рдиреНрдпреВрдирддрдо рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреЗ рд╕рдорд╕реНрдпрд╛рдХреЛ рдЧрдгрд┐рддреАрдп рд╕реВрддреНрд░реАрдХрд░рдг:

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

рдХрдбрд╛ рд╕рдорд╛рдирддрд╛ рдмрд╛рдзрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рддрд▓реНрд▓реЛ рд╕реАрдорд╛ рдорд╛рдерд┐рд▓реНрд▓реЛ рд╕реАрдорд╛ рдмрд░рд╛рдмрд░ рд╕реЗрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди.
рдПрдХрддрд░реНрдлреА рдЕрд╡рд░реЛрдзрдХреЛ рд▓рд╛рдЧрд┐, рдорд╛рдерд┐рд▓реНрд▓реЛ рд╡рд╛ рддрд▓реНрд▓реЛ рд╕реАрдорд╛ рд╕реЗрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ np.inf рд╕рдореНрдмрдиреНрдзрд┐рдд рдЪрд┐рдиреНрд╣ рд╕рдВрдЧред
рджреБрдИ рдЪрд░рд╣рд░реВрдХреЛ рдЬреНрдЮрд╛рдд рд░реЛрдЬреЗрдирдмреНрд░реЛрдХ рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рдиреНрдпреВрдирддрдо рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрди рджрд┐рдиреБрд╣реЛрд╕реН:

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдирд┐рдореНрди рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ рдпрд╕рдХреЛ рдкрд░рд┐рднрд╛рд╖рд╛рдХреЛ рдбреЛрдореЗрдирдорд╛ рд╕реЗрдЯ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН:

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

рд╣рд╛рдореНрд░реЛ рдорд╛рдорд▓рд╛ рдорд╛, рдмрд┐рдиреНрджреБ рдорд╛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕рдорд╛рдзрд╛рди рдЫ SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди, рдЬрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдХреЗрд╡рд▓ рдкрд╣рд┐рд▓реЛ рд░ рдЪреМрдереЛ рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ рдорд╛рдиреНрдп рдЫрдиреНред
рддрд▓рджреЗрдЦрд┐ рдорд╛рдерд┐рд╕рдореНрдо рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ рдорд╛рд░реНрдлрдд рдЬрд╛рдФрдВ рд░ рд╣реЗрд░реМрдВ рдХрд┐ рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдХрд╕рд░реА рд╕реНрдХрд╛рдЗрдкреАрдорд╛ рд▓реЗрдЦреНрди рд╕рдХреНрдЫреМрдВред
рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди ╨╕ SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди Bounds рд╡рд╕реНрддреБ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдпрд╕рд▓рд╛рдИ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реМрдВред

from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])

рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди ╨╕ SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди рдпрд╕рд▓рд╛рдИ рд░реЗрдЦреАрдп рд░реВрдкрдорд╛ рд▓реЗрдЦреМрдВ:

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

рдпреА рдмрд╛рдзрд╛рд╣рд░реВрд▓рд╛рдИ LinearConstraint рд╡рд╕реНрддреБрдХреЛ рд░реВрдкрдорд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реМрдВ:

import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])

рд░ рдЕрдиреНрддрдорд╛ рдореНрдпрд╛рдЯреНрд░рд┐рдХреНрд╕ рдлрд╛рд░рдордорд╛ рдирдирд▓рд╛рдЗрдирд░ рдмрд╛рдзрд╛:

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

рд╣рд╛рдореА рдпреЛ рдмрд╛рдзрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЬреЗрдХреЛрдмрд┐рдпрди рдореНрдпрд╛рдЯреНрд░рд┐рдХреНрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрдЫреМрдВ рд░ рд╣реЗрд╕рд┐рдпрди рдореНрдпрд╛рдЯреНрд░рд┐рдХреНрд╕рдХреЛ рдПрдХ рд╕реНрд╡реИрдЪреНрдЫрд┐рдХ рднреЗрдХреНрдЯрд░рдХреЛ рд╕рд╛рде рдПрдХ рд░реЗрдЦреАрдп рд╕рдВрдпреЛрдЬрдиред SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди:

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

рдЕрдм рд╣рд╛рдореА рдПрдХ nonlinear рдЕрд╡рд░реЛрдз рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рд░реВрдк рдорд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ 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)

рдпрджрд┐ рд╕рд╛рдЗрдЬ рдареБрд▓реЛ рдЫ рднрдиреЗ, matrices рд▓рд╛рдИ рд╕реНрдкреЗрд░реНрд╕ рдлрд╛рд░рдордорд╛ рдкрдирд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ:

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)

рд╣реЗрд╕рд┐рдпрди рдореНрдпрд╛рдЯреНрд░рд┐рдХреНрд╕ рдЧрдгрдирд╛ рдЧрд░реНрджрд╛ SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди рдзреЗрд░реИ рдкреНрд░рдпрд╛рд╕ рдЖрд╡рд╢реНрдпрдХ рдЫ, рддрдкрд╛рдИрдВ рдПрдХ рдХрдХреНрд╖рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ 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 рд╡рд┐рдзрд┐ рдлрд╛рд░рдордорд╛ рдХрд╛рд░реНрдпрд▓рд╛рдИ рдиреНрдпреВрдиреАрдХрд░рдг рдЧрд░реНрдиреЗ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдбрд┐рдЬрд╛рдЗрди рдЧрд░рд┐рдПрдХреЛ рд╣реЛ:

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

рдХрд╣рд╛рдБ SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди ╨╕ SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди - рд╕рдорд╛рдирддрд╛ рд╡рд╛ рдЕрд╕рдорд╛рдирддрд╛рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рд╣рд░реВрдХреЛ рд╕реВрдЪрдХрд╛рдВрдХрд╣рд░реВрдХреЛ рд╕реЗрдЯред SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди - рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рдкрд░рд┐рднрд╛рд╖рд╛рдХреЛ рдбреЛрдореЗрдирдХреЛ рд▓рд╛рдЧрд┐ рддрд▓реНрд▓реЛ рд░ рдорд╛рдерд┐рд▓реНрд▓реЛ рд╕реАрдорд╛рд╣рд░реВрдХреЛ рд╕реЗрдЯрд╣рд░реВред

рд░реИрдЦрд┐рдХ рд░ рдЧреИрд░рд░реЗрдЦреАрдп рдЕрд╡рд░реЛрдзрд╣рд░реВ рдХреБрдЮреНрдЬреАрд╣рд░реВрд╕рдБрдЧ рд╢рдмреНрджрдХреЛрд╢рдХреЛ рд░реВрдкрдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫ 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]

рдпреЛ рддреНрд░реБрдЯрд┐ рд╣реЛрдЗрди; рдЕрдзрд┐рдХрддрдо рдЦреЛрдЬреНрджрд╛, рдЙрджреНрджреЗрд╢реНрдп рдкреНрд░рдХрд╛рд░реНрдп рд╡рд┐рдкрд░рд┐рдд рдЪрд┐рдиреНрд╣рдХреЛ рд╕рд╛рде рдиреНрдпреВрдирддрдо рд╣реБрдиреНрдЫред

рдЕрд░реНрдХреЛ рдЪрд░рдг рднрдиреЗрдХреЛ рд╣рд╛рдореНрд░рд╛ рдХрд░реНрдордЪрд╛рд░реАрд╣рд░реВрд▓рд╛рдИ рдмрдвреА рдХрд╛рдо рдЧрд░реНрдирдмрд╛рдЯ рдирд┐рд╖реЗрдз рдЧрд░реНрдиреБ рд░ рдХрд╛рдо рдЧрд░реНрдиреЗ рдШрдгреНрдЯрд╛рдорд╛ рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрдиреБ рд╣реЛ:

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

рдХреЗ рдмрд░рд╛рдмрд░ рдЫ:

SciPy, рд╕рд░реНрддрд╣рд░реВрдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

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 рд╕рдВрд░рдЪрдирд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди (Habr├й рдорд╛ рд▓реЗрдЦ) рдорд╛ рд╣реЗрд░реНрди рд╕рдХрд┐рдиреНрдЫ рд╕реНрдХрд┐рдкреА-рдХреБрдХрдмреБрдХ.

рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рдореБрдЦреНрдп рд╕реНрд░реЛрдд рд╣реЛ docs.scipy.orgрдпреЛ рд░ рдЕрдиреНрдп рдЦрдгреНрдбрд╣рд░реВрдХреЛ рдЕрдиреБрд╡рд╛рджрдорд╛ рдпреЛрдЧрджрд╛рди рдЧрд░реНрди рдЪрд╛рд╣рдиреЗрд╣рд░реВ scipy рд╕реНрд╡рд╛рдЧрдд рдЫ GitHub.

╨б╨┐╨░╤Б╨╕╨▒╨╛ рдореЗрдлрд┐рд╕реНрдЯреЛрдлрд┐рд╕ рдкреНрд░рдХрд╛рд╢рдирдХреЛ рддрдпрд╛рд░реАрдорд╛ рд╕рд╣рднрд╛рдЧрд┐рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди