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 .