Python 增长函数赢得';我不同意——这是一个令人费解的结果

Python 增长函数赢得';我不同意——这是一个令人费解的结果,python,numpy,math,Python,Numpy,Math,好的,我正在撰写一篇关于用Python生成增长函数的论文()。增长函数以多种不同的方式表示,我需要使用其中的一种以上(用于不同的应用程序) 方程式1:方程式2: 方程式1是一个Gompertz函数,表示为每次时间变化的质量变化,方程式2是相同的Gompertz函数,表示为总经过时间的函数。一个根据当前质量计算质量变化,另一个根据质量增长的时间计算质量 我已经将它们翻译成python,并编写了一些代码来检查它们是否匹配(因为它们是同一等式的不同表达式,所以这不应该是一个问题…) 然而。。。他们不

好的,我正在撰写一篇关于用Python生成增长函数的论文()。增长函数以多种不同的方式表示,我需要使用其中的一种以上(用于不同的应用程序)

方程式1:方程式2:

方程式1是一个Gompertz函数,表示为每次时间变化的质量变化,方程式2是相同的Gompertz函数,表示为总经过时间的函数。一个根据当前质量计算质量变化,另一个根据质量增长的时间计算质量

我已经将它们翻译成python,并编写了一些代码来检查它们是否匹配(因为它们是同一等式的不同表达式,所以这不应该是一个问题…)

然而。。。他们不匹配。结果曲线不一致


有人能告诉我这里出了什么问题吗?我在其他增长曲线上也遇到了同样的问题,因此我认为这是我的实现问题,而不是原始方程的问题。

我认为差异来自一个事实,即方程1是方程2的导数。这意味着,增量为1时间单位(年)的循环将“离散地”近似于等式1的变化,而等式2产生一个连续值(即等式1的积分)。为了获得更好的拟合,您需要大大提高方程式1的“采样率”

为此,您需要使函数返回其真实增量值(即,不将其添加到质量参数):

然后通过应用多个较小的时间间隔来提高采样率

例如(每天取样):


是什么让你认为它们是同一个方程?在我链接到()的论文中的表1,它们代表不同的东西,一个是dM/dt(质量随时间的变化),另一个是质量微分基本原理,如果我愚蠢的话。。据我所知,一个显示基于y的增量(因此yn+1,基于yn),另一个显示基于x值的y点?我想我已经补偿了——或者我完全误解了?谢谢阿兰——这真的很有帮助(我真的超出了我数学能力的极限!)
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()

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))