Oscillations propres d'une corde tendue
Fondamental : Diaporama du micro-contenu (rafraichir la page si redimensionnée)
Texte légal : Polycopié du micro-contenu
Simulation : Programme Python
1
# -*- coding: utf-8 -*-
2
"""
3
Corde
4
O. Thual, 21/08/2021
5
"""
6
7
# clear all
8
for iglob in list(globals().keys()):
9
if(iglob[0] != '_'):
10
exec('del {}'.format(iglob))
11
# import libraries
12
import numpy as np
13
import matplotlib.pyplot as plt
14
import os
15
16
17
def inifig(xaxe=0,yaxe=0,xlab='x',ylab='y'):
18
plt.figure(2)
19
plt.axvline(xaxe)
20
plt.axhline(yaxe)
21
plt.xticks(fontsize=12)
22
plt.yticks(fontsize=12)
23
plt.xlabel(xlab,fontsize=16 )
24
plt.ylabel(ylab,fontsize=16)
25
26
def zfi(x,le=2):
27
miss=le-len(str(x))
28
a='0'*miss+str(x)
29
return a
30
31
def animation(name):
32
a=np.linspace(0,L,N+1);
33
acont=np.linspace(0,L,501);
34
t=0;
35
dt=Time/Nt
36
for i in range(0,Nt+1):
37
title=name+" i="+zfi(i)
38
titlefig=name
39
print(title)
40
fig=plt.figure(N,figsize=(7,4))
41
plt.xlabel(r'$x$',fontsize=16 )
42
plt.ylabel(r'Déplacement $y$',fontsize=16)
43
plt.title(titlefig,fontsize=16)
44
# signal
45
t=dt*i;
46
xi=signal(a,t)
47
afin=a[N]; xifin=xi[N]
48
xicont=signal(acont,t)
49
plt.scatter(a,xi,marker='o',color='blue',s=40)
50
if Redpoint: plt.scatter(afin,xifin,marker='o',color='red',s=160)
51
plt.plot(acont,xicont,color='black',linewidth=3)
52
plt.xlim(0,L)
53
plt.ylim(ymin,ymax)
54
namei=name+zfi(i)+'.png';
55
plt.grid(color='black', axis='y', linestyle='-', linewidth=1)
56
plt.grid(color='black', axis='x', linestyle='-', linewidth=1)
57
plt.savefig(namei)
58
#plt.show()
59
plt.close()
60
gifanim="Anim"+name+".gif"
61
#os.system('/opt/local/bin/convert -set delay '+delay+' '+name+'* '+gifanim);
62
os.system('/usr/local/bin/convert -set delay '+delay+' '+name+'* '+gifanim);
63
if Flagrm: os.system('rm '+name+'*');
64
65
def anistatio(name):
66
a=np.linspace(0,L,N+1);
67
acont=np.linspace(0,L,501);
68
t=0;
69
dt=Time/Nt
70
fig=plt.figure(N,figsize=(7,4))
71
plt.xlabel(r'$x$',fontsize=16 )
72
plt.ylabel(r'Déplacement $y$',fontsize=16)
73
plt.xlim(0,L)
74
plt.ylim(ymin,ymax)
75
titlefig=name
76
plt.title(titlefig,fontsize=16)
77
title=name
78
print(title)
79
for i in range(0,Nt+1):
80
# signal
81
t=dt*i;
82
xi=signal(a,t)
83
afin=a[N]; xifin=xi[N]
84
xicont=signal(acont,t)
85
plt.scatter(a,xi,marker='o',color='black',s=10)
86
if Redpoint: plt.scatter(afin,xifin,marker='o',color='red',s=160)
87
plt.plot(acont,xicont,color='black',linewidth=1)
88
namei=name+zfi(i)+'.png';
89
plt.grid(color='black', axis='y', linestyle='-', linewidth=1)
90
plt.grid(color='black', axis='x', linestyle='-', linewidth=1)
91
# big one
92
t=3*Time/4
93
xi=signal(a,t)
94
xicont=signal(acont,t)
95
plt.scatter(a,xi,marker='o',color='red',s=40)
96
plt.plot(acont,xicont,color='red',linewidth=3)
97
plt.savefig(namei)
98
plt.show()
99
100
101
# Main
102
F=False; T=True
103
Flagrm=T; Redpoint=F
104
105
def pulse(a,d):
106
al=0*a[a<-d]; ac=a[np.abs(a)<=d]; ar=0*a[a>d];
107
k=np.pi/d; fc=.5*(1+np.cos(k*ac));
108
f=np.concatenate((al,fc,ar))
109
return f
110
111
def statio(a,d):
112
k=np.pi/d; fc=.5*(1+np.cos(k*ac));
113
f=np.cos
114
return f
115
116
117
# Fonction reponse Corde de Melde
118
if F:
119
chimax=5; dchi=.01
120
chi=np.linspace(dchi,chimax-dchi,200)
121
Y=np.abs(1/np.sin(np.pi*chi))
122
fig=plt.figure(1,figsize=(7,4))
123
plt.xlabel(r'$X=\omega/\omega_1$',fontsize=16 )
124
plt.ylabel(r'$|Y|=|A|/A_e$',fontsize=16)
125
plt.title("Amplitude de la corde de Melde",fontsize=16)
126
plt.plot(chi,Y,color='black',linewidth=3)
127
plt.xlim(0,chimax)
128
plt.ylim(0,4)
129
plt.grid(color='black', axis='y', linestyle='-', linewidth=1)
130
plt.grid(color='black', axis='x', linestyle='-', linewidth=1)
131
plt.savefig("Melde")
132
plt.show()
133
plt.close()
134
135
136
# Stationnaire-sin Melde
137
if F:
138
N=20; L=10; c=1;
139
Nt=20; Redpoint=T
140
dchi=.1; chimin=1.51;
141
for m in range(0,10,1):
142
chi=round(chimin+m*dchi,2)
143
print("m=",m,"chi=",chi)
144
k=chi*np.pi/L; omega=k*c; Time=2*np.pi/omega
145
Y=np.abs(1/np.sin(np.pi*chi))
146
ymin=-4; ymax=4;
147
de=20*chimin/chi
148
print("de=",de)
149
delay=str(de)
150
# signal
151
def signal(a,t):
152
xi=Y*np.sin(k*a)*np.cos(omega*t+np.pi/2)
153
return xi
154
print("Melde-chi="+zfi(chi))
155
animation("Melde-X="+zfi(chi))
156
157
# Stationnaire-sin Melde remanant
158
if F:
159
N=20; L=10; c=1;
160
Nt=20; Redpoint=T
161
dchi=.1; chimin=1.51;
162
for m in range(0,10,1):
163
chi=round(chimin+m*dchi,2)
164
print("m=",m,"chi=",chi)
165
k=chi*np.pi/L; omega=k*c; Time=2*np.pi/omega
166
Y=np.abs(1/np.sin(np.pi*chi))
167
ymin=-4; ymax=4;
168
de=20*chimin/chi
169
print("de=",de)
170
delay=str(de)
171
# signal
172
def signal(a,t):
173
xi=Y*np.sin(k*a)*np.cos(omega*t+np.pi/2)
174
return xi
175
print("Melde-chi="+zfi(chi))
176
anistatio("Melde-X="+zfi(chi))
177
178
179
180
181
# Stationnaire-sin entier
182
if F:
183
N=20; L=10; c=1;
184
Time=2*L/c; Nt=20; sc=.9*L/N # scaling
185
k=np.pi/L; omega=k*c;
186
ymin=-1; ymax=1;
187
duprange=np.linspace(-1,1,9)
188
delay="20"
189
# signal
190
def signal(a,t):
191
xi=np.sin(n*k*a)*np.cos(omega*t+np.pi/2)
192
return xi
193
for m in range(10,100,10):
194
print("Stationaire-sin-10xn="+zfi(m))
195
n=m/10; animation("Stationaire-fixe-fixe-10xn="+zfi(m))
196
197
198
# Stationnaire-sin entier remanant
199
if F:
200
N=20; L=10; c=1;
201
Time=2*L/c; Nt=20; sc=.9*L/N # scaling
202
k=np.pi/L; omega=k*c;
203
ymin=-1; ymax=1;
204
duprange=np.linspace(-1,1,9)
205
delay="20"
206
# signal
207
def signal(a,t):
208
xi=np.sin(n*k*a)*np.cos(omega*t+np.pi/2)
209
return xi
210
for m in range(10,50,10):
211
print("Stationaire-sin-10xn="+zfi(m))
212
n=m/10; anistatio("Stationaire-fixe-fixe-10xn="+zfi(m))
213
214
215
216
# Stationnaire-cos entier remanant
217
if T:
218
N=20; L=10; c=1;
219
Time=2*L/c; Nt=20; sc=.9*L/N # scaling
220
k=np.pi/L; omega=k*c;
221
ymin=-1; ymax=1;
222
duprange=np.linspace(-1,1,9)
223
delay="20"
224
# signal
225
def signal(a,t):
226
xi=np.cos(n*k*a)*np.cos(omega*t+np.pi/2)
227
return xi
228
for m in range(10,50,10):
229
print("Stationaire-sin-10xn="+zfi(m))
230
n=m/10; anistatio("Stationaire-libre-libre-10xn="+zfi(m))
231
232
233
234
235
236
237
# Stationnaire-sin demi entier
238
if F:
239
N=20; L=10; c=1;
240
Time=2*L/c; Nt=20; sc=.9*L/N # scaling
241
k=np.pi/L; omega=k*c;
242
ymin=-1; ymax=1;
243
duprange=np.linspace(-1,1,9)
244
delay="20"
245
# signal
246
def signal(a,t):
247
xi=np.sin(n*k*a)*np.cos(omega*t+np.pi/2)
248
return xi
249
for m in range(5,105,10):
250
print("Stationaire-fixe-libre-10xn="+zfi(m))
251
n=m/10; animation("Stationaire-fixe-libre-10xn="+zfi(m))
252
253
254
# Stationnaire-sin demi entier remanat
255
if F:
256
N=20; L=10; c=1;
257
Time=2*L/c; Nt=20; sc=.9*L/N # scaling
258
k=np.pi/L; omega=k*c;
259
ymin=-1; ymax=1;
260
duprange=np.linspace(-1,1,9)
261
delay="20"
262
# signal
263
def signal(a,t):
264
xi=np.sin(n*k*a)*np.cos(omega*t+np.pi/2)
265
return xi
266
for m in range(5,45,10):
267
print("Stationaire-fixe-libre-10xn="+zfi(m))
268
n=m/10; anistatio("Stationaire-fixe-libre-10xn="+zfi(m))
269
270
271