2014-12-12 4 views
0

В настоящее время я запускаю код, имитирующий движение строки, и я хочу прочитать его амплитуду в данной точке и построить это как функцию времени, представляя данные, которые будут считываться с пикапа гитары. Поскольку я новичок в анимации в python, задача получения данных при представлении этой анимации оказалась проблемой. Вот код:От y (x) анимации до y (t) при заданном x

import numpy as np 
import matplotlib 
matplotlib.use("TkAgg") 
from matplotlib import pyplot as plt 
from math import exp 
#import matplotlib.animation as animation 

#Power Spectrum 
def PowerSpectrum(f): 
    return (f*f.conjugate()).real/len(f)**2 

#triangular pulse 
def triangular_pulse(x, xmean, sigma): 
    return np.where(x<xmean,x*sigma/xmean,sigma-(x-xmean)*(sigma/(200-xmean))) 

N_masses = 200 
T = 0.0669264714 
mu = .03937 
cSq = T/mu 
c = np.sqrt(cSq) 
dx = 1.0 

dt = dx/c 
print dt 

#Initialize some arrays 
x0 = np.arange(N_masses)*dx 
y = np.zeros(N_masses) 
vy = np.zeros(N_masses) 
ay = np.zeros(N_masses) 

#setup for animation 
fig1 = plt.figure() 
plt.ion() 
wave, = plt.plot(x0,y) 
plt.ylim(-30,30) 

#Set Initial conditions (pluck) 
# # half-pluck 
# y = 30*gaussian_pulse(x0,x0[N_masses/2],2) 

# quarter-pluck 
y = triangular_pulse(x0,x0[N_masses/10],6) 

yprev = y - vy*dt 
y1 = [] 


t=0.0 
i=0 
while t<1000: 
    dydx = (y[1:] - y[:-1])/dx 
    ay[1:-1] = (dydx[1:] - dydx[:-1])/dx * cSq 
    # Notice we update both at the same time 
    yprev, y = y, exp(-.00001*t)*(2*y - yprev + ay * dt**2) 
    t = t + dt 
    y1.append(y[1]) 
    i += 1 

    if i%1==0: 
     wave.set_data(x0,y) 
     plt.draw() 

gauss_hat = np.fft.fft(y1) 
freqs = np.fft.fftfreq(len(y1), d=1.0/100) 
half_ps = PowerSpectrum(gauss_hat) 

#half-pluck y[1] vs. t 
plt.plot(range(1000), y1) 
plt.xlabel('time') 
plt.ylabel('y[1]') 
plt.title('y[1] vs. t') 

# power spectrum plots 
#plt.plot(freqs,half_ps) 
#plt.xlabel('frequency (Hz)') 
#plt.ylabel('Intensity') 

#plt.title('y[1] Power Spectrum (half pluck)') 
#plt.title('y[1] Power Spectrum (quarter pluck)') 

#plt.grid(True) 
#plt.ioff() 
plt.show() 

Анимация работает, но сюжет не представлен. Я получаю сообщение об ошибке:

Traceback (most recent call last): 
    File "/Users/defaultuser/Downloads/compare.py", line 69, in <module> 
    plt.plot(range(1000), y1) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/pyplot.py", line 2467, in plot 
    ret = ax.plot(*args, **kwargs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/axes.py", line 3893, in plot 
    for line in self._get_lines(*args, **kwargs): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/axes.py", line 322, in _grab_next_args 
    for seg in self._plot_args(remaining, kwargs): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/axes.py", line 300, in _plot_args 
    x, y = self._xy_from_xy(x, y) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/axes.py", line 240, in _xy_from_xy 
    raise ValueError("x and y must have same first dimension") 
ValueError: x and y must have same first dimension 
[Finished in 30.6s with exit code 1] 

Update

больше не появляется Эта ошибка, как код был изменен таким образом, plt.plot(y1) предоставление х и у той же размерности. После комментирования кода построения, отвечающего за анимацию, был получен хороший график. Таким образом, я узнал, что функция plt.plot не может быть вызвана более одного раза, и вместо этого требуется подзаголовок.

ответ

1

Первые и последние строки в TRACEBACK:

File "/Users/defaultuser/Downloads/compare.py", line 69, in <module> 
    plt.plot(range(1000), y1) 
... 
    raise ValueError("x and y must have same first dimension") 

предполагают, что range(1000) и y1 не имеют ту же форму. Действительно, если вставить код в интерактивной сессии, вы найдете

In [17]: len(y1) 
Out[17]: 1304 

, который имеет смысл, поскольку приращения t Петли на величину dt и dt < 1:

t = 0.0 
while t<1000: 
    t = t + dt 
    y1.append(...) 

In [18]: dt 
Out[18]: 0.76697947735477701 

Вы может устранить проблему, просто используя форму 1-аргумента plt.plot:

plt.plot(y1) 

что эквивалентно

plt.plot(range(len(y1)), y1) 
+0

Ах, большая благодарность. Я больше не получаю эту ошибку, однако после анимации график не отображается. Это потому, что plt.plot уже используется при настройке анимации? Должен ли и я могу использовать подзаголовки для каждого? –