使用全局变量(动画类)时,matplotlib 中的动画函数被阻止

问题描述 投票:0回答:1

所以,我有问题。我需要对 CALP(级联自适应线性预测器)错误进行动画处理。我正在使用 liber matplotlib (动画类)来解决我的任务,但是当我尝试计算新系数 CALP 时,我的程序锁定在时刻

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():
    #Задаем минимальные и максимлаьные значения по осям х и у
    ax.set_ylim(30000, -30000)
    ax.set_xlim(0,100)
    
    #Очищаем все данные в слистах если они присутствуют 
    del xdata[:]
    del ydata[:]
    
    #Задаем начальное значение построения графика
    line.set_data(xdata, ydata)
    return line,

# Функция выполнения (передаем данные и разбиваем их) 
def run(data):
    # update the 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)

................................

python matplotlib matplotlib-animation
1个回答
0
投票

我的问题解决了。我犯了一个错误,忘记将变量指定为全局变量。但现在,我只需将向量权重和向量延迟信号发送到函数即可。


谢谢大家!!

© www.soinside.com 2019 - 2024. All rights reserved.