SciPy, оптимизация с условия

SciPy, оптимизация с условия

SciPy (произнася сС sai pie) Π΅ Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° numpy матСматичСски ΠΏΠ°ΠΊΠ΅Ρ‚, ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΡ‰ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π²Π° C ΠΈ Fortran Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. SciPy ΠΏΡ€Π΅Π²Ρ€ΡŠΡ‰Π° Π²Π°ΡˆΠ°Ρ‚Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π° Python сСсия Π² цялостна Π½Π°ΡƒΡ‡Π½Π° срСда Π·Π° Π΄Π°Π½Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ MATLAB, IDL, Octave, R ΠΈΠ»ΠΈ SciLab.

Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ основнитС Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ Π½Π° матСматичСското ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ - Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈ Π·Π° условна оптимизация Π·Π° скаларна функция Π½Π° няколко ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° scipy.optimize. АлгоритмитС Π·Π° Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° оптимизация Π²Π΅Ρ‡Π΅ бяха обсъдСни Π² послСдната статия. По-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π° ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»Π½Π° ΠΏΠΎΠΌΠΎΡ‰ Π·Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π½Π° scipy Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° help(), Shift+Tab ΠΈΠ»ΠΈ Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½Π° докумСнтация.

въвСдСниС

ΠžΠ±Ρ‰ интСрфСйс Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с условна ΠΈ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° оптимизация Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π° 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 Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° EQSQP Π·Π° Π·Π°Π΄Π°Ρ‡ΠΈ с ограничСния Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° равСнство ΠΈ Π½Π° ПΠͺВУВАНЕ Π·Π° Π·Π°Π΄Π°Ρ‡ΠΈ с ограничСния ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° нСравСнства. И Π΄Π²Π°Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ Π·Π° Π½Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° Π»ΠΎΠΊΠ°Π»Π΅Π½ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π² Π΄ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅Π»Π½Π°Ρ‚Π° област ΠΈ са ΠΌΠ½ΠΎΠ³ΠΎ подходящи Π·Π° ΠΌΠ°Ρ‰Π°Π±Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ.

ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠ° Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π·Π° Π½Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π² ΠΎΠ±Ρ‰ Π²ΠΈΠ΄:

SciPy, оптимизация с условия

SciPy, оптимизация с условия

SciPy, оптимизация с условия

Π—Π° строги ограничСния Π·Π° равСнство Π΄ΠΎΠ»Π½Π°Ρ‚Π° Π³Ρ€Π°Π½ΠΈΡ†Π° Π΅ Π·Π°Π΄Π°Π΄Π΅Π½Π° Ρ€Π°Π²Π½Π° Π½Π° Π³ΠΎΡ€Π½Π°Ρ‚Π° Π³Ρ€Π°Π½ΠΈΡ†Π° SciPy, оптимизация с условия.
Π—Π° Сднопосочно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ сС Π·Π°Π΄Π°Π²Π° Π³ΠΎΡ€Π½Π°Ρ‚Π° ΠΈΠ»ΠΈ Π΄ΠΎΠ»Π½Π°Ρ‚Π° Π³Ρ€Π°Π½ΠΈΡ†Π° np.inf със ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ Π·Π½Π°ΠΊ.
НСка Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС Π½Π°ΠΌΠ΅Ρ€ΠΈ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡŠΡ‚ Π½Π° извСстна функция Π½Π° Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊ ΠΎΡ‚ Π΄Π²Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ:

SciPy, оптимизация с условия

Π’ Ρ‚ΠΎΠ·ΠΈ случай са Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ слСднитС ограничСния Π²ΡŠΡ€Ρ…Ρƒ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° област Π½Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½Π΅:

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]

Ако Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, функцията Π·Π° изчисляванС Π½Π° 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 Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° функция във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°:

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 Ρ‚Ρ€.
  • 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]

Π’ΠΎΠ²Π° Π½Π΅ Π΅ Π³Ρ€Π΅ΡˆΠΊΠ°, ΠΏΡ€ΠΈ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π½Π° максимума Ρ†Π΅Π»Π΅Π²Π°Ρ‚Π° функция сС ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π° с ΠΎΠ±Ρ€Π°Ρ‚Π΅Π½ Π·Π½Π°ΠΊ.

Π‘Π»Π΅Π΄Π²Π°Ρ‰Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ° Π΅ Π΄Π° Π·Π°Π±Ρ€Π°Π½ΠΈΠΌ Π½Π° Π½Π°ΡˆΠΈΡ‚Π΅ слуТитСли Π΄Π° работят ΠΏΡ€Π΅ΠΊΠΎΠΌΠ΅Ρ€Π½ΠΎ ΠΈ Π΄Π° въвСдСм ограничСния Π½Π° Ρ€Π°Π±ΠΎΡ‚Π½ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅:

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 чисто с Π°ΠΊΠ°Π΄Π΅ΠΌΠΈΡ‡Π½Π° Ρ†Π΅Π», ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΊΠΎΠ΅Ρ‚ΠΎ дадСният ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΊΠΎΠΌΠΈΡ‡Π΅Π½.

Много тСория ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° Π½Π° И. Π›. Акулич β€žΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈβ€œ. По-Ρ…Π°Ρ€Π΄ΠΊΠΎΡ€ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ scipy.optimize Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° 3D структура ΠΎΡ‚ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ изобраТСния (статия Π·Π° Ρ…ΡŠΠ±) ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π² scipy-готварска ΠΊΠ½ΠΈΠ³Π°.

ΠžΡΠ½ΠΎΠ²Π½ΠΈΡΡ‚ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° информация Π΅ docs.scipy.orgΡ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ТСлаят Π΄Π° допринСсат Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄Π° Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΠΈ scipy Π”ΠΎΠ±Ρ€Π΅ дошли Π² GitHub.

Благодаря мСфистофСи Π·Π° участиС Π² ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°Ρ‚Π° Π½Π° ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Ρ‚ΠΎ.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€