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

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

SciPy (произнася сС ΠΊΠ°Ρ‚ΠΎ сай ΠΏΠ°ΠΉ) Π΅ матСматичСски ΠΏΠ°ΠΊΠ΅Ρ‚, основан Π½Π° 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 β€” послСдоватСлно ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ с ограничСния, Π½ΡŽΡ‚ΠΎΠ½ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° систСмата Π½Π° Π›Π°Π³Ρ€Π°Π½ΠΆ. Бтатия Π½Π° Π²ΠΈΠΊΠΈ.
  • TNC β€” Truncated Newton Constrained, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Π±Ρ€ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ, подходящ Π·Π° Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с мноТСство нСзависими ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. Бтатия Π² wiki.
  • L-BFGS-B β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚ Ρ‡Π΅Ρ‚Π²ΠΎΡ€ΠΊΠ°Ρ‚Π° Broyden–Fletcher–Goldfarb–Shanno, Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ с Π½Π°ΠΌΠ°Π»Π΅Π½ΠΎ запамСтяванС Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° частичното Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈ ΠΎΡ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°Ρ‚Π° Π½Π° Π₯Сс. Бтатия Π² wiki, статия Π½Π° Π₯Π°Π±Ρ€Π΅.
  • COBYLA β€” ΠšΠžΠ‘Π«Π›Π Constrained Optimization By Linear Approximation, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° оптимизация с Π»ΠΈΠ½Π΅ΠΉΠ½Π° апроксимация (Π±Π΅Π· изчисляванС Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Π°Ρ‚Π°). Бтатия Π² 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) Π Π°Π·Π³Π»Π΅Π΄Π°ΠΉΡ‚Π΅ послСдоватСлното ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΈΡ‚Π΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈ (method=Β»SLSQPΒ») с ограничСния, Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ във Π²ΠΈΠ΄ Π½Π° Ρ€Π΅Ρ‡Π½ΠΈΠΊ {'type', 'fun', 'jac', 'args'};
3) АнализирайтС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° оптимизация Π½Π° производство, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚ ΡƒΠ΅Π± студио.

Условна оптимизация method=Β»trust-constrΒ»

РСализация Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° trust-constr Π΅ ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½Π° Π²ΡŠΡ€Ρ…Ρƒ EQSQP Π·Π° Π·Π°Π΄Π°Ρ‡ΠΈ с ограничСния ΠΎΡ‚ сорта Π½Π° равСнства ΠΈ Π½Π° TRIP Π·Π° Π·Π°Π΄Π°Ρ‡ΠΈ с ограничСния ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° нСравСнства. И Π΄Π²Π°Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° са Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ с Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ Π·Π° Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π½Π° Π»ΠΎΠΊΠ°Π»Π΅Π½ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π² Π΄ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅Π»Π½Π°Ρ‚Π° област ΠΈ са Π΄ΠΎΠ±Ρ€Π΅ подходящи Π·Π° ΠΌΠ°Ρ‰Π°Π±Π½ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ.

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

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='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 Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° минимизация Π½Π° функция ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°:

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

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

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

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

ΠšΡŠΠ΄Π΅Ρ‚ΠΎ SciPy, оптимизация с условия ΠΈ SciPy, оптимизация с условия β€” мноТСства ΠΎΡ‚ индСкси Π½Π° ΠΈΠ·Ρ€Π°Π·ΠΈ, описващи ограничСния ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° равСнства ΠΈΠ»ΠΈ нСравСнства. SciPy, оптимизация с условия β€” мноТСства Π΄ΠΎΠ»Π½ΠΈ ΠΈ Π³ΠΎΡ€Π½ΠΈ Π³Ρ€Π°Π½ΠΈΡ†ΠΈ Π·Π° областта Π½Π° опрСдСлянС Π½Π° функцията.

Π›ΠΈΠ½Π΅ΠΉΠ½ΠΈΡ‚Π΅ ΠΈ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΈΡ‚Π΅ ограничСния сС описват ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° Ρ€Π΅Ρ‡Π½ΠΈΡ†ΠΈ с ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ Ρ‚ΠΈΠΏ, 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]

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

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

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 чисто Π·Π° Π°ΠΊΠ°Π΄Π΅ΠΌΠΈΡ‡Π½ΠΈ Ρ†Π΅Π»ΠΈ, Π·Π°Ρ‚ΠΎΠ²Π° посочСният ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠΌΠ° хумористичСн Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€.

Много тСория ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π² rar Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° сС намСрят, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° Π½Π° И.Π›. Акулич "ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ". По-тСхничСското ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ scipy.optimize Π·Π° построяванС Π½Π° 3D структура въз основа Π½Π° Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ изобраТСния (статия Π½Π° Π₯Π°Π±Ρ€Π΅) ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π² scipy-cookbook.

ОсновСн ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° информация – docs.scipy.org, ΠΆΠ΅Π»Π°Π΅Ρ‰ΠΈΡ‚Π΅ Π΄Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈΡ€Π°Ρ‚ Π² ΠΏΡ€Π΅Π²ΠΎΠ΄Π° Π½Π° Ρ‚Π°Π·ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ сСкции scipy са Π΄ΠΎΠ±Ρ€Π΅ дошли Π½Π° GitHub.

Благодаря mephistopheies Π·Π° участиС Π² ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°Ρ‚Π° Π½Π° публикацията.

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster