
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β ΠΌΠ΅ΡΠΎΠ΄ ΠΎΡ ΡΠ΅ΡΠ²ΠΎΡΠΊΠ°ΡΠ° BroydenβFletcherβGoldfarbβShanno, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ Ρ Π½Π°ΠΌΠ°Π»Π΅Π½ΠΎ Π·Π°ΠΏΠ°ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ°ΡΡΠΈΡΠ½ΠΎΡΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π²Π΅ΠΊΡΠΎΡΠΈ ΠΎΡ ΠΌΠ°ΡΡΠΈΡΠ°ΡΠ° Π½Π° Π₯Π΅Ρ. , .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:
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)ΠΠΎΠ³Π°ΡΠΎ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π₯Π΅ΡΠΈΠ΅Π²Π°ΡΠ° ΠΌΠ°ΡΡΠΈΡΠ°
ΠΈΠ·ΠΈΡΠΊΠ²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΡΠ΅ΡΡΡΡΠΈ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ»Π°ΡΡΡ . ΠΠ°Π»ΠΈΡΠ½ΠΈ ΡΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ: 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='2-point', 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` ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ Π·Π° ΠΏΡΠ΅ΠΊΡΠ°ΡΡΠ²Π°Π½Π΅ Π΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠ΅Π½ΠΎ.
ΠΡΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ: 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 (ΠΊΠ²Π°Π·ΠΈ-ΠΡΡΠΎΠ½ΠΎΠ²ΠΎ Π°ΠΏΡΠΎΠΊΡΠΈΡΠ°Π½Π΅). ΠΡΠ°Π΄ΠΈΠ΅Π½ΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π°ΠΏΡΠΎΠΊΡΠΈΠΌΠΈΡΠ°Π½ΠΈ Ρ ΠΊΡΠ°Π΅Π½ Π΄ΠΈΡΠ΅ΡΠ΅Π½ΡΠΈΠ°Π».
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)Π£ΡΠ»ΠΎΠ²Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ method='SLSQP'
ΠΠ΅ΡΠΎΠ΄ΡΡ SLSQP Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°ΡΠΈ Π½Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ°:




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