Вопрос:

Матплотлиб Анимация стримплота бифуркации

python animation matplotlib

393 просмотра

1 ответ

11 Репутация автора

В настоящее время я пытаюсь оживить динамику типичной бифуркационной ода седлового узла: dx / dt = r + x ^ 2. Снимки при определенных значениях r реализуются с помощью функции streamplot от r = -1 до 1. К сожалению, функция init и функция animate не работают должным образом, потому что .set_array не работает для streamplots. Я также не уверен, как обновлять потоки на каждой итерации в функции animate. Мой вопрос заключается в том, как мне изменить модификацию animate и init, чтобы функция funcanimation давала правильный анимированный график потоков.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation


nx, ny = .02, .02
x = np.arange(-15, 15, nx)
y = np.arange(-10, 10, ny)
X, Y = np.meshgrid(x, y)
dy = -1 + Y**2
dx = np.ones(dy.shape)

dyu = dy / np.sqrt(dy**2 + dx**2)
dxu = dx / np.sqrt(dy**2 + dx**2)


color = dyu
fig, ax = plt.subplots()
stream = ax.streamplot(X,Y,dxu, dyu, color=color, density=2, cmap='jet',arrowsize=1)
ax.set_xlabel('t')
ax.set_ylabel('x')

def init():
stream.set_array([])
return stream

def animate(iter):
    dy = -1 + iter * 0.01 + Y**2
    dx = np.ones(dy.shape)
    dyu = dy / np.sqrt(dy**2 + dx**2)
    dxu = dx / np.sqrt(dy**2 + dx**2)
    stream.set_array(dyu.ravel())

    return stream

anim =   animation.FuncAnimation(fig, animate, frames=100, interval=50, blit=False, repeat=False)
plt.show()
Автор: Mister Knister Источник Размещён: 28.12.2017 08:08

Ответы (1)


0 плюса

45 Репутация автора

Я работал над этим, очищая линии и стрелки на каждой итерации:

ax.collections = [] # clear lines streamplot
ax.patches = [] # clear arrowheads streamplot

Итак, я изменил ваш код следующим образом:

#!/usr/bin/env python3
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation


nx, ny = .02, .02
x = np.arange(-15, 15, nx)
y = np.arange(-10, 10, ny)
X, Y = np.meshgrid(x, y)
dy = -1 + Y**2
dx = np.ones(dy.shape)

dyu = dy / np.sqrt(dy**2 + dx**2)
dxu = dx / np.sqrt(dy**2 + dx**2)

color = dyu
fig, ax = plt.subplots()
stream = ax.streamplot(X,Y,dxu, dyu, color=color, density=2, cmap='jet',arrowsize=1)
ax.set_xlabel('t')
ax.set_ylabel('x')

def animate(iter):
    ax.collections = [] # clear lines streamplot
    ax.patches = [] # clear arrowheads streamplot
    dy = -1 + iter * 0.01 + Y**2
    dx = np.ones(dy.shape)
    dyu = dy / np.sqrt(dy**2 + dx**2)
    dxu = dx / np.sqrt(dy**2 + dx**2)
    stream = ax.streamplot(X,Y,dxu, dyu, color=color, density=2, cmap='jet',arrowsize=1)
    print(iter)
    return stream

anim =   animation.FuncAnimation(fig, animate, frames=100, interval=50, blit=False, repeat=False)
anim.save('./animation.gif', writer='imagemagick', fps=60)
# plt.show()

анимация

Автор: Sebastian Beyer Размещён: 25.05.2019 11:01
Вопросы из категории :
32x32