Nous allons appliquer la démarche précédente pour calculer la solution
analytique d'un autre problème de conduction en utilisant Maple pour
effectuer les calculs analytiques. Le problème étudié
différe
du problème
précédent par les conditions aux limites et
la condition initiale.
On considère l'évolution de la température
dans un barreau
de coefficient de conduction
de section
, de longueur
, maintenu à une température constante
sur chacune de
ses extrémités, et chauffé initialement en son milieu à une température
sur une longueur de
.
L'équation d'équilibre s'écrit:
avec les conditions aux limites:
et la condition initiale:
est la répartition de température à l'instant initial,
supposée symétrique par rapport à
.
En posant
,
,
,
et en tenant compte de la symétrie par rapport
à
, le problème modèle
s'écrit:
On utilise Maple pour calculer la solution dans deux cas:
Le programme Maple (1.3.3) calcule la solution générale de (1.19) en utilisant la méthode de séparation de variables décrite précédemment.
# Methode de separation de variables: equation de la chaleur # Cas général > restart:with(plots): # equation et conditions aux limites > diff(u(t,x),t)-K*diff(u(t,x),x$2)=0; EQ:=%: > D[2](u)(t,0); u(t,1)=0; CL:={%%,%}: # recherche solution exacte > u(t,x)=A(t)*B(x);rel1:=%: > expand(simplify(subs(rel1,EQ/(K*u(t,x))))): > P:=[op(lhs(%))]:P[1]=-P[2]; # determination de la solution elementaire en x > Be:=unapply(rhs(dsolve({P[2]=omega^2},B(x))),x); # prise en compte des conditions aux limites > D(Be)(0)=0;Be(1)=0; > -C1=0; omega=(2*k+1)*Pi/2; > Be:=(x,k)->cos((2*k+1)*Pi/2*x); # détermination de la solution en t > Ae:=rhs(dsolve({P[1]=-((2*k+1)*Pi/2)^2},A(t))); > Ae:=(t,k)->exp(-((2*k+1)*Pi/2)^2*K*t); # solution générale > Ug:=unapply(sum(C[k]*Ae(t,k)*Be(x,k),k=0..N),t,x); # prise en compte de la C.I. a t=0 > Ug(0,x)=C(x); # vérification de l'orthogonalite des fonctions élémentaires # pour le calcul des coefficients > assume(i,integer);assume(k,integer); > int(cos((2*k+1)*Pi/2*x)*cos((2*i+1)*Pi/2*x),x=0..1); > int(cos((2*k+1)*Pi/2*x)*cos((2*k+1)*Pi/2*x),x=0..1); # détermination des coefficients de Fourier > k:='k': > C[k]=2*int(C(x)*cos((2*k+1)*Pi/2*x),x=0..1); rel2:=%: # Expression de la solution générale Ug > N:='N': > Ug:=unapply(subs(rel2,Ug(t,x)),t,x);
Dans le programme (1.3.3), on cherche une solution élémentaire
(ligne 8) de l'équation notée
(ligne 5).
On substitue cette solution dans l'équation
(ligne 9), et on
en déduit les 2 équations en
et en
(ligne 10), que
l'on stocke dans le tableau
. On détermine ensuite la solution
générale de l'équation différentielle sur
(ligne 12), et on
impose les conditions aux limites (lignes 14 et 15), ce qui fournit
la solution
qui dépend de
et d'un paramètre entier
(ligne 16):
De même la solution pour
est calculée à la ligne 18. Cette
solution
dépend de
et du paramètre entier
(ligne
19).
La solution générale
de l'équation est donc une somme à priori
infinie (i.e.
) de ces solutions élémentaires (ou modes
propres)
La détermination des coefficients
est obtenue en imposant
à la solution précédente de vérifier la condition initiale (ligne
23). Pour cela on vérifie que les fonctions élémentaires
sont
orthogonales, i.e.:
ce qui nous permet de déterminer les coefficients
en multipliant
la condition initiale par
et en intégrant sur l'intervalle
(ligne 31).
La solution générale calculée à la ligne 34 est la fonction
:
![]() |
|||
![]() |
Nous allons maintenant calculer explicitement cette solution générale dans les deux cas suivants:
La suite du programme Maple (1.3.3) pour le cas d'une condition
initiale gaussienne
est donné
ci dessous (programme 1.3.3). Il permet le calcul de la solution
exacte en utilisant
modes. Pour cette fonction
, Maple
ne peut pas calculer analytiquement l'intégrale intervenant dans l'expression
de
(ligne 4), et nous utilisons la fonction Maple evalf
pour obtenir une évaluation numérique des coefficients
.
# Etude du cas 1 > K:=1;delta:=1/10;C:=x->exp(-(x/delta)^2); # calcul des coefficients de Fourier de la solution > rel2; > N:=20; > for k from 0 to N do > C1[k]:=evalf(rhs(rel2)); > od: # Trace des coefficients de Fourier en fonction du mode > plot([seq([k,C1[k]],k=0..N)],title="coefficient de Fourier"): # Solution sur N modes > k:='k': > Ue:=unapply(evalf(Ug(t,x)),t,x): > t0:=1/(K*(Pi/2)^2); > animate(Ue(t,x),x=0..1,t=0..t0,title="evolution temporelle"); > plot([Ue(0,x),Ue(t0/10,x),Ue(t0/4,x),Ue(t0,x)],x=0..1, title="Evolution temporelle de la solution exacte" ,legend=["t=0","t=t0/10","t=t0/4","t=t0"]);
Pour une condition initiale créneau
, la
suite du programme Maple (1.3.3) est donné ci dessous (programme
1.3.3). Il permet le calcul de la solution exacte en utilisant
modes.
# Etude du cas 2 > K:=1;delta:=1/10;C:=x->Heaviside(delta-x); # Calcul des coefficients de Fourier de la solution > eval(rel2); > N:=1000; > for k from 0 to N do > C1[k]:=evalf(rhs(rel2)); > od: # Trace des coefficients de Fourier en fonction du mode > plot([seq([k,C1[k]],k=0..N)],title="coefficient de Fourier"); # Solution sur N modes > k:='k': > Ue:=unapply(evalf(Ug(t,x)),t,x): > t0:=1/(K*(Pi/2)^2); > animate(Ue(t,x),x=0..1,t=0..t0,title="Evolution temporelle"); > plot([Ue(0,x),Ue(t0/10,x),Ue(t0/4,x),Ue(t0,x)],x=0..1, title="Evolution temporelle de la solution exacte" ,legend=["t=0","t=t0/10","t=t0/4","t=t0"]); # Solution sur 20 modes > N:=20:Ue1:=unapply(evalf(Ug(t,x)),t,x): > plot([Ue1(0,x),Ue1(t0/10,x),Ue1(t0/4,x),Ue1(t0,x)],x=0..1); > plot([Ue1(t0/100,x)-Ue(t0/100,x),Ue1(t0/10,x)-Ue(t0/10,x), Ue1(t0/4,x)-Ue(t0/4,x),Ue1(t0,x)-Ue(t0,x)],x=0..1, title="Erreur entre une solution sur N=20 et N=100" ,legend=["t=t0/100","t=t0/10","t=t0/4","t=t0"]);
Pour cette fonction, Maple peut calculer analytiquement les intégrales,
et fournit l'expression exacte des coefficients
(ligne 4).
Nous étudierons la solution sur un temps caractéristique
de diffusion, qui pour notre problème vaut (ligne
15):
En effet, au bout de
, l'amplitude de tous les modes décroît
au moins d'un facteur
(un mode
décroît d'un facteur
de
).
Nous avons calculé l'amplitude des
premiers modes (lignes 6 à
8), ainsi que la solution
(ligne 13). Sur la figure (1.1),
nous avons tracé le résultat pour
modes et
(lignes
10 et 17). Dans le programme Maple, on a aussi éffectué une animation
de la solution à l'aide de la fonction animate (ligne 15).
On constate sur la figure (1.1a), que l'amplitude
des modes décroît rapidement avec
, et donc que la série de Fourier
(ligne 13) converge rapidement (i.e. il suffit de peu de modes pour
décrire la solution). Sur la figure (1.1b), on a tracé l'évolution
temporelle de la solution analytique calculé sur
modes. On constate
bien l'amortissement de la solution initiale sur un temps de l'ordre
de
.
Pour
,
on a calculé l'amplitude et l'évolution temporelle
de la solution, que l'on a tracé sur la figure 1.2.
Contrairement au cas précédent, on constate sur la figure (1.2a),
que la convergence de la série de Fourier est très lente, puisque
l'amplitude des coefficients
décroît très lentement vers
zéro. C'est aussi ce que l'on remarque sur la figure (1.2b),
où la solution initiale calculée avec
modes présente des
oscillations sur les bords. C'est le phénomène classique de Gibbs,
qui apparaît lorsque l'on approche une fonction discontinue (ici la
fonction porte
) par une série de fonctions
continues (ici les fonctions
).
On remarque aussi que les solutions
pour
ne présentent
plus ses oscillations parasites. En effet les modes associés aux grandes
valeurs de
ont une amplitude qui décroît très rapidement avec
(en
), et donc
la série de Fourier converge très rapidement vers la solution
pour
.
C'est ce que l'on vérifie en calculant la solution avec
modes
et la comparant à la solution calculée avec
modes (figure
1.3).
Sur la figure (1.3a), on a tracé l'évolution temporelle
de la solution avec
modes. On constate que, hormis la solution
initiale, les solutions ressemblent aux solutions calculées avec
modes (figure 1.2b). Pour la solution initiale, elle présente
plus d'oscillations que la solution avec
modes, ce qui confirme
la faible convergence de la série de Fourier dans ce cas. Pour confirmer
cette analyse, nous avons tracé sur la figure (1.3b), l'écart
entre la solution calculée avec
modes et celle avec
modes pour des valeurs de
de
à
.
On constate que l'erreur est très faible (
) et décroit
avec
, ce qui montre que la solution calculée avec
modes
est une très bonne approximation de la solution exacte pour
.