
SciPy (рд╕реНрдкрд╖реНрдЯ рд╕рд╛рдИ рдкрд╛рдИ) рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЖрдзрд╛рд░рд┐рдд рдЧрдгрд┐рдд рдкреИрдХреЗрдЬ рд╣реИ рдЬрд┐рд╕рдореЗрдВ C рдФрд░ рдлреЛрд░рдЯреНрд░рд╛рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред SciPy рдХреЗ рд╕рд╛рде, рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдкрд╛рдпрдерди рд╕рддреНрд░ MATLAB, IDL, рдСрдХреНрдЯреЗрд╡, R, рдпрд╛ SciLab рдЬреИрд╕реЗ рд╕рдВрдкреВрд░реНрдг рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдЕрдиреБрдЪреНрдЫреЗрдж рдореЗрдВ, рд╣рдо рдЧрдгрд┐рддреАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдмреБрдирд┐рдпрд╛рджреА рддрдХрдиреАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ - scipy.optimize рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдЪрд░ рдХреЗ рдПрдХ рд╕реНрдХреЗрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ред рдмрд┐рдирд╛ рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдХреИрдкреА рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдФрд░ рдЕрджреНрдпрддрд┐рдд рдорджрдж рд╣рдореЗрд╢рд╛ рдорджрдж () рдХрдорд╛рдВрдб, рд╢рд┐рдлреНрдЯ + рдЯреИрдм, рдпрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдкрд░рд┐рдЪрдп
Scipy.optimize рдкреИрдХреЗрдЬ рдореЗрдВ рд╕рд╢рд░реНрдд рдФрд░ рдмрд┐рдирд╛ рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ minimize()
рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рддрд░реАрдХрд╛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдПрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╢реЛрдзрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рд░рд╣рддрд╛ рд╣реИред
рдПрдХ рдЙрдкрдпреБрдХреНрдд рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рддрд░реНрдХ рдХреЛ minimize(..., method="")
рд╕реЗ minimize(..., method="")
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХрдИ рдЪрд░ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:
trust-constr
- рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдиреНрдпреВрдирддрдо рдХреЗ рд▓рд┐рдП рдЦреЛрдЬред рд╡рд┐рдХреА рд▓реЗрдЦ ; рд╣рдмрд░ рд▓реЗрдЦ ;SLSQP
- рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдорд┐рдХ рджреНрд╡рд┐рдШрд╛рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рд▓реИрдЧрд░реЗрдВрдЬ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдиреНрдпреВрдЯреЛрдирд┐рдпрди рддрд░реАрдХрд╛ред рд╡рд┐рдХреА рд▓реЗрдЦ редTNC
- рд╕реАрдорд┐рдд рдиреНрдпреВрдЯрди рд╡рд┐рд╡рд╢, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рдЪрд░ рдХреЗ рд╕рд╛рде рдЧреИрд░-рд░реЗрдЦреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред рд╡рд┐рдХреА рд▓реЗрдЦ редL-BFGS-B
- рдЪрд╛рд░ рдмреНрд░рд╛рдпрдбреЗрди рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ - рдлреНрд▓реЗрдЪрд░ - рдЧреЛрд▓реНрдбрдлрд░реНрдм - рд╢рдиреНрдиреЛ, рд╣реЗрд╕рд┐рдпрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рдЖрдВрд╢рд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рдХрдо рдореЗрдореЛрд░реА рдЦрдкрдд рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд┐рдХреА рд▓реЗрдЦ, рд╣реИрдмрд░ рд▓реЗрдЦ редCOBYLA
- MARE рд░реИрдЦрд┐рдХ рдЕрдиреБрдореЛрджрди рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╡рд╢ рдЕрдиреБрдХреВрд▓рди, рд░реИрдЦрд┐рдХ рд╕рдиреНрдирд┐рдХрдЯрди рдХреЗ рд╕рд╛рде рд╕реАрдорд┐рдд рдЕрдиреБрдХреВрд▓рди (рдврд╛рд▓ рдЧрдгрдирд╛ рдХреЗ рдмрд┐рдирд╛)ред рд╡рд┐рдХреА рд▓реЗрдЦ ред
рдЪреБрдиреА рд╣реБрдИ рд╡рд┐рдзрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд░реНрддреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рдПрд▓-рдмреАрдПрдлрдЬреАрдПрд╕-рдмреА, рдЯреАрдПрдирд╕реА, рдПрд╕рдПрд▓рдПрд╕рдХреНрдпреВрдкреА, рдЯреНрд░рд╕реНрдЯ-рдХреЙрд╕реНрдЯрд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП
Bounds
рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ; - рд╕рдорд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА
(min, max)
L-BFGS-B, TNC, SLSQP, рд╡рд┐рд╢реНрд╡рд╛рд╕-рдкреНрд░рддрд┐рдмрдВрдз; - рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реВрдЪреА
LinearConstraint
, NonlinearConstraint
рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП COBYLA, SLSQP, рдЯреНрд░рд╕реНрдЯ-рдХреЙрд╕реНрдЯрд░; - рд╢рдмреНрджрдХреЛрд╢ рдпрд╛ рд╢рдмреНрджрдХреЛрд╖ рд╕реВрдЪреА
{'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt}
рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп, 'рдЬреЗрдХ {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt}
рдХреЙрд▓ рдХрд░рдиреЗ {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt}
COBYLA, SLSQP рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдПред
рд▓реЗрдЦ рдХреА рд░реВрдкрд░реЗрдЦрд╛:
1) рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЖрд╡реЗрджрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рд╡рд┐рдзрд┐ = "рд╡рд┐рд╢реНрд╡рд╛рд╕-рдмрд╛рдзрд╛") Bounds
рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде, LinearConstraint
, NonlinearConstraint
рдСрдмреНрдЬреЗрдХреНрдЯ;
2) рдПрдХ рд╢рдмреНрджрдХреЛрд╢ {'type', 'fun', 'jac', 'args'}
рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдорд┐рдХ рдХрдо рд╕реЗ рдХрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рд╡рд┐рдзрд┐ = "SLSQP") рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ;
3) рд╡реЗрдм рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ред
рд╕рд╢рд░реНрдд рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐ = "рд╡рд┐рд╢реНрд╡рд╛рд╕-рдмрд╛рдзрд╛"
trust-constr
рдХрд╛рд╕реНрдЯ trust-constr
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдорд╛рдирддрд╛ рдХреЗ рд░реВрдк рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрд╕рдорд╛рдирддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП TRIP рдкрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП EQSQP рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреЛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдиреНрдпреВрдирддрдо рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рдиреНрдпреВрдирддрдо рдЦреЛрдЬ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЧрдгрд┐рддреАрдп рд╕реВрддреНрд░реАрдХрд░рдг:
minxf(x)
cl leqc(x) leqcu,
xl leqx leqxu
рд╕рдЦреНрдд рд╕рдорд╛рдирддрд╛ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдирд┐рдЪрд▓реА рд╕реАрдорд╛ рдКрдкрд░реА рдХреЗ рдмрд░рд╛рдмрд░ рд╕реЗрдЯ рд╣реЛрддреА рд╣реИ clj=cuj ред
рдПрдХ-рддрд░рдлрд╝рд╛ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд▓рд┐рдП, np.inf
рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмрдВрдзрд┐рдд рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рдПрдХ рдКрдкрд░реА рдпрд╛ рдирд┐рдЪрд▓реА рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
рдЪрд▓реЛ рджреЛ рдЪрд░реЛрдВ рдХреЗ рдЬреНрдЮрд╛рдд рд░реЛрд╕реЗрдирдмреНрд░реЛрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдиреНрдпреВрдирддрдо рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
minx0,x1100(x0тИТx21)2+(1тИТx0)2
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдмрдВрдз рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдкрдиреЗ рдбреЛрдореЗрди рдкрд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ:
x20+x1 leq1
x20тИТx1 leq1
2x0+x1=1
x0+2x1 leq1
0 leqx0 leq1
тИТ0.5 leqx1 leq2.0
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдЕрдиреВрдард╛ рд╕рдорд╛рдзрд╛рди рд╣реИ [x0,x1]=[0.4149,0.1701] рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдФрд░ рдЪреМрдереЗ рдкреНрд░рддрд┐рдмрдВрдз рдорд╛рдиреНрдп рд╣реИрдВред
рдЪрд▓реЛ рдиреАрдЪреЗ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдЙрдиреНрд╣реЗрдВ рдбрд░рдкреЛрдХ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рддрд┐рдмрдВрдз 0 leqx0 leq1 рдФрд░ тИТ0.5 leqx1 leq2.0 рд╕реАрдорд╛ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред
from scipy.optimize import Bounds bounds = Bounds ([0, -0.5], [1.0, 2.0])
рдкреНрд░рддрд┐рдмрдВрдз x0+2x1 leq1 рдФрд░ 2x0+x1=1 рд╣рдо рд░реИрдЦрд┐рдХ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
\ start {bmatrix} - \ infty \\ 1 \ end {bmatrix} \ leq \ start {bmatrix} 1 & 2 \\ 2 & 1 \ end {bmatrix} \ start {bmatrix} x__ \\ x_1 \ end {bmatrix } \ leq \ start {bmatrix} 1 \\ 1 \ end {bmatrix}
\ start {bmatrix} - \ infty \\ 1 \ end {bmatrix} \ leq \ start {bmatrix} 1 & 2 \\ 2 & 1 \ end {bmatrix} \ start {bmatrix} x__ \\ x_1 \ end {bmatrix } \ leq \ start {bmatrix} 1 \\ 1 \ end {bmatrix}
рдЗрди рдЕрдбрд╝рдЪрдиреЛрдВ рдХреЛ рдПрдХ рд░реЗрдЦрд╛рдХреГрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
import numpy as np from scipy.optimize import LinearConstraint linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореИрдЯреНрд░рд┐рдХреНрд╕ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрд░реЗрдЦреАрдп рдмрд╛рдзрд╛:
c(x)= startbmatrixx20+x1x20тИТx1 endbmatrix leq startbmatrix11 рдЕрдВрддbrixrix
рд╣рдо рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд▓рд┐рдП рдЬреИрдХреЛрдмреА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рд╣реЗрд╕рд┐рдпрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд░реИрдЦрд┐рдХ рд╕рдВрдпреЛрдЬрди рдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рд╡реА :
J (x) = \ start {bmatrix} 2x_0 & 1 \\ 2x_0 & -1 \ end {bmatrix}
H (x, v) = \ sum \ limit_ {i = 0} ^ 1 v_i \ nabla ^ 2 c_i (x) = v_0 \ start {bmatrix} 2 рдФрд░ 0 \\ 2 & 0 \ рдЕрдВрдд / bmatrix} + v_1 \ рд╢реБрд░реВ {bmatrix} 2 рдФрд░ 0 \\ 2 рдФрд░ 0 \ рдЕрдВрдд {bmatrix}
рдЕрдм рд╣рдо рдиреЙрдирд▓рд╛рдЗрдирд░ рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдХреЛ 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)
рдЬрдм рд╣реЗрд╕рд┐рдпрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЧрдгрдирд╛ H(x,v) рдорд╣рдВрдЧрд╛, рдЖрдк HessianUpdateStrategy
рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рдгрдиреАрддрд┐рдпрд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: BFGS
рдФрд░ BFGS
ред
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]
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╣реЗрд╕рд┐рдпрди рдЧрдгрдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд┐рдирд┐рдпрд░рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
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 рд╡рд┐рдзрд┐ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдиреНрдпреВрдирддрдо рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
minxf(x)
cj(x)=0,j in mathcalE
cj(x) geq0,j in mathcalI
lbi leqxi lequbi,i=1,...,N
рдЬрд╣рд╛рдБ mathcalE рдФрд░ mathcalI - рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд╕реЗрдЯ рд╕рдорд╛рдирддрд╛ рдпрд╛ рдЕрд╕рдорд╛рдирддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред [lbi,ubi] - рдлрдВрдХреНрд╢рди рдбреЗрдлрд┐рдирд┐рд╢рди рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП рдирд┐рдЪрд▓реЗ рдФрд░ рдКрдкрд░реА рд╕реАрдорд╛ рдХреЗ рд╕реЗрдЯред
рд░реИрдЦрд┐рдХ рдФрд░ nonlinear рдмрд╛рдзрд╛рдУрдВ рдХреБрдВрдЬреА 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]
рдпрд╣ рдХреЛрдИ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ; рдЬрдм рдЕрдзрд┐рдХрддрдо рдХреА рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЙрджреНрджреЗрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдкрд░реАрдд рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдХрдо рд╕реЗ рдХрдо рд╣реЛрддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛ рдХрджрдо рд╣рдорд╛рд░реЗ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдкрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рдХрд╛рд░реНрдп рд╕рдордп рдирд┐рдзрд┐ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ:
\ start {bmatrix} 10 & 20 & 30 \\ 7 & 15 & 20 \\ 5 & 10 & 15 \ end {bmatrix} \ start {bmatrix} x_0 \\ x_1 \\ x_2 \ end {bamrix} \ leq \ {bmatrix} 600 \\ 300 \\ 150 \ end {bmatrix} $ рд╢реБрд░реВ рдХрд░реЗ
рдЬреЛ рд╕рдорддреБрд▓реНрдп рд╣реИ:
\ start {bmatrix} 600 \\ 300 \\ 150 \ end {bmatrix} - \ start {bmatrix} 10 & 20 & 30 \\ 7 & 15 & 20 \\ 5 & 10 & 15 \ end {bmatrix} рд╢реБрд░реВ {bmatrix} x_0 \\ x_1 \\ x_2 \ end {bmatrix} \ geq 0
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 *
; - middles:
8 * 7 + 6 * 15 + 3 * 20 = 206 *
; - рд╡рд░рд┐рд╖реНрда:
8 * 5 + 6 * 10 + 3 * 15 = 145 *
ред
рдирд┐рд╖реНрдХрд░реНрд╖: рдирд┐рд░реНрджреЗрд╢рдХ рдХреЛ рдЙрд╕рдХреА рдЕрдЪреНрдЫреА-рдЦрд╛рд╕реА рдпреЛрдЧреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ 8 рд▓реИрдВрдбрд┐рдВрдЧ, 6 рдордзреНрдпрдо рд╕рд╛рдЗрдЯ рдФрд░ 3 рд╕реНрдЯреЛрд░ рдкреНрд░рддрд┐ рдорд╛рд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд╣реИред рдЗрд╕реА рд╕рдордп, рдорд╢реАрди рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╕реАрдЧреНрдиреЙрд░рд┐рдЯреА рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдордзреНрдп рдХрд╛ рднрд╛рд░ рдЬреВрди рдХреЗ рдЖрдзреЗ рд╕реЗ рдХрдо рд▓рдЧрднрдЧ 2/3 рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рд▓реЗрдЦ scipy.optimize
рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рддрдХрдиреАрдХреЛрдВ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ scipy.optimize
рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЕрдХрд╛рджрдорд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ scipy
рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рд╣рд╛рд╕реНрдпрдкреВрд░реНрдг рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП I L. Akulich рдХреА рдкреБрд╕реНрддрдХ "рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рдЧрдгрд┐рддреАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рд╡рд╛рдЗрдирд░ рдЙрджрд╛рд╣рд░рдг рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ ( рд╣рдм рдкрд░ рдПрдХ рд▓реЗрдЦ ) рдХреЗ рд▓рд┐рдП рдПрдХ 3D рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП scipy.optimize
рдХрд╛ рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдХрдЯреНрдЯрд░ рдЖрд╡реЗрджрди, scipy.optimize
рд░рд╕реЛрдИ рдХреА рдХрд┐рддрд╛рдм рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдореБрдЦреНрдп рд╕реНрд░реЛрдд docs.scipy.org рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рдЗрд╕ рдФрд░ scipy
рдЕрдиреНрдп рдЕрдиреБрднрд╛рдЧреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ GitHub рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ ред
рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХреЗ рд▓рд┐рдП mephistopheies рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред