SciPy, fa'alelei fa'atasi ma tulaga

SciPy, fa'alelei fa'atasi ma tulaga

SciPy (произносится ΠΊΠ°ΠΊ сай ΠΏΠ°ΠΉ) β€” это основанный Π½Π° numpy матСматичСский ΠΏΠ°ΠΊΠ΅Ρ‚, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π² сСбя Ρ‚Π°ΠΊΠΆΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π° C ΠΈ Fortran. Π‘ SciPy ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ сСанс Python прСвращаСтся Π² Ρ‚Π°ΠΊΡƒΡŽ ΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΡƒΡŽ срСду ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ MATLAB, IDL, Octave, R ΠΈΠ»ΠΈ SciLab.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассмотрим основныС ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ матСматичСского программирования β€” Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ условной ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ для скалярной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π° scipy.optimize. Алгоритмы бСзусловной ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΠΆΠ΅ рассмотрСны Π² mataupu mulimuli. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ справку ΠΏΠΎ функциям scipy всСгда ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ help(), Shift+Tab ΠΈΠ»ΠΈ Π² pepa aloaia.

Faatomuaga

ΠžΠ±Ρ‰ΠΈΠΉ интСрфСйс для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ ΠΊΠ°ΠΊ условной, Ρ‚Π°ΠΊ ΠΈ бСзусловной ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ scipy.optimize прСдоставляСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ minimize(). Однако извСстно, Ρ‡Ρ‚ΠΎ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ способа для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ всСх Π·Π°Π΄Π°Ρ‡ Π½Π΅ сущСствуСт, поэтому Π²Ρ‹Π±ΠΎΡ€ Π°Π΄Π΅ΠΊΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΊΠ°ΠΊ всСгда лоТится Π½Π° ΠΏΠ»Π΅Ρ‡ΠΈ исслСдоватСля.
ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ задаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ minimize(..., method="").
Для условной ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… доступны Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:

  • trust-constr β€” поиск локального ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° Π² Π΄ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ области. Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½Π° wiki, tala i HabrΓ©;
  • SLSQP β€” ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ограничСниями, Π½ΡŒΡŽΡ‚ΠΎΠ½ΠΎΠ²ΡΠΊΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ систСмы Π›Π°Π³Ρ€Π°Π½ΠΆΠ°. Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½Π° Π²ΠΈΠΊΠΈ.
  • TNC β€” Truncated Newton Constrained, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ число ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ…ΠΎΡ€ΠΎΡˆ для Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с большим числом нСзависимых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½Π° wiki.
  • L-BFGS-B β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚ Ρ‡Π΅Ρ‚Π²Π΅Ρ€ΠΊΠΈ Broyden–Fletcher–Goldfarb–Shanno, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ с ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½Π½Ρ‹ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ΠΌ памяти Π·Π° счСт частичной Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈΠ· ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ГСссС. Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½Π° wiki, tala i HabrΓ©.
  • COBYLA β€” ΠšΠžΠ‘Π«Π›Π Constrained Optimization By Linear Approximation, ограничСнная оптимизация с Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ аппроксимациСй (Π±Π΅Π· вычислСния Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°). Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½Π° wiki.

Π’ зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ условия ΠΈ ограничСния для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ:

  • ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ класса Bounds для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² L-BFGS-B, TNC, SLSQP, trust-constr;
  • le lisi (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.

Otootoga o tusitusiga:
1) Π Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° условной ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Π΄ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ области (method=Β»trust-constrΒ») с ограничСниями, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Bounds, LinearConstraint, NonlinearConstraint ;
2) Π Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠΈΡ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² (method=Β»SLSQPΒ») с ограничСниями, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ словаря {'type', 'fun', 'jac', 'args'};
3) Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ выпускаСмой ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Π΅Π±-студии.

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

РСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π° trust-constr e fua i luga EQSQP для Π·Π°Π΄Π°Ρ‡ с ограничСниями Π²ΠΈΠ΄Π° равСнства ΠΈ Π½Π° malaga для Π·Π°Π΄Π°Ρ‡ с ограничСниями Π² Π²ΠΈΠ΄Π΅ нСравСнств. Оба ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ поиска локального ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° Π² Π΄ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ области ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ подходят для ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡.

ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ постановка Π·Π°Π΄Π°Ρ‡ΠΈ поиска ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° Π² ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅:

SciPy, fa'alelei fa'atasi ma tulaga

SciPy, fa'alelei fa'atasi ma tulaga

SciPy, fa'alelei fa'atasi ma tulaga

Для ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ строгого равСнства ниТняя Π³Ρ€Π°Π½ΠΈΡ†Π° устанавливаСтся Ρ€Π°Π²Π½ΠΎΠΉ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ SciPy, fa'alelei fa'atasi ma tulaga.
Для одностороннСго ограничСния вСрхняя ΠΈΠ»ΠΈ ниТняя Π³Ρ€Π°Π½ΠΈΡ†Π° устанавливаСтся np.inf с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π·Π½Π°ΠΊΠΎΠΌ.
ΠŸΡƒΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ извСстной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊΠ° ΠΎΡ‚ Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:

SciPy, fa'alelei fa'atasi ma tulaga

ΠŸΡ€ΠΈ этом Π·Π°Π΄Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ограничСния Π½Π° Π΅Π΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ опрСдСлСния:

SciPy, fa'alelei fa'atasi ma tulaga

SciPy, fa'alelei fa'atasi ma tulaga

SciPy, fa'alelei fa'atasi ma tulaga

SciPy, fa'alelei fa'atasi ma tulaga

SciPy, fa'alelei fa'atasi ma tulaga

SciPy, fa'alelei fa'atasi ma tulaga

Π’ нашСм случаС имССтся СдинствСнноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ SciPy, fa'alelei fa'atasi ma tulaga, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ справСдливы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠ΅ ограничСния.
ΠŸΡ€ΠΎΠΉΠ΄Π΅ΠΌΡΡ ΠΏΠΎ ограничСниям снизу Π²Π²Π΅Ρ€Ρ… ΠΈ рассмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡ… Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² scipy.
Tapulaa SciPy, fa'alelei fa'atasi ma tulaga ΠΈ SciPy, fa'alelei fa'atasi ma tulaga ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Bounds.

from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])

Tapulaa SciPy, fa'alelei fa'atasi ma tulaga ΠΈ SciPy, fa'alelei fa'atasi ma tulaga запишСм Π² Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅:

SciPy, fa'alelei fa'atasi ma tulaga

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ эти ограничСния Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° LinearConstraint:

import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])

И Π½Π°ΠΊΠΎΠ½Π΅Ρ† Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅:

SciPy, fa'alelei fa'atasi ma tulaga

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π―ΠΊΠΎΠ±ΠΈ для этого ограничСния ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ГСссС с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ SciPy, fa'alelei fa'atasi ma tulaga:

SciPy, fa'alelei fa'atasi ma tulaga

SciPy, fa'alelei fa'atasi ma tulaga

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ 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, fa'alelei fa'atasi ma tulaga Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π·Π°Ρ‚Ρ€Π°Ρ‚, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс 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, fa'alelei fa'atasi ma tulaga

SciPy, fa'alelei fa'atasi ma tulaga

SciPy, fa'alelei fa'atasi ma tulaga

SciPy, fa'alelei fa'atasi ma tulaga

le mea SciPy, fa'alelei fa'atasi ma tulaga ΠΈ SciPy, fa'alelei fa'atasi ma tulaga β€” мноТСства индСксов Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΡ… ограничСния Π² Π²ΠΈΠ΄Π΅ равСнств ΠΈΠ»ΠΈ нСравСнств. SciPy, fa'alelei fa'atasi ma tulaga β€” мноТСства Π½ΠΈΠΆΠ½ΠΈΡ… ΠΈ Π²Π΅Ρ€Ρ…Π½ΠΈΡ… Π³Ρ€Π°Π½ΠΈΡ† для области опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

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

Π§Ρ‚ΠΎ эквивалСнтно:

SciPy, fa'alelei fa'atasi ma tulaga

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, Π΄ΠΆΡƒΠ½ΠΎΠ² мСньшС ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹.

iΚ»uga

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Ρ‹ основныС ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ scipy.optimize, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ условной ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Π›ΠΈΡ‡Π½ΠΎ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ scipy чисто Π² акадСмичСских цСлях, поэтому ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ носит Ρ‚Π°ΠΊΠΎΠΉ ΡˆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€.

Много Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΈ Π²ΠΈΠ½Ρ€Π°Ρ€Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠ½ΠΈΠ³Π΅ И.Π›.Акулича Β«ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΈ Π·Π°Π΄Π°Ρ‡Π°Ρ…Β». Π‘ΠΎΠ»Π΅Π΅ Ρ…Π°Ρ€Π΄ΠΊΠΎΡ€Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ scipy.optimize для построСния 3D структуры ΠΏΠΎ Π½Π°Π±ΠΎΡ€Ρƒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (tala i HabrΓ©) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² scipy-cookbook.

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

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

puna: www.habr.com

Faaopoopo i ai se faamatalaga