Actually, I think some of that was backwards. You set max memory - and it can be changed dynamically without bouncing. If dynamic allocation is on and allocate max memory is off then ASE may only grab an initial sized shared memory segment based on total logical memory (or essentially the config requirements such as caches, metadata, etc.). As memory demands increase, ASE would grab more shm and total physical memory would go up as well.
Normally folks run with dyamic allocation on and allocate max memory on - and in that case, total physical memory = max memory. Total logical memory is the amount of memory required based on all configs. So your formula should have been:
max memory >= total physical memory >= total logical memory
For example, on my laptop (Run values):
max memory = 4250624
total physical memory = 4250624
total logical memory = 2029212