Функции роста не согласятся - удивительный результат - PullRequest
1 голос
/ 06 марта 2020

ОК, я работаю над статьей ( Paine et al 2012 ) о создании функций роста в Python. Функции роста выражаются несколькими различными способами, и мне нужно будет использовать более одного из них (для разных приложений).

Уравнение1: Gompertz function expressed as change in mass per change in time Уравнение 2: Gompertz function expressed as a function of time

Уравнение 1 - это функция Гомперца, выраженная как изменение массы на изменение во времени, а Уравнение 2 - это та же самая функция Гомперца, выраженная как функция общего прошедшего времени. Один вычисляет изменение массы на основе текущей массы, а другой вычисляет массу на основании того, как долго она росла.

Я перевел это в python и написал некоторый код для проверки они совпадают (поскольку они являются различными выражениями одного и того же уравнения, это не должно быть проблемой ...)

import numpy as np
import matplotlib.pyplot as plt

def gompertz_t(m_0, K, r, t):
    return K*(m_0/K)**np.exp(-r*t)

def gompertz_m(m, K, r):
    eq1 = r*m
    eq2 = np.log(K/m)
    return m+eq1*eq2

x = list(range(0,50,1))

m_0 = 0.1 #(must not be equal to zero)

#Set up values for year 0
y_1 = [m_0]
y_2 = [m_0]

for i in x[1:]:
    #And run for x years
    y_1.append(gompertz_m(y_1[-1],50,0.5))
    y_2.append(gompertz_t(y_2[0],50,0.5,i))

# df = pd.DataFrame(index = x)
# df["gompertz_m"] = y_1
# df["gompertz_t"] = y_2
# df.to_clipboard()

fig = plt.figure()
chart = fig.add_subplot(1, 1, 1)
chart.plot(x,y_1, label="Gompertz curve (time)")
chart.plot(x,y_2, label="Gompertz curve (mass)")

plt.legend()
fig.tight_layout()
plt.show()

Однако ... Они не совпадают. Полученные кривые не согласны.

A comparison

Кто-нибудь может сказать мне, что здесь происходит не так? Я столкнулся с той же проблемой с другими кривыми роста, поэтому я предполагаю, что это проблема с моей реализацией, а не с исходными уравнениями.

1 Ответ

1 голос
/ 06 марта 2020

Я полагаю, что разница происходит от того факта, что уравнение 1 является производной уравнения 2. Это означает, что ваш l oop с шагом 1 единица времени (год) будет аппроксимировать изменение "дискретно" с уравнением 1, в то время как Уравнение 2 дает непрерывное значение (т. е. интеграл уравнения 1). Для лучшего соответствия вам необходимо значительно увеличить «частоту дискретизации» уравнения 1.

. Для этого вам нужно заставить функцию возвращать свое истинное значение дельты (то есть не добавлять его к параметру массы). :

def gompertz_m(m, K, r):
    eq1 = r*m
    eq2 = np.log(K/m)
    return eq1*eq2           # removed the m + 

Затем увеличьте частоту дискретизации, применив несколько меньших временных интервалов.

Например (выборка на ежедневной основе):

for i in x[1:]:
    #And run for x years
    cumMass = y_1[-1]
    for _ in range(365):
        cumMass += gompertz_m(cumMass,50,0.5)/365
    y_1.append(cumMass)
    y_2.append(gompertz_t(y_2[0],50,0.5,i))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...