Я действительно новичок в программировании, и я немного нахожусь здесь, со всей этой минимизирующей деятельностью, поэтому это может быть просто ошибка, но когда я пытаюсь запустить свой код ниже, он просто возвращает значения 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. Есть предположения?
Спасибо!