Я пытаюсь приспособить модель с генерирующей функцией func()
к экспериментальным данным, хранящимся в y_data
.Установленные значения модели - это повторные производные от func()
.Например, при x = 3 установленное значение должно быть производной 3-го порядка func()
.y_data
выглядит следующим образом:
0 0.512
1 0.617
2 0.824
3 0.610
4 0.994
5 1.115
6 2.245
7 2.624
8 2.403
9 3.035
10 3.368
Я использую одномерную функцию полинома Тейлора UTPM' in
algopy` для получения значений производных.Мой код (с комментариями) выглядит следующим образом:
import numpy as np
import math
from algopy import UTPM
from scipy.optimize import leastsq
p0 = np.array([3.0, 0.7, 4.0, 0.6])
x_data = np.arange(0, 101, 1)
y_data = np.loadtxt("data.txt")[:, 1]
def chisq(*p0):
print(p0)
def func(x, *p0):
return p0[0]*np.log(p0[1] * ((1-p0[3]) / (1-(p0[3]*x)))**p0[2] + 1 - p0[1])
D = 11; P = 1
x = UTPM(np.zeros((D,P)))
x.data[0,0] = 0
x.data[1,0] = 1
derv = func(x, *p0)
y_model = np.zeros(D)
for i in range(D):
y_model[i] = derv.data[i,0]*math.factorial(i)
err = 0.
for j in range(len(y_model)):
err += (y_data[j] - y_model[j])**2
return err
pbest, pcov = leastsq(chisq, p0)
Я ожидаю, что pbest
будет 4-элементным np.array
параметров наилучшего соответствия, но получил следующее сообщение об ошибке
in func return p0[0]*np.log(p0[1]*((1-p0[3])/(1-(p0[3]*x)))**p0[2] + 1 - p0[1])
IndexError: tuple index out of range
Я не уверен, почему была выдана эта ошибка, так как мой массив p0
имеет значения от 'p0 [0]' до 'p0 [3]', которые все использовались в func(x,*p0)
.Я понял из IndexError: индекс кортежа вне диапазона ----- Python , что это происходит, когда кто-то вызывает индекс, который не существует.Однако я не могу понять, почему это так, поскольку p0
является массивом из 4 элементов, и я не вызываю ничего, кроме p0[3]
в func
.
Я ценю любую помощь, которую могу получить.Большое спасибо.