2013-10-10 4 views
0

Я действительно новичок в программировании, и я немного нахожусь здесь, со всей этой минимизирующей деятельностью, поэтому это может быть просто ошибка, но когда я пытаюсь запустить свой код ниже, он просто возвращает значения x0, которые я ввел, чтобы начать.Scipy Minimize SLSQP просто возвращает x0

Что я пытаюсь сделать: У меня есть две «функции», состоящие из точек, f (x) и h (x). f (X) можно рассматривать как измеренную кривую, а h (x) - контрольная кривая. Я пытаюсь использовать наименьшие квадраты, чтобы найти шкалы горизонтального сдвига, x шкалы и y, которые наилучшим образом соответствуют контрольной кривой для измеренных результатов.

Я использую интерполяционную функцию для подгонки сплайна к опорным данным, поэтому сплайн можно использовать для поиска промежуточных значений вдоль кривой.

Вот мой код:

import numpy 
from scipy import optimize 
from scipy import interpolate 


def f(x): 
    vals = {1: 0.35, 17: 0.45, 33: 0.67, 49: 0.8, 65: 0.73, 81: 0.65, 97: 0.51, 113: 0.27, 129: 0.01, 145: -0.1, 
      161: -0.19, 177: -0.21, 193: -0.2, 209: -0.23, 225: -0.24, 241: -0.25, 257: -0.23, 273: -0.26, 289: -0.28, 
      305: -0.22, 321: -0.24, 337: -0.12, 353: 0.14} 
    return vals[x] 


def h(x): 
    vals = {1: -0.2, 17: -0.2, 33: -0.2, 49: -0.2, 65: -0.2, 81: -0.2, 97: -0.2, 113: -0.2, 129: -0.1, 145: 0.1, 
      161: 0.32, 177: 0.4, 193: 0.7, 209: 0.81, 225: 0.7, 241: 0.6, 257: 0.5, 273: 0.3, 289: 0, 305: -0.1, 
      321: -0.2, 337: -0.2, 353: -0.2} 
    return vals[x] 


x1 = [] 
y1 = [] 

for i in range(1, 365, 16): 
    x1.append(i) 
    y1.append(h(i)) 

tck = interpolate.splrep(x1, y1) 

fun = lambda x: ((1/22.8125 * numpy.sum(
    (f(i) - (x[0] * interpolate.splev((x[1] * (i + x[2]) + 0.5), tck)) - 0.5) ** 2 for i in range(1, 365, 16))) ** (
        1/2)) 

bnds = ((0.3, 1.5), (0.3, 1.5), (0, 150)) 

res = optimize.minimize(fun, (1, 1, 0), method='SLSQP', bounds=bnds) 

print res.x 

Опять же, когда я запускаю это я просто получить [1.0, 1.0, 0.0] для res.x. Есть предположения?

Спасибо!

ответ

0

1/2 в Python2 без from __future__ import division равен 0, и это, по-видимому, является причиной вашей проблемы. После замены 0.5 или 1./2, я получаю

[ 3.00000000e-01 1.14967789e+00 7.48854782e-04] 

для res.x.

Смежные вопросы