Библиотека matplotlib предоставляет такие возможности. Только для этого графики должны отобразжаться в отдельном окне. Поэтому, если ты переключился на их отображение в тетрадке, переключись на вывод графиков в окошке с помощью "магической" команды:


%matplotlib tk

Напомню, что магическими командами в программе Jupyter Notebook называются команды, влияющие не на переменные и числа, а на нее саму. Чтобы не перепутаться с обычными, они начинаются со знака %.

Теперь импортируем все что нужно:




import matplotlib.pyplot as plt           #Фнкции рисования графиков
import matplotlib.animation as animation #Функции анимации
import numpy as np #Для создания массивов в модели

Запускаем модель (без изменений):




















ρ=np.full(100,10)          #Массив сопротивлений между клетками
ϕ=np.full(100,0.0) #Массив потенциалов в клетках
I=np.full(100,0.0) #Массив токов между клетками

def battery(): #Работа батареи
ϕ[0]=-4.5
ϕ[99]=4.5

def step(a):
Δϕ = ϕ[a]-ϕ[a+1] #Считаем разность потенциалов между клетками a и a+1
I[a]=Δϕ/ρ[a] #Найдем силу тока I(a)

def tick():
battery() #Батарея задает потенциалы на концах
for a in range(99): #Для каждой клетки
step(a) #Рассчитываем обмен потенциалами клетки a (со следующей)
for a in range(99): #Для каждой клетки
ϕ[a]-=I[a] #Потенциал утекает из клетки a
ϕ[a+1]+=I[a] #Потенциал притекает в клетку a+1

Сейчас в массиве ϕ - одни нули. Сделаем один шажок модели, чтобы батарейка записала свои потенциалы в крайние клетки проводника. Тогда график будет сразу строиться в масштабе от -4.5 до 4.5 по вертикали.


tick()                     

Укажем в виде функции, а что, собственно, делать для формирования нового кадра. Мы не хотим перерисовывать ни все изображение, ни график - т.е. сами оси и надписи, а только линию, передавая ей постоянно новые данные.

Функции в Python выполняются только в момент их вызова, поэтому создание самой линии мы можем прописать и ниже функции. Главное, чтобы до первого обращения к ней - а то Python станет недоумевать: какая такая line и откуда у нее метод set_ydata? А этот метод просто всегда присущ линиям графиков, созданным командой plot().





def animate(i):           # Номер кадра. Его важно принять в какую-нибудь переменную, и если не нужен, можно не использовать
tick() # Проводим вычисления
line.set_ydata(ϕ) # Передаем линии графика новые данные
return line, # Выдаем кортеж

Запятая после line нужна, это не опечатка. Она делает line особым видом переменных - кортежем. Кортежи - это списки без возможности изменения элементов. Анимация с помощью библиотеки matplotlib требует line именно в таком виде, не будем же мы с ней спорить.

Кортежи пишутся, в отличие от списков, в круглых скобках:




список=[1,2,3]
кортеж=(1,2,3)
print (список, кортеж)

[1, 2, 3] (1, 2, 3)

Они, на самом деле, часто незримо окружают нас. Например, в последней строке, в круглых скобках после print тоже был кортеж из двух элементов. Функция нескольких аргументов принимает их как раз в виде кортежа.


Круглые скобки вокруг кортежа можно и не писать. Главное - запятая. Это объясняет, почему в Python можно писать так:





x,y,z = 1,2,3
print (x)
print (y)
print (z)



1
2
3

И даже так:




x,y = y,x
print (x)
print (y)


2
1

Вот такой красивый способ поменять переменные значениями.


Создадим изображение, график и линию. И добавим анимацию - специальной функцией, которой укажем целевое изображение, нашу функцию нового кадра animate(), временной интервал между кадрами в миллисекундах. Параметр blit=True устанавливает способа вывода анимации на экран и позволяет ей меньше тормозить. И да, теперь ты видишь, что все это вместе образует кортеж.




fig, ax = plt.subplots()  #Создадим изображение (fig) и график (ax)
line, = ax.plot(ϕ) #А теперь саму линию, отображающую наш массив ϕ (первоначально).
ani = animation.FuncAnimation(fig, animate, interval=1, blit=True) #Создаем анимацию

Новое окошко открылось и потенциалы поползли с противоположных сторон! Получилось!

Вот они медленно ползут навстречу, становясь все более пологими... постепенно сливаются... и постепенно вытягивают линию графика в прямую струну.

Анимация и вычисления идут пока мы не закроем окошко. Получилось у тебя ее запустить?