Python实现累积衰减函数的计算与绘制(含线性/指数衰减)
累积衰减函数的Python实现与扩展
一、线性衰减版本实现
参数说明
inits[]: 各新信号的引入时间步列表peaks[]: 对应每个信号在峰值时刻的取值列表(需与inits长度一致)peak-ticks: 信号从引入到达到峰值所需的时间步数zero-ticks: 信号从峰值衰减至0所需的时间步数
核心逻辑
每个独立信号的生命周期分为四个阶段:
- 未激活阶段:当前时间步
t < 引入时间t0,贡献为0 - 上升阶段:
t0 ≤ t < t0 + peak-ticks,信号从0线性上升至对应峰值,每步增量为峰值 / peak-ticks - 衰减阶段:
t0 + peak-ticks ≤ t ≤ t0 + peak-ticks + zero-ticks,信号从峰值线性下降至0,每步减量为峰值 / zero-ticks - 失效阶段:
t > t0 + peak-ticks + zero-ticks,贡献为0
总函数值为所有信号在当前时间步的贡献之和。
代码实现
import matplotlib.pyplot as plt def linear_decay_f(t, inits, peaks, peak_ticks, zero_ticks): total = 0.0 for t0, peak in zip(inits, peaks): # 计算峰值到达的时间点 peak_time = t0 + peak_ticks # 计算信号完全衰减的时间点 decay_end_time = peak_time + zero_ticks if t < t0: continue elif t < peak_time: # 上升阶段:线性增长到峰值 progress = (t - t0) / peak_ticks total += peak * progress elif t <= decay_end_time: # 衰减阶段:线性下降到0 decay_progress = (t - peak_time) / zero_ticks total += peak * (1 - decay_progress) return total # 示例验证 inits = [10, 15, 18] peaks = [1, 1, 1] peak_ticks = 1 zero_ticks = 10 # 生成时间步1到25的结果 time_steps = range(1, 26) values = [linear_decay_f(t, inits, peaks, peak_ticks, zero_ticks) for t in time_steps] # 打印示例关键时间点的结果 print("关键时间点结果:") for t in [10,11,12,15,16,17,18,19,20]: print(f"t={t}: {values[t-1]:.1f}") # 绘制曲线 plt.figure(figsize=(10, 6)) plt.plot(time_steps, values, marker='o', linestyle='-', color='b') plt.xlabel("时间步t") plt.ylabel("累积衰减函数值") plt.title("线性累积衰减函数曲线") plt.grid(True) plt.show()
运行后关键时间点的输出会与示例完全匹配,比如t=10输出0.0,t=15输出0.6等。
二、1/x形式的衰减实现
1/x形式的衰减不会真正降到0,因此我们实现类反比例衰减:信号到达峰值后,贡献值随时间步递增趋近于0,同时设置最小阈值过滤无效的微小贡献。
核心逻辑
保留线性上升阶段,将衰减阶段替换为反比例形式:
贡献值 = 峰值 / ((t - peak_time) + 1)
其中peak_time是信号到达峰值的时间点,当t等于peak_time时,贡献值为峰值;随着t增大,贡献值逐渐趋近于0。可通过添加系数调整衰减速度,比如贡献值 = 峰值 / (k*(t - peak_time) + 1),k越大衰减越快。
代码实现
def inverse_decay_f(t, inits, peaks, peak_ticks, min_contribution=0.01): total = 0.0 for t0, peak in zip(inits, peaks): peak_time = t0 + peak_ticks if t < t0: continue elif t < peak_time: # 上升阶段保持线性增长 progress = (t - t0) / peak_ticks total += peak * progress else: # 反比例衰减阶段 delta_t = t - peak_time contribution = peak / (delta_t + 1) # 低于最小贡献则忽略 if contribution >= min_contribution: total += contribution return total # 示例测试 inverse_values = [inverse_decay_f(t, inits, peaks, peak_ticks) for t in time_steps] # 绘制对比曲线 plt.figure(figsize=(10, 6)) plt.plot(time_steps, values, marker='o', linestyle='-', color='b', label='线性衰减') plt.plot(time_steps, inverse_values, marker='s', linestyle='--', color='r', label='1/x类衰减') plt.xlabel("时间步t") plt.ylabel("累积衰减函数值") plt.title("线性衰减 vs 1/x类衰减曲线对比") plt.legend() plt.grid(True) plt.show()
如需更快的衰减速度,可修改衰减公式为contribution = peak / (2*(delta_t) + 1),按需调整系数即可。
内容的提问来源于stack exchange,提问作者sten
相关产品推荐
相关产品推荐

