php计算一个模拟增长过程函数
private function calculateGrowth($progress) {// 使用多个增长阶段模拟不均匀性if ($progress < 0.3) {// 前30%时间:缓慢增长 30 %return pow($progress / 0.3, 0.7) * 0.3;} elseif ($progress < 0.7) {// 中间40%时间:快速增长 50%return 0.3 + (($progress - 0.3) / 0.4) * 0.5;} else {// 后30%时间:减速增长 20%return 0.8 + pow(($progress - 0.7) / 0.3, 1.5) * 0.2;}}
函数的核心作用
接收一个 $progress
(进度)参数(范围应该是 0 到 1 之间的数值),返回一个对应的"增长值"(同样是 0 到 1 之间)。通过分段计算,模拟现实中常见的"先慢、中快、后缓"的非线性增长过程。
三个增长阶段的详细解析
-
第一阶段:前30%进度(缓慢增长)
if ($progress < 0.3) {return pow($progress / 0.3, 0.7) * 0.3; }
- 适用范围:当进度小于 30%(0 ~ 0.3)时
- 计算逻辑:
- 先将进度归一化:
$progress / 0.3
(把 0~0.3 的范围映射到 0~1) - 用指数函数
pow(x, 0.7)
处理:因为指数 0.7 小于 1,会产生"增长越来越慢"的效果 - 最后乘以 0.3:将结果限制在 0~0.3 范围内(占总增长的 30%)
- 先将进度归一化:
- 效果:前期增长缓慢,进度推进很多但实际增长值增加较少
-
第二阶段:中间40%进度(快速增长)
elseif ($progress < 0.7) {return 0.3 + (($progress - 0.3) / 0.4) * 0.5; }
- 适用范围:当进度在 30%~70%(0.3 ~ 0.7)时
- 计算逻辑:
- 基础值 0.3:承接第一阶段的终点
- 归一化处理:
($progress - 0.3) / 0.4
(把 0.3~0.7 的范围映射到 0~1) - 线性增长:直接乘以 0.5(这部分贡献总增长的 50%)
- 效果:这一阶段是线性增长,也是整个过程中增长最快的阶段(用 40% 的进度完成 50% 的增长)
-
第三阶段:后30%进度(减速增长)
else {return 0.8 + pow(($progress - 0.7) / 0.3, 1.5) * 0.2; }
- 适用范围:当进度在 70%~100%(0.7 ~ 1.0)时
- 计算逻辑:
- 基础值 0.8:承接前两阶段的总和(30% + 50%)
- 归一化处理:
($progress - 0.7) / 0.3
(把 0.7~1.0 的范围映射到 0~1) - 用指数函数
pow(x, 1.5)
处理:因为指数 1.5 大于 1,会产生"先慢后快但整体增长减速"的效果 - 最后乘以 0.2:将结果限制在 0~0.2 范围内(占总增长的 20%)
- 效果:后期增长放缓,需要推进较多进度才能完成最后的增长
整体增长曲线特点
- 总增长分配:30%(第一阶段) + 50%(第二阶段) + 20%(第三阶段) = 100%
- 增长节奏:慢 → 快 → 慢,符合很多自然和人工过程的增长规律(如学习曲线、项目进度、产品 adoption 等)
- 非线性特征:通过指数函数(0.7 和 1.5)实现了阶段内的非线性增长,比单纯的三段线性更贴近真实情况
这个函数可以用于模拟各种需要非线性增长的场景,如进度条动画、技能熟练度提升、任务完成度计算等。