У меня есть набор деревьев. В этом наборе данных у меня есть уникальный номер графика, последовательность в том порядке, в котором были взяты данные «Измерение», а также среднее значение высоты в метрах и среднего возраста в годах для деревьев. Примерно так: заголовок данных
Затем я определяю модель для прогнозирования роста, используя возраст следующим образом:
Рост = B0 * ((1 - exp (-B1 * Возраст)) ** B2)
Моя цель - определить значения B0, B1 и B2 соответственно. Для этого я использую пакет gekko, чтобы найти параметры моделей со следующим кодом:
num_p = data_gek.Plot.unique()
nmp = 5
number_p = (data_gek.Plot == num_p[nmp])
m = GEKKO()
xm = np.array(data_gek[number_p]['Age'])
x = m.Param(value=xm)
B0 = m.FV(value=38.2) #value=38.2
B0.STATUS = 1
B1 = m.FV(value=0.1) #value=0.1
B1.STATUS = 1
B2 = m.FV(value=2.08) #value=2.08
B2.STATUS = 1
ym = np.array(data_gek[number_p]['Height'])
z = m.CV(value=ym)
y = m.Var()
m.Equation(y==B0 * ((1 - m.exp(-B1 *x))**B2))
m.Obj(((y-z)/z)**2)
m.options.IMODE = 2
m.options.SOLVER = 1
m.solve(disp=False)
print(B0.value[0],B1.value[0],B2.value[0])
#output
27.787958561 0.0052435491089 0.21178326158
Однако я не уверен, что поступаю правильно. Можно ли это сделать без начальных значений в параметрах? Потому что я использовал предыдущие значения для B0, B1 и B2 из литературы.
Если вы хотите увидеть мой набор данных и мой процесс, вы можете получить доступ к этой записной книжке в Google Colab < / а>.