$max_rate_time) { $min_rate_time += 24; } return match ($method) { 'logistic' => self::logistic($max_rate, $max_rate_time, $min_rate, $min_rate_time, $time), 'linear' => self::linear($max_rate, $max_rate_time, $min_rate, $min_rate_time, $time), }; } public static function validateData( float $max_rate, int $max_rate_time, float $min_rate, int $min_rate_time, ): bool { return ! ($max_rate < 0 || $min_rate < 0 || $max_rate_time < 0 || $min_rate_time < 0 || $max_rate_time > 24 || $min_rate_time > 24 || $min_rate_time > $max_rate_time); } public static function logistic( float $max_rate, int $max_rate_time, float $min_rate, int $min_rate_time, int $time, ): float { $k = $time < $max_rate_time ? -0.7 : 1.3; $e = M_E; return round( ($max_rate - $min_rate) / (1 + $e ** ($k * ($time - ($max_rate_time + $min_rate_time) / 2))) + $min_rate, 2 ); } public static function linear( float $max_rate, int $max_rate_time, float $min_rate, int $min_rate_time, int $time, ): float { $k = ($max_rate - $min_rate) / ($max_rate_time - $min_rate_time); $b = $max_rate - $k * $max_rate_time; return round( $k * $time + $b, 2 ); } }