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 = cons_J, 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` 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]

ΠŸΡ€ΠΈ нСобходимости, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ вычислСния гСссиана ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса 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, оптимизация с условиями β€” мноТСства Π½ΠΈΠΆΠ½ΠΈΡ… ΠΈ Π²Π΅Ρ€Ρ…Π½ΠΈΡ… Π³Ρ€Π°Π½ΠΈΡ† для области опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π›ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ ΠΈ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ ограничСния ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ словарСй с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ 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 Ρ‡Π΅Π» * час.

ΠŸΡƒΡΡ‚ΡŒ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ сайта Ρ‚ΠΈΠΏΠ° (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]

Π­Ρ‚ΠΎ Π½Π΅ ошибка, ΠΏΡ€ΠΈ поискС максимума цСлСвая функция минимизируСтся с ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ Π·Π½Π°ΠΊΠΎΠΌ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг β€” Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ своим сотрудникам ΠΈ Π²Π²ΠΎΠ΄ΠΈΠΌ ограничСния Π½Π° Ρ„ΠΎΠ½Π΄ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ:

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-cookbook.

Основной источник ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ β€” docs.scipy.org, ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΈΠ±ΡŒΡŽΡ‚ΠΈΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ этого ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² scipy Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° GitHub.

Бпасибо mephistopheies Π·Π° участиС Π² ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ