Вот допустим есть такая формула: http://ib1.keep4u.ru/b/2011/03/30/5c/5c8ab36a8ce7000351262e2ee0c7e3b6.jpg
Превращаем ее в толстую быдлофункцию:
from math import *
def mp(m1,m2):
x=[]
for i in range(len(m1)):
x.append(m1[i]*m2[i])
return x
def f(xn,dh,rb,rp):
if sum(xn) != 1:
return 0
for i in xn:
if i < 0:
return 0
s1 = map(lambda x:x**2,xn)
s2 = mp(s1,rb)
s3 = sqrt(float(sum(s2)))
if s3 > rp:
return 0
return -sum(mp(xn,dh))
Потом пытаемся минимизировать:
# сперва смотрим че вообще выдает функция:
x0=[0.25,0.25,0.25,0.25]
rd=[ 0.0220669994648, 0.0264627345776, 0.0332991909211, 0.0276608158607, 0.0263295768645]
dh =[ 0.00677940378104, 0.00488035011562, 0.00114327432916, 0.00759421827662, 0.0122339011693]
print "Функция с параметрами выше: ", f(x0,dh,rd,0.15)
# теперь смотрим что выдала оптимизация:
from scipy.optimize import fmin
xopt = fmin(f, x0, args=(dh,rb,0.2),xtol=1e-8,disp=1,retall=1)
print xopt
И смотрим результат:
Функция с параметрами выше: -0.00169485094526
Optimization terminated successfully.
Current function value: -0.001695
Iterations: 51
Function evaluations: 287
выхлоп оптимизации:
(array([ 0.25, 0.25, 0.25, 0.25]), [array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25]), array([ 0.25, 0.25, 0.25, 0.25])])
Чегойто оно нифига не оптимизирует? Есть конечно предположение, что градиентрый спуск (это и есть fmin) очень плохо переваривает возвращение нулей функции, но что тогда другое использовать?