SciPy (ΠΏΡΠΎΠΈΠ·Π½ΠΎΡΠΈΡΡΡ ΠΊΠ°ΠΊ ΡΠ°ΠΉ ΠΏΠ°ΠΉ) β ΡΡΠΎ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΡΡ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΈ Numpy Python. Π‘ SciPy ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠΉ ΡΠ΅Π°Π½Ρ Python ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² ΡΠ°ΠΊΡΡ ΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΡ ΡΡΠ΅Π΄Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌ, ΠΊΠ°ΠΊ MATLAB, IDL, Octave, R-Lab ΠΈ SciLab. Π‘Π΅Π³ΠΎΠ΄Π½Ρ Ρ Ρ ΠΎΡΡ ΠΊΠΎΡΠΎΡΠΊΠΎ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ scipy.optimize. ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΡ ΠΈ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΡΠΏΡΠ°Π²ΠΊΡ ΠΏΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ help() ΠΈΠ»ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Shift+Tab.
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ°Π±Ρ ΠΈΠ·Π±Π°Π²ΠΈΡΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠ΅Π±Ρ ΠΈ ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ ΠΎΡ ΠΏΠΎΠΈΡΠΊΠ° ΠΈ ΡΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ², ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π±ΡΠ΄ΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ Π½Π° Π²ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΡ. ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΡΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π² ΠΎΠ±ΡΠΈΡ ΡΠ΅ΡΡΠ°Ρ ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΉ ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ. ΠΠ»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΡΡΡΠΈ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΈΠ΄Π΅ΠΌ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ°ΠΌ Π½Π° Π±ΠΎΠ»Π΅Π΅ Π°Π²ΡΠΎΡΠΈΡΠ΅ΡΠ½ΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ°ΡΡΠΈ ΠΈΠ»ΠΈ Π² Π»ΡΠ±ΠΈΠΌΠΎΠΉ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅.
ΠΡΠ°ΠΊ, ΠΌΠΎΠ΄ΡΠ»Ρ scipy.optimize Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ:
- Π£ΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΈ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΠΊΠ°Π»ΡΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
(minim) Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² (ΡΠΈΠΌΠΏΠ»Π΅ΠΊΡ ΠΠ΅Π»Π΄Π΅ΡΠ°-ΠΠΈΠ΄Π°, BFGS, ΡΠΎΠΏΡΡΠΆΠ΅Π½Π½ΡΡ
Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΎΠ² ΠΡΡΡΠΎΠ½Π°,
COBYLA ΠΈSLSQP ) - ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
basinhopping ,diff_evolution ) - ΠΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΎΡΡΠ°ΡΠΊΠΎΠ²
ΠΠΠ (least_squares) ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΏΠΎΠ΄Π³ΠΎΠ½ΠΊΠΈ ΠΊΡΠΈΠ²ΡΡ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠΌ ΠΠΠ (curve_fit) - ΠΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΠΊΠ°Π»ΡΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ (minim_scalar) ΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΠΊΠΎΡΠ½Π΅ΠΉ (root_scalar)
- ΠΠ½ΠΎΠ³ΠΎΠΌΠ΅ΡΠ½ΡΠ΅ ΡΠ΅ΡΠ°ΡΠ΅Π»ΠΈ ΡΠΈΡΡΠ΅ΠΌΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ (root) Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² (Π³ΠΈΠ±ΡΠΈΠ΄Π½ΡΠΉ ΠΠ°ΡΡΠ»Π»Π°,
ΠΠ΅Π²Π΅Π½Π±Π΅ΡΠ³-ΠΠ°ΡΠΊΠ²Π°ΡΠ΄Ρ ΠΈΠ»ΠΈ ΠΊΡΡΠΏΠ½ΠΎΠΌΠ°ΡΡΡΠ°Π±Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊΠΡΡΡΠΎΠ½Π°-ΠΡΡΠ»ΠΎΠ²Π° ).
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΡΠ½ΠΊΡ ΠΈΠ· Π²ΡΠ΅Π³ΠΎ ΡΡΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°.
ΠΠ΅Π·ΡΡΠ»ΠΎΠ²Π½Π°Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠΊΠ°Π»ΡΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π€ΡΠ½ΠΊΡΠΈΡ minim ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠ° scipy.optimize ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ±ΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΈ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΠΊΠ°Π»ΡΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ . Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π΅ ΡΠ°Π±ΠΎΡΡ, Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ.
ΠΠ»Ρ ΡΡΠΈΡ ΡΠ΅Π»Π΅ΠΉ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ° ΠΎΡ N ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠΌΠ΅Π΅Ρ Π²ΠΈΠ΄:
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ° ΠΈ Π΅Π΅ ΠΌΠ°ΡΡΠΈΡΡ Π―ΠΊΠΎΠ±ΠΈ ΠΈ ΠΠ΅ΡΡΠ΅ (ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΈ Π²ΡΠΎΡΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ) ΡΠΆΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ scipy.optimize, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π΅Π΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ.
import numpy as np
def rosen(x):
"""The Rosenbrock function"""
return np.sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0, axis=0)
ΠΠ»Ρ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΡΡΠΈ ΠΎΡΡΠΈΡΡΠ΅ΠΌ Π² 3D Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ° ΠΎΡ Π΄Π²ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ .
ΠΠΎΠ΄ Π΄Π»Ρ ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
# ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ 3D Π³ΡΠ°ΡΠΈΠΊ
fig = plt.figure(figsize=[15, 10])
ax = fig.gca(projection='3d')
# ΠΠ°Π΄Π°Π΅ΠΌ ΡΠ³ΠΎΠ» ΠΎΠ±Π·ΠΎΡΠ°
ax.view_init(45, 30)
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ Π³ΡΠ°ΡΠΈΠΊΠ°
X = np.arange(-2, 2, 0.1)
Y = np.arange(-1, 3, 0.1)
X, Y = np.meshgrid(X, Y)
Z = rosen(np.array([X,Y]))
# Π ΠΈΡΡΠ΅ΠΌ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΡ
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm)
plt.show()
ΠΠ½Π°Ρ Π·Π°ΡΠ°Π½Π΅Π΅, ΡΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΡΠ°Π²Π΅Π½ 0 ΠΏΡΠΈ , ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ scipy.optimize.
Π‘ΠΈΠΌΠΏΠ»Π΅ΠΊΡ-ΠΌΠ΅ΡΠΎΠ΄ ΠΠ΅Π»Π΄Π΅ΡΠ°-ΠΠΈΠ΄Π° (Nelder-Mead)
ΠΡΡΡΡ ΠΈΠΌΠ΅Π΅ΡΡΡ Π½Π°ΡΠ°Π»ΡΠ½Π°Ρ ΡΠΎΡΠΊΠ° x0 Π² 5-ΠΌΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅. ΠΠ°ΠΉΠ΄Π΅ΠΌ Π±Π»ΠΈΠΆΠ°ΠΉΡΡΡ ΠΊ Π½Π΅ΠΉ ΡΠΎΡΠΊΡ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΠ° ΡΡΠ½ΠΊΡΠΈΠΈ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°
from scipy.optimize import minimize
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead',
options={'xtol': 1e-8, 'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 339
Function evaluations: 571
[1. 1. 1. 1. 1.]
Π‘ΠΈΠΌΠΏΠ»Π΅ΠΊΡ-ΠΌΠ΅ΡΠΎΠ΄ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΌΡΠΌ ΠΏΡΠΎΡΡΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΡΠ²Π΅ΡΡΠΈ ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΡ ΡΠ²Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π³Π»Π°Π΄ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ. ΠΠ½ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π·Π°Π΄Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠ΅ΡΠΎΠ΄ ΠΠ΅Π»Π΄Π΅ΡΠ°-ΠΠΈΠ΄Π° ΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΠΎΡΠΎΡΠΈΠΌ Π²ΡΠ±ΠΎΡΠΎΠΌ Π΄Π»Ρ ΠΏΡΠΎΡΡΡΡ Π·Π°Π΄Π°Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΡΠ΅Π½ΠΊΠΈ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ°, Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΌΠΈΠ½ΠΈΠΌΡΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΠ΅ΡΠΎΠ΄ ΠΠ°ΡΡΠ»Π»Π°
ΠΡΡΠ³ΠΈΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π²ΡΡΠΈΡΠ»ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠ²Π»ΡΠ΅ΡΡΡ
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='powell',
options={'xtol': 1e-8, 'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 19
Function evaluations: 1622
[1. 1. 1. 1. 1.]
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΡΠΎΠΉΠ΄Π΅Π½Π°-Π€Π»Π΅ΡΡΠ΅ΡΠ°-ΠΠΎΠ»Π΄ΡΠ°ΡΠ±Π°-Π¨Π°Π½Π½ΠΎ (BFGS)
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΠΎΠΉ ΡΡ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΊ ΡΠ΅ΡΠ΅Π½ΠΈΡ, ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°
ΠΠ°ΠΉΠ΄Π΅ΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ° Π² Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅:
ΠΡΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²ΠΎ Π΄Π»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ Π²ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , ΠΊΡΠΎΠΌΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΠΊΠ°ΠΊ:
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Python, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΡΡΠΎΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ:
def rosen_der (x):
xm = x [1: -1]
xm_m1 = x [: - 2]
xm_p1 = x [2:]
der = np.zeros_like (x)
der [1: -1] = 200 * (xm-xm_m1 ** 2) - 400 * (xm_p1 - xm ** 2) * xm - 2 * (1-xm)
der [0] = -400 * x [0] * (x [1] -x [0] ** 2) - 2 * (1-x [0])
der [-1] = 200 * (x [-1] -x [-2] ** 2)
return der
Π€ΡΠ½ΠΊΡΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ° ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° jac ΡΡΠ½ΠΊΡΠΈΠΈ minim, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.
res = minimize(rosen, x0, method='BFGS', jac=rosen_der, options={'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 25
Function evaluations: 30
Gradient evaluations: 30
[1.00000004 1.0000001 1.00000021 1.00000044 1.00000092]
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠΎΠΏΡΡΠΆΠ΅Π½Π½ΡΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΎΠ² (ΠΡΡΡΠΎΠ½Π°)
ΠΠ»Π³ΠΎΡΠΈΡΠΌ
ΠΠ΅ΡΠΎΠ΄ ΠΡΡΡΠΎΠ½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° Π°ΠΏΠΏΡΠΎΠΊΡΠΈΠΌΠ°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠΎΠΌ Π²ΡΠΎΡΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ:
Π³Π΄Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ°ΡΡΠΈΡΠ΅ΠΉ Π²ΡΠΎΡΡΡ
ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ
(ΠΌΠ°ΡΡΠΈΡΠ° ΠΠ΅ΡΡΠ΅, Π³Π΅ΡΡΠΈΠ°Π½).
ΠΡΠ»ΠΈ Π³Π΅ΡΡΠΈΠ°Π½ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½, ΡΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ, ΠΏΡΠΈΡΠ°Π²Π½ΡΠ² Π½ΡΠ»Π΅Π²ΠΎΠΉ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈΡΠ½ΠΎΠΉ ΡΠΎΡΠΌΡ ΠΊ Π½ΡΠ»Ρ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅:
ΠΠ±ΡΠ°ΡΠ½ΡΠΉ Π³Π΅ΡΡΠΈΠ°Π½ Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠΎΠΏΡΡΠΆΠ΅Π½Π½ΡΡ
Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΎΠ². ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Π΄Π»Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π½ΠΈΠΆΠ΅. Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ Newton-CG, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Π³Π΅ΡΡΠΈΠ°Π½.
ΠΠ΅ΡΡΠΈΠ°Π½ ΡΡΠ½ΠΊΡΠΈΠΈ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ° Π² Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΡΠ°Π²Π΅Π½:
Π³Π΄Π΅ ΠΈ , ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΌΠ°ΡΡΠΈΡΡ .
ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ Π½Π΅Π½ΡΠ»Π΅Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΡΡ ΡΠ°Π²Π½Ρ:
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΏΡΡΠΈΠΌΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ N = 5, ΠΌΠ°ΡΡΠΈΡΠ° ΠΠ΅ΡΡΠ΅ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ Π»Π΅Π½ΡΠΎΡΠ½ΡΠΉ Π²ΠΈΠ΄:
ΠΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΡΡΠΎΡ Π³Π΅ΡΡΠΈΠ°Π½ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΊΠΎΠ΄ΠΎΠΌ Π΄Π»Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠΎΠΏΡΡΠΆΠ΅Π½Π½ΡΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΎΠ² (ΠΡΡΡΠΎΠ½Π°):
def rosen_hess(x):
x = np.asarray(x)
H = np.diag(-400*x[:-1],1) - np.diag(400*x[:-1],-1)
diagonal = np.zeros_like(x)
diagonal[0] = 1200*x[0]**2-400*x[1]+2
diagonal[-1] = 200
diagonal[1:-1] = 202 + 1200*x[1:-1]**2 - 400*x[2:]
H = H + np.diag(diagonal)
return H
res = minimize(rosen, x0, method='Newton-CG',
jac=rosen_der, hess=rosen_hess,
options={'xtol': 1e-8, 'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 24
Function evaluations: 33
Gradient evaluations: 56
Hessian evaluations: 24
[1. 1. 1. 0.99999999 0.99999999]
ΠΡΠΈΠΌΠ΅Ρ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π³Π΅ΡΡΠΈΠ°Π½Π° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ°
Π ΡΠ΅Π°Π»ΡΠ½ΡΡ Π·Π°Π΄Π°ΡΠ°Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΈ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΉ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ΅ΡΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ² Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠΈ ΡΡΠΎΠΌ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°Π΄Π°Π²Π°ΡΡ ΡΠ°ΠΌΡ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ΅ΡΡΠ΅, Ρ.ΠΊ. Π΄Π»Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π½ΡΠΆΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ Π²Π΅ΠΊΡΠΎΡ, ΡΠ°Π²Π½ΡΠΉ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π³Π΅ΡΡΠΈΠ°Π½Π° Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ Π²Π΅ΠΊΡΠΎΡΠΎΠΌ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Ρ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅ΠΉ ΡΡΠ°Π·Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π³Π΅ΡΡΠΈΠ°Π½Π° Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ Π²Π΅ΠΊΡΠΎΡΠΎΠΌ.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ hess, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π²Π΅ΠΊΡΠΎΡ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°, Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ Π²Π΅ΠΊΡΠΎΡ β ΠΊΠ°ΠΊ Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ (Π½Π°ΡΡΠ΄Ρ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ). Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π³Π΅ΡΡΠΈΠ°Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ° Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ Π²Π΅ΠΊΡΠΎΡΠΎΠΌ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΠΎ. ΠΡΠ»ΠΈ p β ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ Π²Π΅ΠΊΡΠΎΡ, ΡΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ Π²ΠΈΠ΄:
Π€ΡΠ½ΠΊΡΠΈΡ, Π²ΡΡΠΈΡΠ»ΡΡΡΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π³Π΅ΡΡΠΈΠ°Π½Π° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ°, ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° hessp ΡΡΠ½ΠΊΡΠΈΠΈ minimize:
def rosen_hess_p(x, p):
x = np.asarray(x)
Hp = np.zeros_like(x)
Hp[0] = (1200*x[0]**2 - 400*x[1] + 2)*p[0] - 400*x[0]*p[1]
Hp[1:-1] = -400*x[:-2]*p[:-2]+(202+1200*x[1:-1]**2-400*x[2:])*p[1:-1]
-400*x[1:-1]*p[2:]
Hp[-1] = -400*x[-2]*p[-2] + 200*p[-1]
return Hp
res = minimize(rosen, x0, method='Newton-CG',
jac=rosen_der, hessp=rosen_hess_p,
options={'xtol': 1e-8, 'disp': True})
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 24
Function evaluations: 33
Gradient evaluations: 56
Hessian evaluations: 66
ΠΠ»Π³ΠΎΡΠΈΡΠΌ Π΄ΠΎΠ²Π΅ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ (trust region) ΡΠΎΠΏΡΡΠΆΠ΅Π½Π½ΡΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΎΠ² (ΠΡΡΡΠΎΠ½Π°)
ΠΠ»ΠΎΡ
Π°Ρ ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½Π½ΠΎΡΡΡ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ΅ΡΡΠ΅ ΠΈ Π½Π΅Π²Π΅ΡΠ½ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠΎΠΏΡΡΠΆΠ΅Π½Π½ΡΡ
Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΎΠ² ΠΡΡΡΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ. Π ΡΠ°ΠΊΠΈΡ
ΡΠ»ΡΡΠ°ΡΡ
ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠ΄Π°Π΅ΡΡΡ
ΠΡΠΈΠΌΠ΅Ρ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ΅ΡΡΠ΅:
res = minimize(rosen, x0, method='trust-ncg',
jac=rosen_der, hess=rosen_hess,
options={'gtol': 1e-8, 'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 20
Function evaluations: 21
Gradient evaluations: 20
Hessian evaluations: 19
[1. 1. 1. 1. 1.]
ΠΡΠΈΠΌΠ΅Ρ Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π³Π΅ΡΡΠΈΠ°Π½Π° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ°:
res = minimize(rosen, x0, method='trust-ncg',
jac=rosen_der, hessp=rosen_hess_p,
options={'gtol': 1e-8, 'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 20
Function evaluations: 21
Gradient evaluations: 20
Hessian evaluations: 0
[1. 1. 1. 1. 1.]
ΠΠ΅ΡΠΎΠ΄Ρ ΠΡΡΠ»ΠΎΠ²ΡΠΊΠΎΠ³ΠΎ ΡΠΈΠΏΠ°
ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ trust-ncg, ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΡΡΠ»ΠΎΠ²ΡΠΊΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Ρ
ΠΎΡΠΎΡΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΡΡΠΏΠ½ΠΎΠΌΠ°ΡΡΡΠ°Π±Π½ΡΡ
Π·Π°Π΄Π°Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² Π½ΠΈΡ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ°ΡΡΠΈΡΠ½ΠΎ-Π²Π΅ΠΊΡΠΎΡΠ½ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ. ΠΡ
ΡΡΡΡ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π·Π°Π΄Π°ΡΠΈ Π² Π΄ΠΎΠ²Π΅ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΉ ΡΡΠ΅ΡΠ΅Π½Π½ΡΠΌ ΠΏΠΎΠ΄ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΠΌ ΠΡΡΠ»ΠΎΠ²Π°. ΠΠ»Ρ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ
Π·Π°Π΄Π°Ρ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠ΅Π½ΡΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ
ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ Π·Π° ΡΡΠ΅Ρ ΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΌΠ°ΡΡΠΈΡΠ½ΠΎ-Π²Π΅ΠΊΡΠΎΡΠ½ΡΡ
ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΉ Π½Π° ΠΎΠ΄Π½Ρ ΠΏΠΎΠ΄Π·Π°Π΄Π°ΡΡ, ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ trust-ncg. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈΡΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π·Π°Π΄Π°ΡΠΈ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΡΠ½ΠΎ, ΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ trust-ncg.
ΠΡΠΈΠΌΠ΅Ρ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ΅ΡΡΠ΅:
res = minimize(rosen, x0, method='trust-krylov',
jac=rosen_der, hess=rosen_hess,
options={'gtol': 1e-8, 'disp': True})
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 19
Function evaluations: 20
Gradient evaluations: 20
Hessian evaluations: 18
print(res.x)
[1. 1. 1. 1. 1.]
ΠΡΠΈΠΌΠ΅Ρ Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π³Π΅ΡΡΠΈΠ°Π½Π° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ°:
res = minimize(rosen, x0, method='trust-krylov',
jac=rosen_der, hessp=rosen_hess_p,
options={'gtol': 1e-8, 'disp': True})
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 19
Function evaluations: 20
Gradient evaluations: 20
Hessian evaluations: 0
print(res.x)
[1. 1. 1. 1. 1.]
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π² Π΄ΠΎΠ²Π΅ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ
ΠΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ (Newton-CG, trust-ncg ΠΈ trust-krylov) Ρ ΠΎΡΠΎΡΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΡΡΠΏΠ½ΠΎΠΌΠ°ΡΡΡΠ°Π±Π½ΡΡ Π·Π°Π΄Π°Ρ (Ρ ΡΡΡΡΡΠ°ΠΌΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ). ΠΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Π»Π΅ΠΆΠ°ΡΠΈΠΉ Π² ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π΅ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠΎΠΏΡΡΠΆΠ΅Π½Π½ΡΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΎΠ² ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½Π½ΠΎΠ΅ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ΅ΡΡΠ΅. Π Π΅ΡΠ΅Π½ΠΈΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎ, Π±Π΅Π· ΡΠ²Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΡ Π³Π΅ΡΡΠΈΠ°Π½Π°. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π³Π΅ΡΡΠΈΠ°Π½Π° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ°, ΡΡΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Ρ ΠΎΡΠΎΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΠΌΠΈ (Π»Π΅Π½ΡΠΎΡΠ½ΡΠΌΠΈ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡΠ½ΡΠΌΠΈ) ΠΌΠ°ΡΡΠΈΡΠ°ΠΌΠΈ. ΠΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½ΠΈΠ·ΠΊΠΈΠ΅ Π·Π°ΡΡΠ°ΡΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
Π Π·Π°Π΄Π°ΡΠ°Ρ ΡΡΠ΅Π΄Π½Π΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π·Π°ΡΡΠ°ΡΡ Π½Π° Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈ ΡΠ°ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π³Π΅ΡΡΠΈΠ°Π½Π° Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΡΠ΅ΡΠ°ΡΡΠ΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΠΌΠ΅Π½ΡΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ, ΡΠ°Π·ΡΠ΅ΡΠΈΠ² ΠΏΠΎΠ΄Π·Π°Π΄Π°ΡΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ Π΄ΠΎΠ²Π΅ΡΠΈΡ ΠΏΠΎΡΡΠΈ ΡΠΎΡΠ½ΠΎ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΠ΅ΡΠ°ΡΡΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈΡΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π·Π°Π΄Π°ΡΠΈ. Π’Π°ΠΊΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΎΠ±ΡΡΠ½ΠΎ 3 ΠΈΠ»ΠΈ 4 ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΡ Π₯ΠΎΠ»Π΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ΅ΡΡΠ΅. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ ΡΡ ΠΎΠ΄ΠΈΡΡΡ Π·Π° ΠΌΠ΅Π½ΡΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΠΈ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΌΠ΅Π½ΡΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄ΠΎΠ²Π΅ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ. ΠΡΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ΅ΡΡΠ΅ ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π³Π΅ΡΡΠΈΠ°Π½Π° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ°.
ΠΡΠΈΠΌΠ΅Ρ Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ°:
res = minimize(rosen, x0, method='trust-exact',
jac=rosen_der, hess=rosen_hess,
options={'gtol': 1e-8, 'disp': True})
res.x
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 13
Function evaluations: 14
Gradient evaluations: 13
Hessian evaluations: 14
array([1., 1., 1., 1., 1.])
ΠΠ° ΡΡΠΎΠΌ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅ ΠΏΠΎΡΡΠ°ΡΠ°ΡΡΡ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ ΡΠ°ΠΌΠΎΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ΅ ΠΎΠ± ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ Π°ΠΏΠΏΡΠΎΠΊΡΠΈΠΌΠ°ΡΠΈΠΈ, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΡ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΎΡΠ°Ρ ΠΈ ΠΏΠΎΠΈΡΠΊΠ΅ ΠΊΠΎΡΠ½Π΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ° scipy.optimize.
ΠΡΡΠΎΡΠ½ΠΈΠΊ:
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com