This question was automatically deleted from math.stackexchange.com.
Question
Considering the Verhulst growth model (Verhulst 1838) to be the following: \[p(t) = \frac{k}{1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}}\]
I would like to know if \(p(t)\) is non-convex with respect to \(k, p_0\), and \(r\) under the constraints that these parameters are themselves positive. I suspect that it isn’t convex because of looking at plots of the graph of the function over single choices of parameters. I would like something more symbolic/algebraic.
Its Hessian with respect to \(k, p_0\), and \(r\) is given by
\[\left[\begin{matrix}\frac{k \left(- \frac{2 e^{- r t}}{p_{0}^{2}} - \frac{2 \left(k - p_{0}\right) e^{- r t}}{p_{0}^{3}}\right)}{\left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} + \frac{k \left(\frac{e^{- r t}}{p_{0}} + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}^{2}}\right) \left(\frac{2 e^{- r t}}{p_{0}} + \frac{2 \left(k - p_{0}\right) e^{- r t}}{p_{0}^{2}}\right)}{\left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{3}} & - \frac{2 k \left(\frac{e^{- r t}}{p_{0}} + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}^{2}}\right) e^{- r t}}{p_{0} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{3}} + \frac{k e^{- r t}}{p_{0}^{2} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} + \frac{\frac{e^{- r t}}{p_{0}} + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}^{2}}}{\left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} & \frac{k \left(- \frac{t e^{- r t}}{p_{0}} - \frac{t \left(k - p_{0}\right) e^{- r t}}{p_{0}^{2}}\right)}{\left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} + \frac{2 k t \left(k - p_{0}\right) \left(\frac{e^{- r t}}{p_{0}} + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}^{2}}\right) e^{- r t}}{p_{0} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{3}}\\- \frac{k \left(\frac{2 e^{- r t}}{p_{0}} + \frac{2 \left(k - p_{0}\right) e^{- r t}}{p_{0}^{2}}\right) e^{- r t}}{p_{0} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{3}} + \frac{k e^{- r t}}{p_{0}^{2} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} + \frac{\frac{e^{- r t}}{p_{0}} + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}^{2}}}{\left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} & \frac{2 k e^{- 2 r t}}{p_{0}^{2} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{3}} - \frac{2 e^{- r t}}{p_{0} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} & \frac{k t e^{- r t}}{p_{0} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} - \frac{2 k t \left(k - p_{0}\right) e^{- 2 r t}}{p_{0}^{2} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{3}} + \frac{t \left(k - p_{0}\right) e^{- r t}}{p_{0} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}}\\- \frac{k t e^{- r t}}{p_{0} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} + \frac{k t \left(k - p_{0}\right) \left(\frac{2 e^{- r t}}{p_{0}} + \frac{2 \left(k - p_{0}\right) e^{- r t}}{p_{0}^{2}}\right) e^{- r t}}{p_{0} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{3}} - \frac{k t \left(k - p_{0}\right) e^{- r t}}{p_{0}^{2} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} & \frac{k t e^{- r t}}{p_{0} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} - \frac{2 k t \left(k - p_{0}\right) e^{- 2 r t}}{p_{0}^{2} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{3}} + \frac{t \left(k - p_{0}\right) e^{- r t}}{p_{0} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} & - \frac{k t^{2} \left(k - p_{0}\right) e^{- r t}}{p_{0} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{2}} + \frac{2 k t^{2} \left(k - p_{0}\right)^{2} e^{- 2 r t}}{p_{0}^{2} \left(1 + \frac{\left(k - p_{0}\right) e^{- r t}}{p_{0}}\right)^{3}}\end{matrix}\right]\]
Up until this point can be obtained readily with the following Python:
import numpy as np
from sympy import Matrix, diff, exp, symbols
t, p0, k, r = symbols("t p0 k r")
def verhulst(t, p0, k, r):
return k / (1 + (k - p0) * exp(-r * t) / p0)
def hessian():
p = verhulst(t, p0, k, r)
H = np.zeros((3, 3), dtype=object)
params = (p0, k, r)
for i, pi in enumerate(params):
for j, pj in enumerate(params):
H[i, j] = diff(p, pi, pj)
return Matrix(H)
H = hessian()To get the eigenvalues one would simply need to additionally call:
from .hessian import H
eigenvalues = H.eigenvals()which seems to work… except that output is enormous. While I might just throw a bunch of randomly-selected values along with the usual corner cases (zero, \(\pm\)one, \(\pm\)infinity) into the eigenfunctions to look for negative values, I am hoping that asking here yields something more elegant.