Подгонка данных к повторным производным функции, генерирующей модель - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь приспособить модель с генерирующей функцией 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.

Я ценю любую помощь, которую могу получить.Большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...