SciPy (ΠΏΡΠΎΠΈΠ·Π½Π°ΡΡ ΡΠ΅ sai pai) Π΅ ΠΏΠ°ΠΊΠ΅Ρ Ρ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ Numpy Python. Π‘ΡΡ SciPy Π΅Π΄Π½Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π° Python ΡΠ΅ΡΠΈΡ ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΡΠ° Π² ΡΡΡΠ°ΡΠ° ΠΏΡΠ»Π½Π° ΡΡΠ΅Π΄Π° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠ»ΠΎΠΆΠ½Π° ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ½Π° ΡΡΠ΅Π΄Π° ΠΊΠ°ΡΠΎ MATLAB, IDL, Octave, R-Lab ΠΈ SciLab. ΠΠ½Π΅Ρ ΠΈΡΠΊΠ°ΠΌ Π΄Π° Π³ΠΎΠ²ΠΎΡΡ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ° Π½ΡΠΊΠΎΠΈ Π΄ΠΎΠ±ΡΠ΅ ΠΏΠΎΠ·Π½Π°ΡΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π² ΠΏΠ°ΠΊΠ΅ΡΠ° scipy.optimize. ΠΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π° ΠΈ Π°ΠΊΡΡΠ°Π»Π½Π° ΠΏΠΎΠΌΠΎΡ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΡΡΠ΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° help() ΠΈΠ»ΠΈ ΡΡΠ΅Π· Shift+Tab.
Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ° Π΄Π° ΡΠΏΠ΅ΡΡΡ ΡΠ΅Π±Π΅ ΡΠΈ ΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈΡΠ΅ ΠΎΡ ΡΡΡΡΠ΅Π½Π΅ ΠΈ ΡΠ΅ΡΠ΅Π½Π΅ Π½Π° ΠΏΡΡΠ²ΠΎΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ, Π²ΡΡΠ·ΠΊΠΈΡΠ΅ ΠΊΡΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΡΠ° Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅Π΄ΠΈΠΌΠ½ΠΎ Π² Wikipedia. ΠΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ°Π·ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½Π° Π·Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ Π² ΠΎΠ±ΡΠΈ Π»ΠΈΠ½ΠΈΠΈ ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ° Π·Π° ΡΡΡ Π½ΠΎΡΠΎ ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅. ΠΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΡΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ, ΡΠ»Π΅Π΄Π²Π°ΠΌΠ΅ Π²ΡΡΠ·ΠΊΠΈΡΠ΅ ΠΊΡΠΌ ΠΏΠΎ-Π°Π²ΡΠΎΡΠΈΡΠ΅ΡΠ½ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² ΠΊΡΠ°Ρ Π½Π° Π²ΡΡΠΊΠ° ΡΡΠ°ΡΠΈΡ ΠΈΠ»ΠΈ Π² Π»ΡΠ±ΠΈΠΌΠ°ΡΠ° Π²ΠΈ ΡΡΡΡΠ°ΡΠΊΠ°.
Π ΡΠ°ΠΊΠ°, ΠΌΠΎΠ΄ΡΠ»ΡΡ scipy.optimize Π²ΠΊΠ»ΡΡΠ²Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΈ:
- Π£ΡΠ»ΠΎΠ²Π½ΠΎ ΠΈ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΠ°Π»Π°ΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ (ΠΌΠΈΠ½ΠΈΠΌΡΠΌ) Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ (ΡΠΈΠΌΠΏΠ»Π΅ΠΊΡ Π½Π° Nelder-Mead, BFGS, ΠΊΠΎΠ½ΡΠ³ΠΈΡΠ°Π½ΠΈ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΈ Π½Π° ΠΡΡΠΎΠ½,
ΠΠΠΠΠΠ ΠΈSLSQP ) - ΠΠ»ΠΎΠ±Π°Π»Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
Π±Π°ΡΠ΅ΠΉΠ½ΠΎΠ²ΠΈ Ρ ΡΠ»ΠΌΠΎΠ²Π΅ ,diff_evolution ) - ΠΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΡΠ°ΡΡΡΠΈΡΠ΅
MNC (least_squares) ΠΈ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π° Π½Π°ΠΏΠ°ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΡΠΈΠ²Π°ΡΠ° Π½Π° Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΈΡΠ΅ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈ (curve_fit) - ΠΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΠ°Π»Π°ΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Π΅Π΄Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° (minim_scalar) ΠΈ Π½Π°ΠΌΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΡΠ΅Π½ΠΈ (root_scalar)
- Π Π΅ΡΠ°Π²Π°ΡΠ΅Π»ΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΈ Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ²Π°ΡΠΈΠ°Π½ΡΠ½ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ (root), ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ (Hybrid Powell,
ΠΠ΅Π²Π΅Π½Π±Π΅ΡΠ³-ΠΠ°ΡΠΊΠ²Π°ΡΠ΄ ΠΈΠ»ΠΈ ΡΠΈΡΠΎΠΊΠΎΠΌΠ°ΡΠ°Π±Π½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΡΡΠΎΠ½-ΠΡΠΈΠ»ΠΎΠ² ).
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ°ΠΌΠΎ ΠΏΡΡΠ²ΠΈΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΠΎΡ ΡΠ΅Π»ΠΈΡ ΡΠΎΠ·ΠΈ ΡΠΏΠΈΡΡΠΊ.
ΠΠ΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΠ°Π»Π°ΡΠ½Π° ΡΡΠ½ΠΊΡΠΈΡ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
Π€ΡΠ½ΠΊΡΠΈΡΡΠ° 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 ΠΏΡΠΈ , Π½Π΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΊΠ°ΠΊ Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° Rosenbrock Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ scipy.optimize ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΈ.
Π‘ΠΈΠΌΠΏΠ»Π΅ΠΊΡΠ΅Π½ ΠΌΠ΅ΡΠΎΠ΄ Π½Π° Nelder-Mead (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.]
Π‘ΠΈΠΌΠΏΠ»Π΅ΠΊΡΠ½ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π΅ Π½Π°ΠΉ-ΠΏΡΠΎΡΡΠΈΡΡ Π½Π°ΡΠΈΠ½ Π·Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·ΡΠΈΡΠ½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π° ΠΈ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»Π½ΠΎ Π³Π»Π°Π΄ΠΊΠ° ΡΡΠ½ΠΊΡΠΈΡ. ΠΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ°, Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΅ Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΡΠ°ΠΌΠΎ Π½Π΅ΠΉΠ½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. ΠΠ΅ΡΠΎΠ΄ΡΡ Π½Π° 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.]
ΠΠ»Π³ΠΎΡΠΈΡΡΠΌ Π½Π° ΠΡΠΎΠΉΠ΄ΡΠ½-Π€Π»Π΅ΡΡΡΡ-ΠΠΎΠ»Π΄ΡΠ°ΡΠ±-Π¨Π°Π½ΠΎ (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 ΠΊΡΠΌ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅:
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