Oscillations propres d'une corde tendue

FondamentalDiaporama du micro-contenu (rafraichir la page si redimensionnée)

SimulationProgramme 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