我有一些计划的每月值,java模型按小时运行。一个月内(平滑期除外),流量是恒定的,我需要做一个平滑的。 (平滑)在下个月的 1 天内从旧的每小时速度值过渡到新的每小时速度值,以便每个月的计划都准确完成。同时,如果t+1个月的计划为零,那么需要在t月的最后一天平滑降至零 。 任何地平线的所有计划都是提前知道的。
平滑间隔的数量是用户参数。 有人在java中见过类似的算法吗?
我阅读互联网和这个论坛
识别关键变量:
平滑过渡功能: 对于平滑过渡,多项式(例如三次或更高)可以提供逐渐接近新值的方法。在定义的时间间隔(例如最后一天)内使用三次样条或线性插值等插值函数会有所帮助。
每小时流量计算:
将每月值平均分配到当月的各个小时(对于恒定流量期间)。
为了平滑,请使用插值方法在定义的过渡期内将每小时流量逐渐从旧值转移到新值。为了平滑下降到零,请考虑在最终间隔内使用衰减函数(如指数衰减)。
在 Java 中实现它可能看起来像:
public double[] smoothTransition(double currentMonthlyValue, double nextMonthlyValue, int hoursInMonth, int smoothingIntervalHours) {
double[] hourlyFlow = new double[hoursInMonth];
double constantFlowRate = currentMonthlyValue / (hoursInMonth - smoothingIntervalHours);
for (int i = 0; i < hoursInMonth - smoothingIntervalHours; i++) {
hourlyFlow[i] = constantFlowRate;
}
double transitionFactor = (nextMonthlyValue - currentMonthlyValue) / smoothingIntervalHours;
for (int i = hoursInMonth - smoothingIntervalHours; i < hoursInMonth; i++) {
hourlyFlow[i] = currentMonthlyValue + transitionFactor * (i - (hoursInMonth - smoothingIntervalHours));
}
return hourlyFlow;
}
此代码提供了用于平滑的简单线性插值,如果需要,可以使用三次样条或更复杂的过渡来增强该插值。