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

Matplotlib动画类使用全局变量时程序阻塞问题求助

问题:CALP误差动画展示时系数更新语句导致程序阻塞

我需要对CALP(级联自适应线性预测器)的误差做动画展示,使用Matplotlib的Animation类实现。但执行系数更新语句aa = aa - lmd1 * dEda(y, previus_data_1, previus_data_2)(其中aa为全局变量)时,程序会出现阻塞;改成aa = lmd1 * dEda(y, previus_data_1, previus_data_2)则能正常运行。以下是我的代码,恳请帮忙解决:

全局变量定义

# Filter coefficients
aa = 0.01
bb = 0.01

# Learning rate
lmd1 = 0.0000001
lmd2 = 0.0000001

# Worksheets for storing graph values
xdata, ydata = [], []

误差与梯度计算函数

def E(y, a, b):
    return (y - a*aa - bb)**2

def dEda(y, a, b):
    return (2 * (y - a*aa - b*bb) * a)
 
def dEdb(y,  a, b):
    return (2 * (y - a*aa - bb) * 1)

动画相关函数

%matplotlib inline
# 无限生成值的循环(因使用yield故为生成器)
def data_gen():
    for cnt in itertools.count():
#         aa = aa - lmd1 * dEda(data[cnt+1], previus_data_1, previus_data_2)
#         bb = bb - lmd2 * dEdb(data[cnt+1], previus_data_1, previus_data_2)
#         previus_data_2 = copy.deepcopy(previus_data_1)
#         previus_data_1 = copy.deepcopy(data[cnt+1])
#         err = E(data[cnt+1], previus_data_1, previus_data_2)
        yield cnt, data[cnt+1]

# 可视化初始化
def init():
    #设置x轴和y轴的最小、最大值
    ax.set_ylim(30000, -30000)
    ax.set_xlim(0,100)
    
    #若列表中有数据则清空
    del xdata[:]
    del ydata[:]
    
    #设置绘图初始值
    line.set_data(xdata, ydata)
    return line,

# 执行函数(传入并拆分数据) 
def run(data):
    # 更新数据
    t, y = data
    xmin, xmax = ax.get_xlim()
#     aa = aa - lmd1 * dEda(y, previus_data_1, previus_data_2)
#     bb = bb - lmd2 * dEdb(y, previus_data_1, previus_data_2)
#     previus_data_2 = copy.deepcopy(previus_data_1)
#     previus_data_1 = copy.deepcopy(y)
    err = E(y, previus_data_1, previus_data_2)
    
    
    xdata.append(t)
    ydata.append(err)
    
    
    # 若数据超过设定值,则调整图表尺寸
    if t >= xmax:
        ax.set_xlim(xmin, 2*xmax)
        ax.figure.canvas.draw()
    # 设置新值并返回
    line.set_data(xdata, ydata)

    return line,

动画启动代码

%matplotlib notebook
previus_data_1 = 0
previus_data_2 = 0

fig, ax = plt.subplots(figsize = (9, 6))
line, = ax.plot([], [], lw=2)
ax.grid()

ani = animation.FuncAnimation(fig, run, data_gen, init_func=init)

内容的提问来源于stack exchange,提问作者Никита Сушков

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:21:04