You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现累积衰减函数的计算与绘制(含线性/指数衰减)

累积衰减函数的Python实现与扩展

一、线性衰减版本实现

参数说明

  • inits[]: 各新信号的引入时间步列表
  • peaks[]: 对应每个信号在峰值时刻的取值列表(需与inits长度一致)
  • peak-ticks: 信号从引入到达到峰值所需的时间步数
  • zero-ticks: 信号从峰值衰减至0所需的时间步数

核心逻辑

每个独立信号的生命周期分为四个阶段:

  1. 未激活阶段:当前时间步t < 引入时间t0,贡献为0
  2. 上升阶段:t0 ≤ t < t0 + peak-ticks,信号从0线性上升至对应峰值,每步增量为峰值 / peak-ticks
  3. 衰减阶段:t0 + peak-ticks ≤ t ≤ t0 + peak-ticks + zero-ticks,信号从峰值线性下降至0,每步减量为峰值 / zero-ticks
  4. 失效阶段: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:27:44