Я пытаюсь согласовать кусочную функцию с абсолютными значениями, используя Numpy.
Математическая функция
x
x> = p [1]: y = 1 + p [0] * abs ((x - p [1]) / размер - размер / 2)
Вот моя функция Python:
fitfunc = lambda p, x: \
x < p[1] and\
1 + p[0] * abs((data['n1'].size + x - p[1]) / data['n1'].size - data['n1'].size / 2) or\
1 + p[0] * abs((x - p[1]) / data['n1'].size - data['n1'].size / 2)
Хотя я получаю сообщение об ошибке:
The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Однако любой и все оценивают весь список в одно логическое значение.
Дополнительная информация:
Я использовал лямбды для подгонки данных к синусоиде с помощью следующего:
fitfunc = lambda p, x: 1 + p[0] * sin(pi * x / data['n1'].size + p[1])
errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function
Затем в цикле:
data = np.genfromtxt(dataFileName, names=('n1', 'n2'))
xAxisSeries = scipy.linspace(0., data['n1'].max(), data['n1'].size)
p0 = [489., 123.] # Initial guess for the parameters
p1, success = scipy.optimize.leastsq(errfunc, p0[:], args=(xAxisSeries, data['n2']))
#time says which points from the sine wave will be plotted
time = scipy.linspace(0., data['n1'].max(), 100)
pylab.plot(time, fitfunc(p1, time), 'r-')
Я пытаюсь использовать лямбда-функцию, потому что optimize.leastsq требует ее. Я использую точно такой же код, за исключением изменения fitfunc.