Is the Verhulst (logistic) growth function convex over its parameters?

Math
Functions
Convex-Functions
Author

Galen Seilis

Published

November 2, 2021

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.

References

Verhulst, Pierre-François. 1838. “Notice Sur La Loi Que La Population Suit Dans Son Accroissement.” Correspondance Mathématique Et Physique 10: 113–21.