import numpy as np # добавлен импорт
def simplex(f, x, eps=1e-5, alpha=1, beta=0.5, gamma=2, sigma=0.5):
x = np.stack((x + [0., 0.5], x + [-0.5, -0.5], x + [0.5, -0.5]), axis=-1)
fx = f(x)
it = 0
while np.var(fx) > eps: # исправлено: np_var -> np.var
ix = np.argsort(fx)
fx = fx[ix]
x = x[:, ix]
xo = np.mean(x[:, :-1], axis=1)
xr = xo + alpha * (xo - x[:, -1])
fxr = f(xr)
if fx[0] <= fxr < fx[-2]:
xr = xo + alpha * (xo - x[:, -1])
x[:, -1] = xr
fx = f(x) # пересчёт значений после изменения симплекса
elif fxr < fx[0]:
xe = xo + gamma * (xr - xo)
x[:, -1] = xe if f(xe) < fxr else xr
fx = f(x)
elif fxr >= fx[-2]:
xc = xo + beta * (x[:, -1] - xo)
if f(xc) < fx[-1]:
x[:, -1] = xc
fx = f(x)
else:
x = x[:, 0] + sigma * (x - x[:, 0])
fx = f(x)
it = it + 1
ix = np.argmin(fx)
return x[:, ix], fx[ix], it
def f(x):
return x[0]**4 + 2*x[1]**2 - x[0]*x[1]
x = np.array([3, 3])
x_min, f_min, it = simplex(f, x, eps=1e-20) # исправлено: три переменные
print(x, x_min, f_min, it) # начальная точка, найденный минимум, значение, итерации
import scipy.optimize as optim
def f(x):
return x[0]**4 + 2*x[1]**2 - x[0]*x[1]
res = optim.minimize(f, x0=[0.3, 0.3], method='Nelder-Mead')
print('сумненький метод', '\n', res)
print('минуум', res.x, res.fun, res.nit)