锯齿波的分解

zhyj_88 2020-08-12 11:25:25
import numpy as np
import matplotlib.pyplot as plt

PI=np.pi
AA=4 #振幅
OMIGA=PI #频率
Num=500 #高次谐波数量

x = np.linspace(0, 10, 1000)
y=np.zeros((Num,x.shape[0]))
for i in range(1,Num+1):
y[i-1]=(-1)**(i+1)/(i*PI)*AA*np.sin(i*OMIGA*x)
z=np.sum(y,axis=0)
fig, ax = plt.subplots(2,2)
plt.subplot(221)
plt.plot(x,y[0], 'b-')
plt.subplot(222)
plt.plot(x,y[1], 'b-')
plt.subplot(223)
plt.plot(x,y[2], 'b-')
plt.subplot(224)
plt.plot(x,z,'c-')
plt.show()


功能强大,图片漂亮.
...全文
333 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhyj_88 2020-08-13
  • 打赏
  • 举报
回复
改进版的.

import numpy as np
import matplotlib.pyplot as plt

PI=np.pi
Num=5000                    #谐波数量
C0=0;C1=1;C3=4              #常数项,级数系数项,第三参数

def sgn(n):
    return 1 if n%2==0 else -1

def ftcs(n):                #fc(n)*cos(tc(n)*x)+fs(n)*sin(ts(n)*x)->(fc,tc,fs,ts)
##    return 0,0,sgn(n+1)*C3/(n*PI),n                             #锯齿波
##    return 0,0,sgn(n+1)*C3/(n*PI),0 if n%2==0 else n            #方波
    return 1/(2*n-1)**2,(2*n-1)/C3*PI,0,0                       #三角波

x = np.linspace(-5*PI, 5*PI, 1000)
tick=np.arange(-5*PI,5*PI+1,PI)
label=np.array(["-5π","-4π","-3π","-2π","-1π","0","π","2π","3π","4π","5π"])
y=np.zeros((Num+1,x.shape[0]))
y[0]=C0
for i in range(1,Num+1):
    a,b,c,d=ftcs(i)
    y[i]=C1*(a*np.cos(b*x)+c*np.sin(d*x))
fig, ax = plt.subplots(2,2)
for i in range(4):
    pattern,arr=('b-',y[i+1]) if i!=3 else ('c-',np.sum(y,axis=0))
    plt.subplot(2,2,i+1)
    if i!=3:
        plt.xlabel("n=%d"%(i+1))
    else:
        plt.xlabel("Total")
    plt.xticks(tick,label)
    plt.plot(x,arr,pattern)
plt.show()

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧