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

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

SciPy (рдЙрдЪреНрдЪрд╛рд░рдг рд╕рд╛рдИ рдкрд╛рдИ) рдПрдХ рд╕реБрдкреА-рдЖрдзрд╛рд░рд┐рдд рдЧрдгрд┐рдд рдкреИрдХреЗрдЬ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реА рдФрд░ рдлреЛрд░рдЯреНрд░рд╛рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред SciPy рдЖрдкрдХреЗ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдкрд╛рдпрдерди рд╕рддреНрд░ рдХреЛ MATLAB, IDL, рдСрдХреНрдЯреЗрд╡, R, рдпрд╛ SciLab рдЬреИрд╕реЗ рд╕рдВрдкреВрд░реНрдг рдбреЗрдЯрд╛ рд╡рд┐рдЬреНрдЮрд╛рди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

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

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

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 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдИрдХреНрдпреВрдПрд╕рдХреНрдпреВрдкреА рд╕рдорд╛рдирддрд╛ рдЖрджрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╛рддреНрд░рд╛ рдЕрд╕рдорд╛рдирддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдПред рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреЛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдиреНрдпреВрдирддрдо рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред

рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рдиреНрдпреВрдирддрдо рдЬреНрдЮрд╛рдд рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЧрдгрд┐рддреАрдп рд╕реВрддреНрд░реАрдХрд░рдг:

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

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

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

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

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

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдП рдЧрдП рд╣реИрдВ:

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

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

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

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

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

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

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдЕрдиреВрдард╛ рд╕рдорд╛рдзрд╛рди рд╣реИ SciPy, рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рдФрд░ рдЪреМрдерд╛ рдкреНрд░рддрд┐рдмрдВрдз рд╣реА рдорд╛рдиреНрдп рд╣реИред
рдЖрдЗрдП рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рддрдХ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ scipy рдореЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реАрдорд╛рдПрдВ SciPy, рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди ╨╕ SciPy, рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди рдЖрдЗрдП рдЗрд╕реЗ рдмрд╛рдЙрдВрдбреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред

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, рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди

рдЕрдм рд╣рдо рдПрдХ рдЕрд░реИрдЦрд┐рдХ рдмрд╛рдзрд╛ рдХреЛ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ 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)

рд╣реЗрд╕реНрд╕рд┐рдпрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп 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')

рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬреИрдХреЛрдмрд┐рдпрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдкрд░рд┐рдорд┐рдд рдЕрдВрддрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЗрд╕рд┐рдпрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдкрд░рд┐рдорд┐рдд рдЕрдВрддрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╣реЗрд╕рд┐рдпрди рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ 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 рдЯреНрд░ рд╕реЗред

рд╣рдорд╛рд░реА рдорд┐рддреНрд░рддрд╛рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдЯреАрдо рдореЗрдВ рдЪрд╛рд░ рдЬреВрдирд┐рдпрд░, рджреЛ рдорд┐рдбрд┐рд▓ рдФрд░ рдПрдХ рд╕реАрдирд┐рдпрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрдирдХрд╛ рдорд╛рд╕рд┐рдХ рдХрд╛рд░реНрдп рд╕рдордп рдирд┐рдзрд┐:

  • рдЬреВрди: 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 рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╢реИрдХреНрд╖рдгрд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдЗрддрдиреА рд╣рд╛рд╕реНрдпрдкреНрд░рдж рдкреНрд░рдХреГрддрд┐ рдХрд╛ рд╣реИред

рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдЖрднрд╛рд╕реА рдЙрджрд╛рд╣рд░рдг рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдИ.рдПрд▓. рдЕрдХреБрд▓рд┐рдЪ рдХреА рдкреБрд╕реНрддрдХ "рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рдЧрдгрд┐рддреАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред" рдЕрдзрд┐рдХ рдХрдЯреНрдЯрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ scipy.optimize рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рд╕реЗ рдПрдХ 3рдбреА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рд╣реЗрдмреНрд░реЗ рдкрд░ рд▓реЗрдЦ) рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ scipy-рд░рд╕реЛрдИ рдХреА рдХрд┐рддрд╛рдм.

рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдореБрдЦреНрдп рд╕реНрд░реЛрдд рд╣реИ docs.scipy.orgрдЬреЛ рд▓реЛрдЧ рдЗрд╕ рдФрд░ рдЕрдиреНрдп рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ scipy рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ GitHub.

рдзрдиреНрдпрд╡рд╛рдж mephistophees рдкреНрд░рдХрд╛рд╢рди рдХреА рддреИрдпрд╛рд░реА рдореЗрдВ рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рд▓рд┐рдП.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ