
SciPy (ΠΏΡΠΎΠΈΠ·Π½Π°ΡΡ ΡΠ΅ ΠΊΠ°ΡΠΎ ΡΠ°ΠΉ ΠΏΠ°ΠΉ) β ΡΠΎΠ²Π° Π΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ, ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° numpy, ΠΊΠΎΠΉΡΠΎ Π²ΠΊΠ»ΡΡΠ²Π° ΡΡΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π° C ΠΈ Fortran. Π‘ SciPy ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π°ΡΠ° ΡΠ΅ΡΠΈΡ Π½Π° Python ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΡΠ° Π² Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π° ΡΡΠ΅Π΄Π° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π½Π° MATLAB, IDL, Octave, R ΠΈΠ»ΠΈ SciLab.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π½Π° ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ β ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° Π·Π°Π΄Π°ΡΠΈ Π·Π° ΡΡΠ»ΠΎΠ²Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠΊΠ°Π»Π°ΡΠ½Π° ΡΡΠ½ΠΊΡΠΈΡ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ° scipy.optimize. ΠΠ»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅ Π·Π° Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π²Π΅ΡΠ΅ Π±ΡΡ Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½ΠΈ Π² . ΠΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π° ΠΈ Π°ΠΊΡΡΠ°Π»Π½Π° ΡΠΏΡΠ°Π²ΠΊΠ° Π·Π° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π½Π° scipy Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° help(), Shift+Tab ΠΈΠ»ΠΈ Π² .
ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ±ΡΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°ΡΠΈ ΠΊΠ°ΠΊΡΠΎ Π·Π° ΡΡΠ»ΠΎΠ²Π½Π°, ΡΠ°ΠΊΠ° ΠΈ Π·Π° Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π² ΠΏΠ°ΠΊΠ΅ΡΠ° scipy.optimize ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΡΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡΡΠ° minimize(). ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π° Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΠ΅ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π΅Π½ Π½Π°ΡΠΈΠ½ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π·Π°Π΄Π°ΡΠΈ, Π·Π°ΡΠΎΠ²Π° ΠΈΠ·Π±ΠΎΡΡΡ Π½Π° Π°Π΄Π΅ΠΊΠ²Π°ΡΠ΅Π½ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΡΠ½ΠΎΠ²ΠΎ Π΅ Π² ΡΡΡΠ΅ΡΠ΅ Π½Π° ΠΈΠ·ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΡΡ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ Π·Π°Π΄Π°Π²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° minimize(..., method="").
ΠΠ° ΡΡΠ»ΠΎΠ²Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΡΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ:
trust-constrβ ΡΡΡΡΠ΅Π½Π΅ Π½Π° Π»ΠΎΠΊΠ°Π»Π΅Π½ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π² Π΄ΠΎΠ²Π΅ΡΠΈΡΠ΅Π»Π½Π° ΠΎΠ±Π»Π°ΡΡ. , ;SLSQPβ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΠΡΡΠΎΠ½ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π½Π° ΠΠ°Π³ΡΠ°Π½ΠΆ. .TNCβ Truncated Newton Constrained, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ ΡΠΈΡΠ»ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ, Π΄ΠΎΠ±ΡΡ Π΅ Π·Π° Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. .L-BFGS-Bβ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΡ ΡΠ΅ΡΠ²ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΡΠΎΠΉΠ΄ΡΠ½βΠ€Π»Π΅ΡΡΡΡβΠΠΎΠ»Π΄ΡΠ°ΡΠ±βΠ¨Π°Π½Π½ΠΎ, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ Ρ Π½Π°ΠΌΠ°Π»Π΅Π½ΠΎ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ°ΡΡΠΈΡΠ½ΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π²Π΅ΠΊΡΠΎΡΠΈ ΠΎΡ ΠΌΠ°ΡΡΠΈΡΠ°ΡΠ° Π½Π° Π₯Π΅Ρ. , .COBYLAβ ΠΠΠΠ«ΠΠ Constrained Optimization By Linear Approximation, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Ρ Π»ΠΈΠ½Π΅ΠΉΠ½Π° Π°ΠΏΠΏΡΠΎΠΊΡΠΈΠΌΠ°ΡΠΈΡ (Π±Π΅Π· ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ°). .
Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΠΈΠ·Π±ΡΠ°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄, ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ° ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡΠ° Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ° ΡΠ΅ Π·Π°Π΄Π°Π²Π°Ρ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½:
- ΠΎΠ±Π΅ΠΊΡ ΠΎΡ ΠΊΠ»Π°ΡΠ°
BoundsΠ·Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ L-BFGS-B, TNC, SLSQP, trust-constr; - ΡΠΏΠΈΡΡΠΊ
(min, max)Π·Π° ΡΡΡΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ L-BFGS-B, TNC, SLSQP, trust-constr; - ΠΎΠ±Π΅ΠΊΡ ΠΈΠ»ΠΈ ΡΠΏΠΈΡΡΠΊ ΠΎΡ ΠΎΠ±Π΅ΠΊΡΠΈ
LinearConstraint,NonlinearConstraintΠ·Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ COBYLA, SLSQP, trust-constr; - ΡΠ»ΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΡΠΏΠΈΡΡΠΊ ΠΎΡ ΡΠ΅ΡΠ½ΠΈΡΠΈ
{'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt}Π·Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ COBYLA, SLSQP.
ΠΠ»Π°Π½ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ°:
1) ΠΠ° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π°Π»Π³ΠΎΡΠΈΡΡΡΠ° Π·Π° ΡΡΠ»ΠΎΠ²Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π² Π΄ΠΎΠ²Π΅ΡΠΈΡΠ΅Π»Π½Π°ΡΠ° ΠΎΠ±Π»Π°ΡΡ (method=Β»trust-constrΒ») Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ ΠΊΠ°ΡΠΎ ΠΎΠ±Π΅ΠΊΡΠΈ Bounds, LinearConstraint, NonlinearConstraint ;
2) ΠΠ° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ ΡΡΠ΅Π· ΠΌΠ΅ΡΠΎΠ΄Π° Π½Π° Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΈΡΠ΅ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈ (method=Β»SLSQPΒ») Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ ΠΊΠ°ΡΠΎ ΡΠ΅ΡΠ½ΠΈΠΊ {'type', 'fun', 'jac', 'args'};
3) ΠΠ° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π° ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ ΡΡΠ΅Π· ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡ ΡΠ΅Π± ΡΡΡΠ΄ΠΈΠΎ.
Π£ΡΠ»ΠΎΠ²Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ method=Β»trust-constrΒ»
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° trust-constr Π΅ ΠΎΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° Π·Π° Π·Π°Π΄Π°ΡΠΈ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΎΡ Π²ΠΈΠ΄Π° ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ ΠΈ Π½Π° Π·Π° Π·Π°Π΄Π°ΡΠΈ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°. Π Π΄Π²Π°ΡΠ° ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π° ΡΡΡΡΠ΅Π½Π΅ Π½Π° Π»ΠΎΠΊΠ°Π»Π΅Π½ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π² Π΄ΠΎΠ²Π΅ΡΠΈΡΠ΅Π»Π½Π°ΡΠ° ΠΎΠ±Π»Π°ΡΡ ΠΈ ΡΠ° ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈ Π·Π° ΠΌΠ°ΡΠ°Π±Π½ΠΈ Π·Π°Π΄Π°ΡΠΈ.
ΠΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ° ΡΠΎΡΠΌΡΠ»ΠΈΡΠΎΠ²ΠΊΠ° Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ° Π·Π° Π½Π°ΠΌΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π² ΠΎΠ±Ρ Π²ΠΈΠ΄:



ΠΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΡΡΡΠΈΠΊΡΠ½ΠΎ ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ Π΄ΠΎΠ»Π½Π°ΡΠ° Π³ΡΠ°Π½ΠΈΡΠ° ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° ΡΠ°Π²Π½Π° Π½Π° Π³ΠΎΡΠ½Π°ΡΠ°
.
ΠΠ° Π΅Π΄Π½ΠΎΡΡΡΠ°Π½Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π³ΠΎΡΠ½Π°ΡΠ° ΠΈΠ»ΠΈ Π΄ΠΎΠ»Π½Π°ΡΠ° Π³ΡΠ°Π½ΠΈΡΠ° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ np.inf Ρ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡ Π·Π½Π°ΠΊ.
ΠΠ΅ΠΊΠ° Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π½Π° ΠΈΠ·Π²Π΅ΡΡΠ½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π° Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊ ΠΎΡ Π΄Π²Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ:

ΠΡΠΈ ΡΠΎΠ²Π° ΡΠ° Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° Π½Π΅ΠΉΠ½ΠΎΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:






Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΠΈΠΌΠ° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΡΠΎΡΠΊΠ°
, Π·Π° ΠΊΠΎΡΡΠΎ Π²Π°ΠΆΠ°Ρ ΡΠ°ΠΌΠΎ ΠΏΡΡΠ²ΠΎΡΠΎ ΠΈ ΡΠ΅ΡΠ²ΡΡΡΠΎΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅.
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡΠ° ΠΎΡΠ΄ΠΎΠ»Ρ Π½Π°Π³ΠΎΡΠ΅ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΈ Π·Π°ΠΏΠΈΡΠ΅ΠΌ Π² scipy.
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ
ΠΈ
Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡΠ° Bounds.
from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ
ΠΈ
Π΄Π° Π·Π°ΠΏΠΈΡΠ΅ΠΌ Π² Π»ΠΈΠ½Π΅ΠΉΠ½Π° ΡΠΎΡΠΌΠ°:

ΠΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΠ΅Π·ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡ LinearConstraint:
import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])Π Π½Π°ΠΊΡΠ°Ρ, Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π² ΠΌΠ°ΡΡΠΈΡΠ½Π° ΡΠΎΡΠΌΠ°:

ΠΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π―ΠΊΠΎΠ±ΠΈΠ΅Π²Π°ΡΠ° ΠΌΠ°ΡΡΠΈΡΠ° Π·Π° ΡΠΎΠ²Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΎΡ Π₯Π΅ΡΠΎΠ²Π°ΡΠ° ΠΌΠ°ΡΡΠΈΡΠ° Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Π²Π΅ΠΊΡΠΎΡ
:


Π‘Π΅Π³Π° Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΠΊΠ°ΡΠΎ ΠΎΠ±Π΅ΠΊΡ NonlinearConstraint:
from scipy.optimize import NonlinearConstraint
def cons_f(x):
return [x[0]**2 + x[1], x[0]**2 - x[1]]
def cons_J(x):
return [[2*x[0], 1], [2*x[0], -1]]
def cons_H(x, v):
return v[0]*np.array([[2, 0], [0, 0]]) + v[1]*np.array([[2, 0], [0, 0]])
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=cons_H)ΠΠΊΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡΡ Π΅ Π³ΠΎΠ»ΡΠΌ, ΠΌΠ°ΡΡΠΈΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΠΈ Π² ΡΡΠ΄ΡΠΊ Π²ΠΈΠ΄:
from scipy.sparse import csc_matrix
def cons_H_sparse(x, v):
return v[0]*csc_matrix([[2, 0], [0, 0]]) + v[1]*csc_matrix([[2, 0], [0, 0]])
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1,
jac=cons_J, hess=cons_H_sparse)ΠΈΠ»ΠΈ ΠΊΠ°ΡΠΎ ΠΎΠ±Π΅ΠΊΡ LinearOperator:
ΠΎΡ scipy.sparse.linalg ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ 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)
Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ = ΠΠ΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅(cons_f, -np.inf, 1,
jac=cons_J, hess=cons_H_linear_operator)ΠΠΎΠ³Π°ΡΠΎ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π₯Π΅ΡΠΎΠ²Π°ΡΠ° ΠΌΠ°ΡΡΠΈΡΠ°
ΠΈΠ·ΠΈΡΠΊΠ²Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΡΠ°Π·Ρ
ΠΎΠ΄ΠΈ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ»Π°ΡΡΡ . ΠΠΎΡΡΡΠΏΠ½ΠΈ ΡΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ: BFGS ΠΈ SR1.
ΠΎΡ scipy.optimize ΠΈΠΌΠΏΠΎΡΡ BFGS
Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ = ΠΠ΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅(cons_f, -np.inf, 1, jac=cons_J, hess=BFGS())Π₯Π΅ΡΠΎΠ²Π°ΡΠ° ΠΌΠ°ΡΡΠΈΡΠ° ΠΌΠΎΠΆΠ΅ ΡΡΡΠΎ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠ°Π·Π½ΠΎΡΡΠΈ:
Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ = ΠΠ΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅(cons_f, -np.inf, 1, jac='2-point', hess='2-point')Π―ΠΊΠΎΠ²Π°ΡΠ° ΠΌΠ°ΡΡΠΈΡΠ° Π·Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡΠ° ΠΌΠΎΠΆΠ΅ ΡΡΡΠΎ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠ°Π·Π½ΠΎΡΡΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ Π₯Π΅ΡΠΎΠ²Π°ΡΠ° ΠΌΠ°ΡΡΠΈΡΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½Π° Ρ ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠ°Π·Π½ΠΎΡΡΠΈ. Π₯Π΅ΡΠΎΠ²Π°ΡΠ° ΠΌΠ°ΡΡΠΈΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π° ΠΊΠ°ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ»ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠ»Π°Ρ HessianUpdateStrategy.
Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ = ΠΠ΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅(cons_f, -np.inf, 1, jac='2-point', hess=BFGS())Π Π΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΎΠ½Π½Π°ΡΠ° Π·Π°Π΄Π°ΡΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:
ΠΎΡ scipy.optimize ΠΈΠΌΠΏΠΎΡΡ minimize
ΠΎΡ scipy.optimize ΠΈΠΌΠΏΠΎΡΡ 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` ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π½ΠΎΡΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ Π΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠ΅Π½ΠΎ.
ΠΡΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ: 12, ΠΎΡΠ΅Π½ΠΊΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ°: 8, CG ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ: 7, ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΎΡΡ: 2.99e-09, Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ°: 1.11e-16, Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅: 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 (ΠΊΠ²Π°Π·ΠΈ-ΠΡΡΠΎΠ½ΠΎΠ²ΠΎ Π°ΠΏΡΠΎΠΊΡΠΈΠΌΠΈΡΠ°Π½Π΅). ΠΡΠ°Π΄ΠΈΠ΅Π½ΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π°ΠΏΡΠΎΠΊΡΠΈΠΌΠΈΡΠ°Π½ΠΈ Ρ ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠ°Π·Π½ΠΎΡΡΠΈ.
ΠΎΡ scipy.optimize ΠΈΠΌΠΏΠΎΡΡ 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)Π£ΡΠ»ΠΎΠ²Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ method='SLSQP'
ΠΠ΅ΡΠΎΠ΄ΡΡ SLSQP Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°ΡΠΈ Π·Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π°:




ΠΡΠ΄Π΅
ΠΈ
β ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π½Π° ΠΈΠ·ΡΠ°Π·ΠΈ, ΠΎΠΏΠΈΡΠ²Π°ΡΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠ°Π²Π΅Π½ΡΡΠ²Π° ΠΈΠ»ΠΈ Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°.
β ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΠ»Π½ΠΈ ΠΈ Π³ΠΎΡΠ½ΠΈ Π³ΡΠ°Π½ΠΈΡΠΈ Π·Π° ΠΎΠ±Π»Π°ΡΡΡΠ° Π½Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ°.
ΠΠΈΠ½Π΅ΠΉΠ½ΠΈΡΠ΅ ΠΈ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΈΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°Ρ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠ΅ΡΠ½ΠΈΡΠΈ Ρ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΡΠΈΠΏ, Π·Π°Π±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ 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)ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° Π±Π΅ΡΠ΅ Π·Π°Π²ΡΡΡΠ΅Π½Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ. (Π Π΅ΠΆΠΈΠΌ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄ 0)
Π’Π΅ΠΊΡΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ°: 0.34271757499419825
ΠΡΠ΅ΡΠ°ΡΠΈΠΈ: 4
ΠΡΠ΅Π½ΠΊΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ°: 5
ΠΡΠ΅Π½ΠΊΠΈ Π½Π° Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ°: 4
[0.41494475 0.1701105 ]ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ
ΠΡΠ² Π²ΡΡΠ·ΠΊΠ° Ρ ΠΏΡΠ΅Ρ ΠΎΠ΄Π° ΠΊΡΠΌ ΠΏΠ΅ΡΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅Π½ ΡΠΊΠ»Π°Π΄, ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π° ΡΠ΅Π± ΡΡΡΠ΄ΠΈΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π½ΠΈ Π½ΠΎΡΠΈ ΠΌΠ°Π»ΡΠΊ, Π½ΠΎ ΡΡΠ°Π±ΠΈΠ»Π΅Π½ Π΄ΠΎΡ ΠΎΠ΄. ΠΠ° ΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΠ΅ ΡΠΌΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡ Π½Π° Π³Π°Π»Π΅ΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΡΡΠΈ Π²ΠΈΠ΄Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ:
- x0 β ΠΏΡΠΎΠ΄Π°Π²Π°ΡΠΈ Π»Π΅Π½Π΄ΠΈΠ½Π³ΠΈ, ΠΎΡ 10 Ρ.Ρ.
- x1 β ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΈ ΡΠ°ΠΉΡΠΎΠ²Π΅, ΠΎΡ 20 Ρ.Ρ.
- 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]Π’ΠΎΠ²Π° Π½Π΅ Π΅ Π³ΡΠ΅ΡΠΊΠ°, ΠΏΡΠΈ ΡΡΡΡΠ΅Π½Π΅ΡΠΎ Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌΠ° ΡΠ΅Π»Π΅Π²Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ° Ρ ΠΎΠ±ΡΠ°ΡΠ΅Π½ Π·Π½Π°ΠΊ.
Π‘Π»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΡΠΏΠΊΠ° β Π·Π°Π±ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ Π½Π° ΡΠ»ΡΠΆΠΈΡΠ΅Π»ΠΈΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΡΡ Π½Π°Π΄ ΡΠ°ΡΠΎΠ²Π΅ΡΠ΅ ΠΈ Π²ΡΠ²Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΠΎΠ½Π΄Π° Π·Π° ΡΠ°Π±ΠΎΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅:

ΠΠΎΠ΅ΡΠΎ Π΅ Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ Π½Π°:

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 Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° 3D ΡΡΡΡΠΊΡΡΡΠ° ΠΏΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ () ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ Π² .
ΠΡΠ½ΠΎΠ²Π΅Π½ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ β , ΠΆΠ΅Π»Π°Π΅ΡΠΈΡΠ΅ Π΄Π° ΠΊΠΎΠ½ΡΡΠΈΠ±ΡΡΠΈΡΠ°ΡΡ Π² ΠΏΡΠ΅Π²ΠΎΠ΄Π° Π½Π° ΡΠ°Π·ΠΈ ΠΈ Π΄ΡΡΠ³ΠΈ ΡΠ΅ΠΊΡΠΈΠΈ scipy ΡΠ° Π΄ΠΎΠ±ΡΠ΅ Π΄ΠΎΡΠ»ΠΈ Π½Π° .
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π·Π° ΡΡΠ°ΡΡΠΈΠ΅ Π² ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡΡΠ°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
