I realized that I was using the active stake (estimated at 22b) rather than the total stake (estimated at 31b) in the rewards calculation.
This stretches out the curve since the saturation level is higher.
You can see this in the less improved benefit in this recalculation of Alt2.
Assumptions
Reserve: 14b
Total stake: 31b
Tx fees: 0
Fully Saturated Pool
Rewards available in epoch: 29.3m
Pool saturation: 206.7m
Curve exponent: 2
Crossover: 5m
Pledge Rewards Benefit Alt Rwd Alt Bnft
0k 150051 0% 150051 0%
10k 150053 0% 150100 0.03%
50k 150062 0.01% 150160 0.07%
100k 150073 0.01% 150205 0.1%
200k 150095 0.03% 150269 0.15%
500k 150160 0.07% 150396 0.23%
1m 150269 0.15% 150538 0.32%
2m 150487 0.29% 150740 0.46%
5m 151140 0.73% 151140 0.73%
10m 152229 1.45% 151591 1.03%
20m 154408 2.9% 152229 1.45%
50m 160942 7.26% 153495 2.3%
100m 171833 14.52% 154922 3.25%
206.7m 195067 30% 157053 4.67%
Because the a0 pledge benefit is spread over the pledge range from 0 to saturation there is a dependence on k and total_stake.
Since k and total_stake will likely change over time it would be better to express crossover in terms of k and total_stake instead of a fixed number.
One possibility would be
crossover = total_stake / (k * crossover_factor)
where crossover_factor is any real number greater than 0.
For example, setting crossover_factor to 20 with k = 150 and total_stake = 31b gives a crossover of approximately 10.3m.
As @_ilap pointed out, we can generalize the alternative approaches to try out different curve exponents.
This gives us
s = pow(pledge, (1 / curve_exp)) * pow(crossover, ((curve_exp - 1) / curve_exp)) / total_stake
The curve_exp could be set to any integer greater than 0 and when set to 1 produces the current rewards equation.
An interesting set of parameters as an example is
Curve exponent: 3
Crossover factor: 10
which produces
Crossover: 20.7m
Pledge Rewards Benefit Alt Rwd Alt Bnft
0k 150051 0% 150051 0%
10k 150053 0% 150405 0.24%
50k 150062 0.01% 150656 0.4%
100k 150073 0.01% 150813 0.51%
200k 150095 0.03% 151011 0.64%
500k 150160 0.07% 151353 0.87%
1m 150269 0.15% 151692 1.09%
2m 150487 0.29% 152118 1.38%
5m 151140 0.73% 152856 1.87%
10m 152229 1.45% 153585 2.36%
20m 154408 2.9% 154504 2.97%
50m 160942 7.26% 156094 4.03%
100m 171833 14.52% 157665 5.07%
206.7m 195067 30% 159750 6.46%
As you can see this gives meaningful pledge benefit rewards to pools pledging less than 1m ADA.