I finally got the model working! The kernel looks good and its graph is pretty (below). I’ve used some iterative code to find the model’s stable population growth rate, stable stage distribution, and reproductive value vector. I have not used a very large matrix due to the computing limitations of my laptop, but I can easily transfer my code to a more powerful computer when it becomes necessary.

Warmer colors correspond to greater values

Warmer colors correspond to greater values. The little nub is the fecundity kernel and the diagonal (which can be hard to see) is the survival-growth kernel.

One issue with my model is that the survival-growth kernel is giving values at some points greater than 1, which should only happen in the fecundity kernel. For example, if a tree at time t had a height of 4, it has a greater than 100% chance of having a height of 4 at time t+1, which results in trees multiplying when they should only be growing or shrinking. I looked back through all my regressions to make sure they were fitted well, and I made sure my functions were written properly, but the problem persisted.

To combat this problem I’ve attempted creating two separate populations for adult trees and juvenile trees and have them feed into each other via growth (young to old) and reproduction (old to young). I felt this might help because the conversion I used to change the adult trees’ DBHs to height may have been messing with my results. The problem persisted for the growth of younger trees, however. This model also created another problem with the larger trees having an unusually high stable growth rate.

Using two separate populations has fragmented the nice single kernel seen above. Below I have the growth kernels for the juveniles and adults, along with the fecundity kernel. Note that the adult trees are measured by DBH in inches and juvenile trees are measured by height in centimeters and are on a log scale.

Juvenile Growth Kernel
Juvenile Recruitment Kernel

There is no kernel for the transition from juvenile to adult. To model this I multiplied the number of juveniles evicted from the juvenile growth model on the upper bound by a distribution function for the size of smaller adult trees, then simply added the resulting vector to the adult population vector at each time step.