Ci-dessous la fonction de calcul (télécharger).
diffusion[n_,type0_,lim0_,type1_,lim1_,coef_,vecS_,vecU_,temps_,dt_,tf_]:=Module[ {t,u,dx,matA,matB,vecC,vecD,a,nd,alpha,j1,j2,k,j}, t = temps; u = vecU; dx=1/(n-1); matA = SparseArray[{},{n,n}]; matB = SparseArray[{},{n,n}]; vecC = vecS*dt; a = 2*dt/dx^2; nd = Length[coef]; vecD = Array[0,{n,1}]; j1=1; For[k=1,k<=nd,k++, j2 = Floor[coef[[k]][[1]]*n]; d = coef[[k]][[2]]; For[j=j1,j<=j2,j++, vecD[[j]] = d ]; j1 = j2; ]; For[j=2,j<=n-1,j++, alpha = a*vecD[[j]]; matA[[j,j-1]] = -alpha/2; matB[[j,j-1]] = alpha/2; matA[[j,j]] = 1+alpha; matB[[j,j]] = 1-alpha; matA[[j,j+1]] = -alpha/2; matB[[j,j+1]] = alpha/2; ]; If[type0=="dirichlet", matA[[1,1]] = 1; matA[[1,2]] = 0; vecC[[1]] = lim0; ]; If[type0=="neumann", matA[[1,1]] = -1; matA[[1,2]] = 1; vecC[[1]] = dx*lim0; ]; If[type1=="dirichlet", matA[[n,n-1]] = 0; matA[[n,n]] = 1; vecC[[n]] = lim1; ]; If[type1=="neumann", matA[[n,n-1]] = 1; matA[[n,n]] = -1; vecC[[n]] = dx*lim1; ]; For[k=1,k<=nd-1,k++, (*frontiere entre deux coefficients de diffusion differents*) j = Floor[coef[[k]][[1]]*n]-1; matA[[j,j-1]] = -vecD[[j]]; matA[[j,j]] = vecD[[j]]+vecD[[j+1]]; matA[[j,j+1]] = -vecD[[j+1]]; matB[[j,j-1]] = 0; matB[[j,j]] = 0; matB[[j,j+1]] = 0; vecC[[j]] = 0; ]; While[t<tf, u = LinearSolve[matA,matB.u+vecC]; t = t+dt; ]; Return[{u,t}]; ]
On considère une plaque (perpendiculaire à l'axe x) de conductivité thermique uniforme, soumise en x=0 à une température constante U=1 et en x=1 à une température constante U=0. Il n'y a aucune source thermique dans la plaque. Initialement la température est nulle sur l'intervalle [0,1].
Get["equationDiffusion.m"]; n = 200; u = Table[0,{n}]; s = Table[0,{n}]; coef = {{1,1}}; t = 0; {u1,t}=diffusion[n,"dirichlet",1,"dirichlet",0,coef,s,u,t,0.0001,0.001]; {u2,t}=diffusion[n,"dirichlet",1,"dirichlet",0,coef,s,u1,t,0.001,0.01]; {u3,t}=diffusion[n,"dirichlet",1,"dirichlet",0,coef,s,u2,t,0.01,0.1]; {u4,t}=diffusion[n,"dirichlet",1,"dirichlet",0,coef,s,u3,t,0.1,1];
ListLinePlot[{u1,u2,u3,u4},PlotRange->{{0,n},{0,1}},AxesLabel->{"x","T"}]plotA.pdf
On considère un système isolé formé de deux plaques initialement à deux températures différentes, mises en contact thermique par une troisième plaque mince de conductivité plus faible.
n = 500; u = Table[0,{n}]; s = Table[0,{n}]; For[j=1,j<=Floor[n/2],j++,u[[j]]=1]; coef = {{0.45,1},{0.55,0.05},{1,1}}; t = 0; {u1,t}=diffusion[n,"neumann",0,"neumann",0,coef,s,u,t,0.00001,0.001]; {u2,t}=diffusion[n,"neumann",0,"neumann",0,coef,s,u1,t,0.001,0.01]; {u3,t}=diffusion[n,"neumann",0,"neumann",0,coef,s,u2,t,0.01,0.1]; {u4,t}=diffusion[n,"neumann",0,"neumann",0,coef,s,u3,t,0.1,1];
ListLinePlot[{u1,u2,u3,u4},PlotRange->{{0,n},{0,1}},AxesLabel->{"x","T"}]plotB.pdf