Почему простой анимационный код для моей волновой функции не работает? - PullRequest
1 голос
/ 08 апреля 2019

Я пытаюсь оживить волновую функцию электронов в атоме.Я написал простейший код на Python, следующий за тем, что дано в документации Matplotlob по анимации, но он ничего не делает.Кто-нибудь может помочь?

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

angles = (np.linspace(0, 2 * np.pi, 360, endpoint=False))
fig= plt.figure()
ax = fig.add_subplot(111, polar=True)
line1, =ax.plot([],[], 'g-', linewidth=1)

def update(theta):

    line1.set_data(angles,energy_band(3, theta, 3))
    return line1,

def init():

    line1.set_data([],[])
    return line1,

def energy_band(wave_number, phase_offset, energy_level):
    return [math.sin(2*np.pi/360*i*wave_number+phase_offset*np.pi/360)+energy_level for i in range(360)]

ani = animation.FuncAnimation(fig, update, frames=[i for i in range(0,3600,5)], blit=True, interval=200, init_func=init)

plt.show()

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Проблема в том, что данные, которые вы хотите анимировать, лежат между 2 и 4, но полярный график показывает только диапазон между -0.04 и 0.04.Это связано с использованием пустого участка для начала.Это потребует, чтобы вы установили пределы вручную.Например,

ax.set_rlim(0,5)

Это единственное дополнение, необходимое для работы вашего кода.

Однако можно оптимизировать немного больше, например, использовать NumPy повсюду и повторно использовать существующие переменные,

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


angles = (np.linspace(0, 2 * np.pi, 360, endpoint=False))
fig= plt.figure()
ax = fig.add_subplot(111, polar=True)
line1, =ax.plot([],[], 'g-', linewidth=1)

def update(theta):
    line1.set_data(angles,energy_band(3, theta, 3))
    return line1,

def init():
    line1.set_data([],[])
    ax.set_rlim(0,5)
    return line1,

def energy_band(wave_number, phase_offset, energy_level):
    return np.sin(angles*wave_number+phase_offset*np.pi/360)+energy_level


ani = animation.FuncAnimation(fig, update, frames=np.arange(0,3600,5), 
                              blit=True, interval=200, init_func=init)

plt.show()
0 голосов
/ 08 апреля 2019

Проблема с вашими данными.Во-первых, вы должны вызвать set_data с одним числом.Во-вторых, если вы разделите энергетическую функцию на 100, у вас есть данные в хорошем масштабе, чтобы показать.Более того я установил пределы оси.Проверьте, как я изменяю ваш код:

line1, =ax.plot([],[], 'ro')# 'g-', linewidth=1)

def update(theta):
    line1.set_data(angles[int(theta)], energy_band(3, theta, 3)[int(theta)]/100)
    #line1.set_data(angles,energy_band(3, theta, 3)/100)
    return line1,

def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    #line1.set_data([],[])
    return line1,

Другая вещь - это интерактивный режим.Обычно это проблема, когда matplotlib ничего не делает, особенно при работе с ноутбуком jupyter.

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

matplotlib.interactive(True)
plt.ion()
matplotlib.is_interactive()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...