SciPy (ΡΠ΅ ΠΈΠ·Π³ΠΎΠ²Π°ΡΠ° ΡΠ°ΠΈ ΠΏΠΈΡΠ°) Π΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠΊΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° Π½Π°ΡΡΠ°Π²ΠΊΠ°ΡΠ° Numpy Python. Π‘ΠΎ SciPy, Π²Π°ΡΠ°ΡΠ° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π° Python ΡΠ΅ΡΠΈΡΠ° ΡΡΠ°Π½ΡΠ²Π° ΠΈΡΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ»Π΅ΡΠ½Π° Π½Π°ΡΠΊΠ° Π·Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ ΡΠ»ΠΎΠΆΠ΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΡΠΊΠ° ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ½Π° ΡΡΠ΅Π΄ΠΈΠ½Π° ΠΊΠ°ΠΊΠΎ MATLAB, IDL, Octave, R-Lab ΠΈ SciLab. ΠΠ΅Π½Π΅Ρ ΡΠ°ΠΊΠ°ΠΌ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ Π΄Π° Π·Π±ΠΎΡΡΠ²Π°ΠΌ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΊΠΎΡΠΈΡΡΠ°ΠΌ Π½Π΅ΠΊΠΎΠΈ Π΄ΠΎΠ±ΡΠΎ ΠΏΠΎΠ·Π½Π°ΡΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠ° Π²ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΎΡ scipy.optimize. ΠΠΎΠ΄Π΅ΡΠ°Π»Π½Π° ΠΈ Π°ΠΆΡΡΠΈΡΠ°Π½Π° ΠΏΠΎΠΌΠΎΡ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° help() ΠΈΠ»ΠΈ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Shift+Tab.
ΠΠΎΠ²Π΅Π΄
Π‘ΠΎ ΡΠ΅Π» Π΄Π° ΡΠ΅ ΡΠΏΠ°ΡΠΈΡΠ΅ ΡΠ΅Π±Π΅ΡΠΈ ΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈΡΠ΅ ΠΎΠ΄ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ ΠΈ ΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΈΠΌΠ°ΡΠ½ΠΈ ΠΈΠ·Π²ΠΎΡΠΈ, Π²ΡΡΠΊΠΈΡΠ΅ Π΄ΠΎ ΠΎΠΏΠΈΡΠΈΡΠ΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ ΡΠ΅ Π±ΠΈΠ΄Π°Ρ Π³Π»Π°Π²Π½ΠΎ Π½Π° ΠΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΡΠ°. ΠΠ°ΠΊΠΎ ΠΏΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΎΠ²ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΠ΅ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ Π·Π° Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ Π²ΠΎ ΠΎΠΏΡΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈ ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡΠ΅ Π·Π° Π½ΠΈΠ²Π½Π° ΠΏΡΠΈΠΌΠ΅Π½Π°. ΠΠ° Π΄Π° ΡΠ° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΡΡΡΡΠΈΠ½Π°ΡΠ° Π½Π° ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠΊΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ, ΡΠ»Π΅Π΄Π΅ΡΠ΅ Π³ΠΈ Π²ΡΡΠΊΠΈΡΠ΅ Π΄ΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ Π°Π²ΡΠΎΡΠΈΡΠ΅ΡΠ½ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ, ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π°Ρ Π½Π° ΠΊΡΠ°ΡΠΎΡ ΠΎΠ΄ ΡΠ΅ΠΊΠΎΡΠ° ΡΡΠ°ΡΠΈΡΠ° ΠΈΠ»ΠΈ Π²ΠΎ Π²Π°ΡΠΈΠΎΡ ΠΎΠΌΠΈΠ»Π΅Π½ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°Ρ.
ΠΠ½Π°ΡΠΈ, ΠΌΠΎΠ΄ΡΠ»ΠΎΡ scipy.optimize Π²ΠΊΠ»ΡΡΡΠ²Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΠ²Π΅ ΠΏΠΎΡΡΠ°ΠΏΠΊΠΈ:
- Π£ΡΠ»ΠΎΠ²Π½ΠΎ ΠΈ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΊΠ°Π»Π°ΡΠ½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ (ΠΌΠΈΠ½ΠΈΠΌΡΠΌ) ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ (Nelder-Mead simplex, BFGS, ΠΡΡΠ½ ΠΊΠΎΠ½ΡΡΠ³ΠΈΡΠ°Π½ΠΈ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΈ,
ΠΠΠΠΠΠ ΠΈSLSQP ) - ΠΠ»ΠΎΠ±Π°Π»Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠ° (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ:
Π±Π°ΡΠ΅Π½ΠΎΡ ,diff_evolution ) - ΠΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΎΡΡΠ°ΡΠΎΡΠΈΡΠ΅
ΠΠΠ¦ (Π½Π°ΡΠΌΠ°Π»ΠΊΡ_ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈ) ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π° ΡΠΈΡΠΈΠ½Π³ Π½Π° ΠΊΡΠΈΠ²Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π½Π΅Π»ΠΈΠ½Π΅Π°ΡΠ½ΠΈ Π½Π°ΡΠΌΠ°Π»ΠΈ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈ (ΠΊΡΠΈΠ²Π°_ΡΠΈΡ) - ΠΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΊΠ°Π»Π°ΡΠ½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Π΅Π΄Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° (minim_scalar) ΠΈ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΡΠ΅Π½ΠΈ (root_scalar)
- ΠΠΎΠ²Π΅ΡΠ΅Π΄ΠΈΠΌΠ΅Π½Π·ΠΈΠΎΠ½Π°Π»Π½ΠΈ ΡΠ΅ΡΠ°Π²Π°ΡΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌ Π½Π° ΡΠ°Π²Π΅Π½ΠΊΠΈ (ΠΊΠΎΡΠ΅Π½) ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ (Ρ
ΠΈΠ±ΡΠΈΠ΄Π΅Π½ ΠΠ°ΡΠ΅Π»,
ΠΠ΅Π²Π΅Π½Π±Π΅ΡΠ³-ΠΠ°ΡΠΊΠ°ΡΡ ΠΈΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΎΠ΄ Π³ΠΎΠ»Π΅ΠΌΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ΠΡΡΠ½-ΠΡΠΈΠ»ΠΎΠ² ).
ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΡΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ°ΠΌΠΎ ΠΏΡΠ²Π°ΡΠ° ΡΡΠ°Π²ΠΊΠ° ΠΎΠ΄ ΡΠ΅Π»Π°ΡΠ° ΠΎΠ²Π°Π° Π»ΠΈΡΡΠ°.
ΠΠ΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΊΠ°Π»Π°ΡΠ½Π° ΡΡΠ½ΠΊΡΠΈΡΠ° ΠΎΠ΄ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
Π€ΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° minim ΠΎΠ΄ ΠΏΠ°ΠΊΠ΅ΡΠΎΡ scipy.optimize ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΠΎΠΏΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ Π·Π° ΡΠ΅ΡΠ°Π²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠΎ ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΈ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΊΠ°Π»Π°ΡΠ½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. ΠΠ° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°, ΡΠ΅ Π½ΠΈ ΡΡΠ΅Π±Π° ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½Π° ΡΡΠ½ΠΊΡΠΈΡΠ° ΠΎΠ΄ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΠΊΠΎΠΈ ΡΠ΅ Π³ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π°ΡΠΈΠ½ΠΈ.
ΠΠ° ΠΎΠ²ΠΈΠ΅ ΡΠ΅Π»ΠΈ, ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊ Π½Π° N ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π΅ ΡΠΎΠ²ΡΡΠ΅Π½Π°, ΠΊΠΎΡΠ° ΠΈΠΌΠ° ΡΠΎΡΠΌΠ°:
Π ΠΏΠΎΠΊΡΠ°Ρ ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Rosenbrock ΠΈ Π½Π΅ΡΠ·ΠΈΠ½ΠΈΡΠ΅ Jacobi ΠΈ Hessian ΠΌΠ°ΡΡΠΈΡΠΈ (ΠΏΡΠ²ΠΈΠΎΡ ΠΈ Π²ΡΠΎΡΠΈΠΎΡ Π΄Π΅ΡΠΈΠ²Π°Ρ, ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΎ) ΡΠ΅ Π²Π΅ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π²ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΎΡ 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.
ΠΠ΅Π»Π΄Π΅Ρ-ΠΠΈΠ΄ ΡΠΈΠΌΠΏΠ»Π΅ΠΊΡ ΠΌΠ΅ΡΠΎΠ΄
ΠΠ΅ΠΊΠ° ΠΈΠΌΠ° ΠΏΠΎΡΠ΅ΡΠ½Π° ΡΠΎΡΠΊΠ° 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.]
Π‘ΠΈΠΌΠΏΠ»Π΅ΠΊΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΡ Π΅ Π½Π°ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈΠΎΡ Π½Π°ΡΠΈΠ½ Π·Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° Π΅ΠΊΡΠΏΠ»ΠΈΡΠΈΡΠ½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π° ΠΈ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ ΠΌΠ°Π·Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ°. ΠΠ΅ Π±Π°ΡΠ° ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ°, Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π½Π°Π²Π΅Π΄Π°Ρ ΡΠ°ΠΌΠΎ Π½Π΅ΡΠ·ΠΈΠ½ΠΈΡΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ. ΠΠ΅ΡΠΎΠ΄ΠΎΡ Nelder-Mead Π΅ Π΄ΠΎΠ±Π°Ρ ΠΈΠ·Π±ΠΎΡ Π·Π° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΡΠ΅. ΠΠ΅ΡΡΡΠΎΠ°, Π±ΠΈΠ΄Π΅ΡΡΠΈ Π½Π΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΏΡΠΎΡΠ΅Π½ΠΊΠΈ Π½Π° Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ, ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π΅ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΠΎΡ.
ΠΠ°ΡΠ΅Π» ΠΌΠ΅ΡΠΎΠ΄
ΠΡΡΠ³ Π°Π»Π³ΠΎΡΠΈΡΠ°ΠΌ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠ° Π²ΠΎ ΠΊΠΎΡ ΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π°Π°Ρ ΡΠ°ΠΌΠΎ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π΅
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.]
ΠΠ»Π³ΠΎΡΠΈΡΠ°ΠΌ Broyden-Fletcher-Goldfarb-Shanno (BFGS).
ΠΠ° Π΄Π° ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ ΠΏΠΎΠ±ΡΠ·ΠΎ ΠΊΠΎΠ½Π²Π΅ΡΠ³Π΅Π½ΡΠΈΡΠ° Π΄ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΡΠ°ΠΏΠΊΠ°ΡΠ°
ΠΠ° Π³ΠΎ Π½Π°ΡΠ΄Π΅ΠΌΠ΅ Π΄Π΅ΡΠΈΠ²Π°ΡΠΎΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊ Π²ΠΎ Π°Π½Π°Π»ΠΈΡΠΈΡΠΊΠ° ΡΠΎΡΠΌΠ°:
ΠΠ²ΠΎΡ ΠΈΠ·ΡΠ°Π· Π΅ Π²Π°Π»ΠΈΠ΄Π΅Π½ Π·Π° ΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅ Π½Π° ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΎΡΠ²Π΅Π½ ΠΏΡΠ²Π°ΡΠ° ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ°, ΠΊΠΎΠΈ ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΠΊΠ°ΠΊΠΎ:
ΠΡΠ΄Π΅ Π΄Π° ΡΠ° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° ΠΠ°ΡΡΠΎΠ½ ΡΡΠΎ Π³ΠΎ ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π° ΠΎΠ²ΠΎΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ:
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 Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π°, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅ ΠΏΡΠΈΠΊΠ°ΠΆΠ°Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠ»Ρ.
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 Π΄ΠΎ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π·Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΡΠ΅:
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
ΠΠ»Π³ΠΎΡΠΈΡΠ°ΠΌ Π·Π° Π΄ΠΎΠ²Π΅ΡΠ»ΠΈΠ² ΡΠ΅Π³ΠΈΠΎΠ½ Π½Π° ΠΊΠΎΠ½ΡΡΠ³ΠΈΡΠ°Π½ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ (ΠΡΡΠ½)
ΠΠΎΡΠ°ΡΠ° ΠΊΠΎΠ½Π΄ΠΈΡΠΈΡΠ° Π½Π° Π₯Π΅ΡΠΈΡΠ°Π½ΡΠΊΠ°ΡΠ° ΠΌΠ°ΡΡΠΈΡΠ° ΠΈ Π½Π΅ΡΠΎΡΠ½ΠΈΡΠ΅ Π½Π°ΡΠΎΠΊΠΈ Π·Π° ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°Π°Ρ ΠΡΡΠ½ΠΎΠ²ΠΈΠΎΡ ΠΊΠΎΡΡΠ³Π°ΡΠ΅Π½ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ Π°Π»Π³ΠΎΡΠΈΡΠ°ΠΌ Π΄Π° Π±ΠΈΠ΄Π΅ Π½Π΅Π΅ΡΠΈΠΊΠ°ΡΠ΅Π½. ΠΠΎ ΡΠ°ΠΊΠ²ΠΈ ΡΠ»ΡΡΠ°ΠΈ, ΠΏΡΠ΅Π΄Π½ΠΎΡΡ ΡΠ΅ Π΄Π°Π²Π° Π½Π°
ΠΡΠΈΠΌΠ΅Ρ ΡΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡΠ° Π½Π° Π₯Π΅ΡΠΈΡΠ°Π½ΡΠΊΠ°ΡΠ° ΠΌΠ°ΡΡΠΈΡΠ°:
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 ΠΏΠ°ΠΊΠ΅Ρ.
ΠΠ·Π²ΠΎΡ:
ΠΠ·Π²ΠΎΡ: www.habr.com