SciPy, рдЕрдЯреАрдВрд╕рд╣ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди

SciPy, рдЕрдЯреАрдВрд╕рд╣ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди

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 рдЖрдзрд╛рд░реАрдд 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, рдЕрдЯреАрдВрд╕рд╣ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди

рдЖрддрд╛ рдЖрдкрдг рдиреЙрдирд▓рд╛рдЗрдирд░ рдХрдВрд╕реНрдЯреНрд░реЗрдВрдЯрд▓рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореНрд╣рдгреВрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реВ рд╢рдХрддреЛ 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')

рдорд░реНрдпрд╛рджрд╛рдВрд╕рд╛рдареА рдЬреЗрдХреЛрдмрд┐рдпрди рдореЕрдЯреНрд░рд┐рдХреНрд╕ рджреЗрдЦреАрд▓ рдорд░реНрдпрд╛рджрд┐рдд рдлрд░рдХ рд╡рд╛рдкрд░реВрди рдореЛрдЬрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рддрдерд╛рдкрд┐, рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рд╣реЗрд╕рд┐рдпрди рдореЕрдЯреНрд░рд┐рдХреНрд╕ рдорд░реНрдпрд╛рджрд┐рдд рдлрд░рдХ рд╡рд╛рдкрд░реВрди рдореЛрдЬрд▓реЗ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА. 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛