你如何绘制python中谐波的总和

时间:2016-08-15 10:26:26

标签: python numpy matplotlib

我使用以下手动方法绘制谐波的总和。下面的方法工作正常。请参考下图。当在for循环中实现同样的事情时,它不能正常工作.for循环用于处理n个谐波值。可以帮助我这个?

import numpy as np
import matplotlib.pyplot as plt
# omega =2*pi

x=np.linspace(0,2*np.pi,2000)
y1=np.sin(1*2*np.pi*x)/1
y2=np.sin(3*2*np.pi*x)/3
y3=np.sin(5*2*np.pi*x)/5
y4=np.sin(7*2*np.pi*x)/7
y5=np.sin(9*2*np.pi*x)/9
Y=y1+y2+y3+y4+y5 
plt.plot(x,Y)
plt.grid()
plt.show()

#Implementation in for loop is not working

def Harmonic(i):
    y = [] 
    for n in range(0,i):
        y=np.sin((2*n+1)*(2*np.pi)*(x))/(2*n+1)
        y += y
        plt.plot(x,y)
        plt.grid()
        plt.show()

Harmonics

3 个答案:

答案 0 :(得分:3)

如果目标是“实时”看到增加谐波数量的影响,您应该使用FuncAnimation

fig,ax = plt.subplots()
x=np.linspace(0,2*np.pi,2000)
y=np.zeros((2000,))
l, = ax.plot(x,y)

def initPlot():
    ax.set_xlim(0,2*np.pi)
    ax.set_ylim(-1,1)
    l, = ax.plot(x,y)
    return l,

def Harmonic(i):
    y=l.get_ydata()
    y += np.sin((2*i+1)*(2*np.pi)*(x))/(2*i+1)
    l.set_ydata(y)
    return l,

anim = animation.FuncAnimation(fig, Harmonic, init_func=initPlot, frames=150, interval=100, blit=True)

答案 1 :(得分:2)

这里有一个适合你的实例:一点点重构:

import numpy as np
import matplotlib.pyplot as plt


def first_solution(N=2000):
    w = 2 * np.pi
    x = np.linspace(0, w, N)

    y1 = np.sin(1 * w * x) / 1
    y2 = np.sin(3 * w * x) / 3
    y3 = np.sin(5 * w * x) / 5
    y4 = np.sin(7 * w * x) / 7
    y5 = np.sin(9 * w * x) / 9
    y = y1 + y2 + y3 + y4 + y5
    plt.plot(x, y)


def second_solution(i, N=2000):
    w = 2 * np.pi
    x, y = np.linspace(0, w, N), []

    harmonics = [np.sin((n * 2 + 1) * w * x) / (n * 2 + 1) for n in range(i)]
    plt.plot(x, sum(harmonics))

plt.figure(1)
plt.subplot(211)
first_solution()
plt.grid()
plt.subplot(212)
second_solution(5)
plt.grid()
plt.show()

我已将first_solution称为您的工作方法,将second_solution称为您的错误计划。希望它有所帮助

答案 2 :(得分:1)

你的意思是什么?

SyncAdapter

或者,如果您想要使用该功能,请制作情节:

import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(0,2*np.pi,2000)
y = [0 for _ in x]

def Harmonic(i):
    global y
    global x
    for n in range(0,i):
        y += np.sin((2*n+1)*(2*np.pi)*(x))/(2*n+1)

Harmonic(5)
plt.plot(x,y)
plt.grid()
plt.show()