Проблемы с поиском локального минимума с помощью SciPy
Я пытаюсь найти локальные минимумы для функции fun(альфа), определенной в коде ниже. Графическое изображение этой целевой функции можно найти здесь. Как показано на графике, существуют 3 локальных минимума для альфа между 0 и 1. Они примерно равны альфа = 0,08, альфа = 0,26 и альфа = 0,98. Моя проблема в том, что независимо от того, какой алгоритм оптимизации Scipy я использую (L-BFGS-B, Nelder-Meade или COBYLA) или моего начального начального значения, я не могу найти локальный минимум около альфа = .26. Другие локальные минимумы всегда найдены вместо этого. Чтобы проиллюстрировать эту проблему, в приведенном ниже коде я выбрал начальную альфа-версию.3 только для того, чтобы алгоритм L-BFGS-B нашел минимум.08. Учитывая плавность этой функции, я удивлен, что SciPy так сложно найти минимум.26. Я что-то упускаю в опциях L-BFGS-B, которые могли бы помочь алгоритму? Руководство по этому вопросу будет с благодарностью.
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as opt
import math
P=54
R=132
S=28
T=162
rho=2.0
sigma=-0.112
lam=.5
n=3
m=(n-1)/2
def nCr(n,r):
f = math.factorial
return f(n) / f(r) / f(n-r)
def g(alpha,lam):
sum1=0.0
for x in range(0,m+1):
sum1+=nCr(n,x)*alpha**x*(1-alpha)**(n-x)
sum2=0.0
for x in range(m+1,n+1):
sum2+=nCr(n,x)*alpha**x*(1-alpha)**(n-x)
return 1/float(1+np.exp(lam*nCr(2*m,m)*alpha**m*(1-alpha)**m*(sum1*(P-(S+n/float(2*n-1)*sigma*(T-S)))+sum2*(T-n/float(2*n-1)*rho*(T-S)-R))))
def fun(alpha):
return np.square(g(alpha,lam)-alpha)
F=np.zeros((1,1001))
alphas=np.linspace(0,1,1001)
indexAlpha=0
for alpha in alphas:
F[0,indexAlpha]=fun(alpha)
indexAlpha+=1
print
plt.ylim([0,1])
[a] = plt.plot(alphas,np.transpose(F))
plt.ylabel('fun')
plt.xlabel('alpha')
plt.show()
print
alpha0=.3
results=opt.minimize(fun, alpha0, method='L-BFGS-B', bounds=[(0,1)])
print "fun:",results.fun[0]
print "alpha:",results.x[0]