SciPy (ΠΏΡΠΎΠΈΠ·Π½Π°ΡΡ ΡΠ΅ sai pie) Π΅ Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° numpy ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ, ΠΊΠΎΠΉΡΠΎ ΡΡΡΠΎ Π²ΠΊΠ»ΡΡΠ²Π° C ΠΈ Fortran Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. SciPy ΠΏΡΠ΅Π²ΡΡΡΠ° Π²Π°ΡΠ°ΡΠ° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π° Python ΡΠ΅ΡΠΈΡ Π² ΡΡΠ»ΠΎΡΡΠ½Π° Π½Π°ΡΡΠ½Π° ΡΡΠ΅Π΄Π° Π·Π° Π΄Π°Π½Π½ΠΈ ΠΊΠ°ΡΠΎ MATLAB, IDL, Octave, R ΠΈΠ»ΠΈ SciLab.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΠ΅Ρ
Π½ΠΈΠΊΠΈ Π½Π° ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ - ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°ΡΠΈ Π·Π° ΡΡΠ»ΠΎΠ²Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π·Π° ΡΠΊΠ°Π»Π°ΡΠ½Π° ΡΡΠ½ΠΊΡΠΈΡ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ° scipy.optimize. ΠΠ»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅ Π·Π° Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π²Π΅ΡΠ΅ Π±ΡΡ
Π° ΠΎΠ±ΡΡΠ΄Π΅Π½ΠΈ Π²
Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ±Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΡΡΠ»ΠΎΠ²Π½Π° ΠΈ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π² ΠΏΠ°ΠΊΠ΅ΡΠ° scipy.optimize ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡΡΠ° minimize()
. ΠΠ·Π²Π΅ΡΡΠ½ΠΎ Π΅ ΠΎΠ±Π°ΡΠ΅, ΡΠ΅ Π½ΡΠΌΠ° ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π΅Π½ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΈΠ·Π±ΠΎΡΡΡ Π½Π° Π°Π΄Π΅ΠΊΠ²Π°ΡΠ΅Π½ ΠΌΠ΅ΡΠΎΠ΄, ΠΊΠ°ΠΊΡΠΎ Π²ΠΈΠ½Π°Π³ΠΈ, ΠΏΠ°Π΄Π° Π²ΡΡΡ
Ρ ΠΏΠ»Π΅ΡΠΈΡΠ΅ Π½Π° ΠΈΠ·ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΡΡ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° minimize(..., method="")
.
ΠΠ° ΡΡΠ»ΠΎΠ²Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΡΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ:
trust-constr
β ΡΡΡΡΠ΅Π½Π΅ Π½Π° Π»ΠΎΠΊΠ°Π»Π΅Π½ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π² Π·ΠΎΠ½Π°ΡΠ° Π½Π° Π΄ΠΎΠ²Π΅ΡΠΈΠ΅.Wiki ΡΡΠ°ΡΠΈΡ ,ΡΡΠ°ΡΠΈΡ Π·Π° Ρ ΡΠ± ;SLSQP
β ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈΡΠ½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΠΡΡΠΎΠ½ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π½Π° ΠΠ°Π³ΡΠ°Π½ΠΆ.Wiki ΡΡΠ°ΡΠΈΡ .TNC
- Π‘ΠΊΡΡΠ΅Π½ Newton Constrained, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ Π±ΡΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ, Π΄ΠΎΠ±ΡΡ Π·Π° Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ.Wiki ΡΡΠ°ΡΠΈΡ .L-BFGS-B
β ΠΌΠ΅ΡΠΎΠ΄ ΠΎΡ Π΅ΠΊΠΈΠΏΠ° Π½Π° BroydenβFletcherβGoldfarbβShanno, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ Ρ Π½Π°ΠΌΠ°Π»Π΅Π½Π° ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΈΡ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠ°ΡΡΠΈΡΠ½ΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π²Π΅ΠΊΡΠΎΡΠΈ ΠΎΡ ΠΌΠ°ΡΡΠΈΡΠ°ΡΠ° Π½Π° Π₯Π΅ΡΠ΅Π½.Wiki ΡΡΠ°ΡΠΈΡ ,ΡΡΠ°ΡΠΈΡ Π·Π° Ρ ΡΠ± .COBYLA
β ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ MARE ΡΡΠ΅Π· Π»ΠΈΠ½Π΅ΠΉΠ½Π° Π°ΠΏΡΠΎΠΊΡΠΈΠΌΠ°ΡΠΈΡ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Ρ Π»ΠΈΠ½Π΅ΠΉΠ½Π° Π°ΠΏΡΠΎΠΊΡΠΈΠΌΠ°ΡΠΈΡ (Π±Π΅Π· ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ°).Wiki ΡΡΠ°ΡΠΈΡ .
Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΠΈΠ·Π±ΡΠ°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ° ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡΠ° Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ΅ Π·Π°Π΄Π°Π²Π°Ρ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½:
- ΠΊΠ»Π°Ρ ΠΎΠ±Π΅ΠΊΡ
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) ΠΠΎΠΌΠΈΡΠ»Π΅ΡΠ΅ Π·Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° Π½Π° Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΈΡΠ΅ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈ (ΠΌΠ΅ΡΠΎΠ΄ = "SLSQP") Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠ΅ΡΠ½ΠΈΠΊ {'type', 'fun', 'jac', 'args'}
;
3) ΠΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π° ΡΠ΅Π± ΡΡΡΠ΄ΠΈΠΎ.
ΠΠ΅ΡΠΎΠ΄ Π·Π° ΡΡΠ»ΠΎΠ²Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ="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)
ΠΡΠΈ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠ°ΡΡΠΈΡΠ°ΡΠ° Π½Π° Π₯Π΅ΡΠΈΠ°Π½ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠΈΠ»ΠΈΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΊΠ»Π°Ρ 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]
ΠΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° Hessian ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠ»Π°ΡΠ° 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 Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ² ΡΠΎΡΠΌΠ°ΡΠ°:
ΠΊΡΠ΄Π΅ΡΠΎ ΠΈ β Π½Π°Π±ΠΎΡΠΈ ΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π½Π° ΠΈΠ·ΡΠ°Π·ΠΈ, ΠΎΠΏΠΈΡΠ²Π°ΡΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠ°Π²Π΅Π½ΡΡΠ²Π° ΠΈΠ»ΠΈ Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π°. β Π½Π°Π±ΠΎΡΠΈ ΠΎΡ Π΄ΠΎΠ»Π½ΠΈ ΠΈ Π³ΠΎΡΠ½ΠΈ Π³ΡΠ°Π½ΠΈΡΠΈ Π·Π° ΠΎΠ±Π»Π°ΡΡΡΠ° Π½Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ°.
ΠΠΈΠ½Π΅ΠΉΠ½ΠΈΡΠ΅ ΠΈ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΈΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠ° ΠΎΠΏΠΈΡΠ°Π½ΠΈ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠ΅ΡΠ½ΠΈΡΠΈ Ρ ΠΊΠ»ΡΡΠΎΠ²Π΅ 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 ΡΡ.
- x1 - ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΈ ΡΠ΅Π±ΡΠ°ΠΉΡΠΎΠ²Π΅, ΠΎΡ 20 ΡΡ.
- x2 - ΠΎΠ½Π»Π°ΠΉΠ½ ΠΌΠ°Π³Π°Π·ΠΈΠ½ΠΈ, ΠΎΡ 30 ΡΡ.
ΠΠ°ΡΠΈΡΡ ΠΏΡΠΈΡΡΠ΅Π»ΡΠΊΠΈ ΡΠ°Π±ΠΎΡΠ΅Ρ Π΅ΠΊΠΈΠΏ Π²ΠΊΠ»ΡΡΠ²Π° ΡΠ΅ΡΠΈΡΠΈΠΌΠ° ΠΌΠ»Π°Π΄ΡΠΈ, Π΄Π²Π°ΠΌΠ° ΡΡΠ΅Π΄Π½ΠΈ ΠΈ Π΅Π΄ΠΈΠ½ ΡΡΠ°ΡΡΠΈ. Π’Π΅Ρ Π½ΠΈΡΡ ΠΌΠ΅ΡΠ΅ΡΠ΅Π½ ΡΠΎΠ½Π΄ ΡΠ°Π±ΠΎΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅:
- ΡΠ½ΠΈ:
4 * 150 = 600 ΡΠ΅Π» * ΡΠ°Ρ
, - ΡΡΠ΅Π΄ΠΈ:
2 * 150 = 300 ΡΠ΅Π» * ΡΠ°Ρ
, - ΡΠ΅Π½ΡΠΎΡ:
150 ΡΠ΅Π» * ΡΠ°Ρ
.
ΠΠ΅ΠΊΠ° ΠΏΡΡΠ²ΠΈΡΡ Π½Π°Π»ΠΈΡΠ΅Π½ ΠΌΠ»Π°Π΄ΡΠΈ ΠΏΡΠ΅ΠΊΠ°ΡΠ° (0, 1, 2) ΡΠ°ΡΠ° Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΅Π΄ΠΈΠ½ ΡΠ°ΠΉΡ ΠΎΡ ΡΠΈΠΏ (x10, x20, x30), ΡΡΠ΅Π΄Π΅Π½ - (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
ΠΠΎΠ±ΡΠ΅ Π΄ΠΎΡΠ»ΠΈ Π²
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com