Spectre d'une corde vibrante

On considère une corde de longueur $L$ fixée à ses deux extrémités $x=0$ et $x=L$.

On peut exprimer la vibration de la corde comme une superposition de modes propres.

$$ y(x,t)=\sum_{n=1}^{\infty} y_{0,n} \sin\left( n \frac{\pi}{L} x\right) \sin \left(n \frac{\pi c}{L} t+\varphi_n\right)$$

Les coefficients $y_{0,n}$ et $\varphi_n$ sont déterminés par la donnée du profi initial en amplitude $y(x,0)$ et en vitesse $\displaystyle\frac{\partial y}{\partial t}(x,0)$.

Soit $f$ la fonction impaire, de période $2L$, qui coïncide avec le profil initial en amplitude sur l'intervalle $[0,L]$:

$$\forall x \in[0,L] \quad f(x)=y(x,0) \quad (1)$$

Cette fonction étant impaire, elle s'exprime sous forme d'une série de Fourier en sinus:

$$ f(x)=\sum_{n=1}^{\infty} b_n \sin\left( n \frac{2\pi}{2L} x\right)= \sum_{n=1}^{\infty} b_n\sin\left( n \frac{\pi}{L} x\right) $$

Or

$$ y(x,0)=\sum_{n=1}^{\infty} y_{0,n} \sin\left( n \frac{\pi}{L} x\right) \sin \left(\varphi_n\right)$$

On déduit alors de l'égalité $(1)$ la relation:

$$\boxed{b_n=y_{0,n}\sin\varphi_n}$$

Soit $g$ une fonction impaire, de période $2L$, qui coïncide avec le profil initial de vitesse sur l'intervalle $[0,L]$:

$$\forall x \in[0,L] \quad g(x)=\frac{\partial y}{\partial t}(x,0) \quad (2)$$

Cette fonction s'exprime sous forme d'une série de Fourier:

$$ g(x)=\sum_{n=1}^{\infty} b'_n \sin\left( n \frac{2\pi}{2L} x\right)= \sum_{n=1}^{\infty} b'_n\sin\left( n \frac{\pi}{L} x\right) $$

Or

$$ \frac{\partial y}{\partial t}(x,t)=\sum_{n=1}^{\infty} y_{0,n} \sin\left( n \frac{\pi}{L} x\right) \frac{n\pi c}{L}\cos \left(n \frac{\pi c}{L} t+\varphi_n\right)$$

À t=0

$$ \frac{\partial y}{\partial t}(x,0)=\sum_{n=1}^{\infty} y_{0,n} \frac{n\pi c}{L}\sin\left( n \frac{\pi}{L} x\right) \cos \left(\varphi_n\right)$$

On déduit alors de l'égalité $(2)$ la relation:

$$\boxed{b'_n=y_{0,n}\frac{n\pi c}{L}\cos\varphi_n}$$

La détermination des coefficients de Fourier $b_n$ et $b'_n$ permet d'exprimer $y_{0,n}$ et $\varphi_n$.

Corde pincée de type "clavecin"

On considère une corde pincée (type corde de clavecin).

Le profil initial de la corde est supposé triangulaire, le pincement s'effectuant en $x=a$. On suppose la corde initialement au repos:

$$\forall x\in[0,L] \quad \displaystyle\frac{\partial y}{\partial t}(x,0)=0.$$

On a alors, pour tout $n$, $b'_n=0$ et donc $\cos\varphi_n=0$. On choisit $\varphi_n=\frac{\pi}{2}$. On a alors $y_{0,n}=b_n$.

Le signal s'exprime donc sous la forme:

$$ y(x,t)=\sum_{n=1}^{\infty} b_n \sin\left( n \frac{\pi}{L} x\right) \cos \left(n \frac{\pi c}{L} t\right)$$
In [1]:
%display latex
In [2]:
L=1      #corde de 1m
a=1/7    # on pince la corde au septième de sa longueur
h=0.1    # amplitude du pincement 
c=2*L*440 #on suppose que la corde joue un la4

Profil initial

On définit d'abord le profil initial en amplitude de la corde.

In [3]:
f1(x)=h*x/a;f2(x)=h-(h/(L-a))*(x-a);f3(x)=-f1(-x);f4(x)=-f2(-x);
f=piecewise([ [(-L,-a),f4], [(-a,0),f3] ,  [(0,a),f1], [(a,L),f2] ]) 
In [4]:
gf0=plot(f,0,L,color='red',thickness=2,aspect_ratio=2) #tracé du profil initial de la corde
gf0imp=plot(f,-L,0,color='red',linestyle='dashed',thickness=2,aspect_ratio=2)#prologement impair
show(gf0+gf0imp)
/home/valerie/SageMath/local/lib/python3.9/site-packages/mpmath/ctx_mp_python.py:892: SyntaxWarning: "is" with a literal. Did you mean "=="?
  if other is 0:
/home/valerie/SageMath/local/lib/python3.9/site-packages/mpmath/ctx_mp_python.py:986: SyntaxWarning: "is" with a literal. Did you mean "=="?
  if other is 0:

Le trait plein correspond au profil initial de la corde et le trait pointillé à son prologement impair.

Spectre

On trace tout d'abord le spectre en amplitude (ici $y_{0,n}=b_n$ en fonction de $n$), correspondant aux coefficients en sinus du développement en série de Fourier du profil initial en amplitude.

In [5]:
spectrea1=Graphics()
for i in range(1,21): 
    spectrea1+=line([ (i,0) , (i,f.fourier_series_sine_coefficient(i,L)) ],thickness=1.9,color='black')    
show(spectrea1)

Lorsqu'on pince la corde au septième de sa longueur, l'harmonique de rang 7 (ou multiple de 7) disparaît.

On peut tracer également son spectre en puissance

In [6]:
spectrep1=Graphics()
for i in range(1,21): 
    spectrep1+=line([ (i,0) , (i,(f.fourier_series_sine_coefficient(i,L))^2) ],thickness=1.9,color='black')    
show(spectrep1)

On souhaite désormais visualiser la vibration ultérieure de la corde.

Reconstitution du signal

In [7]:
var('x,t,k') #la déclaration de la variable k est indispensable avant d'utiliser sum
y(x,t)=sum((f.fourier_series_sine_coefficient(k,L))*cos(k*pi*c*t/L)*sin(k*pi*x/L),k,1,21)
y(x,t)
Out[7]:
In [8]:
vibr=animate([plot(y(x,k*0.01*(1/440)),color='green',xmin=0,xmax=1,ymin=-0.2,ymax=0.2) for k in range(0,100)])
vibr.show(delay=0.1)

Corde frappée type "piano"

On considère une corde frappée (type corde de piano).

La corde est supposée initialement non déformée: $\forall x \in[0,L] \quad y(x,0)=0$.

On modélise la frappe du marteau par un profil rectangulaire de vitesse.

On a alors, pour tout $n$, $b_n=0$ et donc $\sin\varphi_n=0$. On choisit $\varphi_n=0$. On en déduit $b'_n=y_{0,n}\frac{n\pi c}{L}$.

Le signal s'exprime sous la forme:

$$ y(x,t)=\sum_{n=1}^{\infty} \frac{Lb'_n}{n\pi c} \sin\left( n \frac{\pi}{L} x\right) \sin \left(n \frac{\pi c}{L} t\right)$$
In [9]:
v=5 #vitesse de frappe (les autres données étant inchangées)

Profil initial en vitesse

La frappe de la corde s'effectue sur une largeur $\frac{L}{10}$ autour de $x=a$.

In [10]:
g1(x)=0;g2(x)=-v;
g=piecewise([ [(-L,-a-L/20),g1],  [(-a-L/20,-a+L/20),-g2] , [(-a+L/20,a-L/20),g1], 
             [(a-L/20,a+L/20),g2],  [(a+L/20,L),g1] ]) 
In [11]:
gg0=plot(g,0,L,color='red',thickness=2,aspect_ratio=0.1) #tracé du profil initial de la corde
gg0imp=plot(g,-L,0,color='red',linestyle='dashed',thickness=2,aspect_ratio=0.1)#prologement impair
show(gg0+gg0imp)

Spectre

On représente $\frac{L}{n\pi c}b'_n$ en fonction de $n$, puis $\left(\frac{L}{n\pi c}b'_n\right)^2$ en fonction de $n$.

In [12]:
spectrea2=Graphics()
for i in range(1,41): 
    spectrea2+=line([ (i,0) , (i,(L/(i*pi*c))*g.fourier_series_sine_coefficient(i,L)) ],thickness=1.9,color='black')    
show(spectrea2)
In [13]:
spectrep2=Graphics()
for i in range(1,41): 
    spectrep2+=line([ (i,0) , (i,((L/(i*pi*c))*g.fourier_series_sine_coefficient(i,L))^2)] ,thickness=1.9,color='black')    
show(spectrep2)

Reconstitution du signal

In [14]:
var('x,t,k') #la déclaration de la variable k est indispensable avant d'utiliser sum
yp(x,t)=sum((g.fourier_series_sine_coefficient(k,L))*L*sin(k*pi*c*t/L)*sin(k*pi*x/L)/(k*pi*c),k,1,20)
In [15]:
vibrp=animate([plot(yp(x,k*0.01*(1/440)),color='green',xmin=0,xmax=1,ymin=-5e-4,ymax=5e-4) 
               for k in range(0,100)])
vibrp.show(delay=1)