Bonjour,
Je commence à désespérer de ne pas trouver assez d'informations tout seul afin de réaliser mon programme, et j'en viens donc à vous demander de l'aide.
En fait, je voudrais savoir si quelqu'un sait résoudre des équations aux dérivées partielles en discrétisant un espace à 2 dimensions avec maple ?
Plus précisément, je voudrais par exemple définir une partie A (un ouvert) où laplacien de f = 0 : soit d²f/dx²(x,y) + d²f/dy²(x,y) = 0 pour tout (x,y) appartenant à A.
Puis imposer des conditions aux limites de ma partie pour f (les limites = les bords de A, soit l'adhérance privée de A).
Exemple de partie : un petit rectangle emboité dans un autre, à l'intérieur du petit, j'impose f=constante1, et à l'extérieur du grand rectangle, f=constante2, entre les 2, on a donc Laplacien de f(x,y) = 0.
Pour l'instant, le meilleur lien que j'ai trouvé est celui-ci http://math.univ-lille1.fr/~chehab/ENS/ ... ours1.html
où des exemples sont traitées avec f = 0 sur les bords d'un ouvert type "pavé", mais je ne vois pas comment imposer des conditions différentes sur un domaine plus exotique qu'un pavé.
Si quelqu'un s'y connait un peu, ce serait vraiment sympa de sa part de m'éclairer un petit peu. Merci d'avance.
Résolution d'une EDP par discrétisation
Résolution d'une EDP par discrétisation
restart:N:=10=array(1..N,1..N):for i to N do for j to N do a[i,j]:=0: od: od:
> for i from 2 to N do a[i,N]:=1.0: a[N,i]:=1.0 od:
> calcul:=proc(b,n)
> local i,j,c:
> c:=copy(b):
> for i from 2 to n-1 do for j from 2 to n-1 do b[i,j]:=(c[i-1,j]+c[i+1,j]+c[i,j-1]+c[i,j+1])/4 od: od:
> end:
> for k to 20 do calcul(a,N): print(a); od:
> for i from 2 to N do a[i,N]:=1.0: a[N,i]:=1.0 od:
> calcul:=proc(b,n)
> local i,j,c:
> c:=copy(b):
> for i from 2 to n-1 do for j from 2 to n-1 do b[i,j]:=(c[i-1,j]+c[i+1,j]+c[i,j-1]+c[i,j+1])/4 od: od:
> end:
> for k to 20 do calcul(a,N): print(a); od:
Dernière modification par JMD le 23 mai 2006 07:15, modifié 1 fois.
Merci beaucoup pour cette réponse, ça m'a permis de faire pas mal de tests.
Comme je vois que vous etes professeurs de physique, le sens physique de ce programme vous intéresse t-il peut etre :
Il s'agit de de modéliser l'amplification du champ électrique au voisinage d'une aspérité par temps orageux. En effet, à l'intérieur de l'aspérité, on a V=0, et loin de l'aspérité, V fixé. Et dans l'atmosphere, en considérant qu'elle est localement neutre, on a Laplacien de V = 0.
L'idéal serait de montrer par ce programme qu'il y a de plus ou moins fortes variations du potentiel V au voisinage de l'aspérité.
Pour l'instant j'ai essayé cela :
> N:=30:
> A:=array(1..N,1..N):
> for i from 1 to N do
> for j from 1 to N do
> A[i,j]:=0: od: od:
> for i from 1 to N do
> A[i,N]:=1:A[i,1]:=1:A[N,i]:=1:A[1,i]:=1: od: condition : V=1 sur les bords du pavé
> calcul:=proc(B,N)
> local i,j,k,l,m,n,p,C:
> C:=copy(B):
> for j from 2 to N/2-1 do
> for i from 2 to N-1 do
> for l from N/2+2 to N-1 do
> for k from 2 to N-1 do
> for m from N/2 to N/2+1 do
> for n from 2 to floor(N/3)-1 do
> for p from floor(2*N/3)+1 to N-1 do
> B[i,j]:=(C[i-1,j]+C[i+1,j]+C[i,j-1]+C[i,j+1])/4:
> B[k,l]:=(C[k-1,l]+C[k+1,l]+C[k,l-1]+C[k,l+1])/4:
> B[n,m]:=(C[n-1,m]+C[n+1,m]+C[n,m-1]+C[n,m+1])/4:
> B[p,m]:=(C[p-1,m]+C[p+1,m]+C[p,m-1]+C[p,m+1])/4:
> od: od: od: od: od: od: od:
> end:
J'ai essayé de modéliser un clou, où V=0, à l'intérieur du pavé
Le probleme, c'est que mon ordi met un temps fou à calculer le premier calcul(A,N) pour N=30, sachant que j'aimerais N>100, et pour enchainer une vingtaine de calcul(A), ça devrait donc prendre quelques mois
Comme je vois que vous etes professeurs de physique, le sens physique de ce programme vous intéresse t-il peut etre :
Il s'agit de de modéliser l'amplification du champ électrique au voisinage d'une aspérité par temps orageux. En effet, à l'intérieur de l'aspérité, on a V=0, et loin de l'aspérité, V fixé. Et dans l'atmosphere, en considérant qu'elle est localement neutre, on a Laplacien de V = 0.
L'idéal serait de montrer par ce programme qu'il y a de plus ou moins fortes variations du potentiel V au voisinage de l'aspérité.
Pour l'instant j'ai essayé cela :
> N:=30:
> A:=array(1..N,1..N):
> for i from 1 to N do
> for j from 1 to N do
> A[i,j]:=0: od: od:
> for i from 1 to N do
> A[i,N]:=1:A[i,1]:=1:A[N,i]:=1:A[1,i]:=1: od: condition : V=1 sur les bords du pavé
> calcul:=proc(B,N)
> local i,j,k,l,m,n,p,C:
> C:=copy(B):
> for j from 2 to N/2-1 do
> for i from 2 to N-1 do
> for l from N/2+2 to N-1 do
> for k from 2 to N-1 do
> for m from N/2 to N/2+1 do
> for n from 2 to floor(N/3)-1 do
> for p from floor(2*N/3)+1 to N-1 do
> B[i,j]:=(C[i-1,j]+C[i+1,j]+C[i,j-1]+C[i,j+1])/4:
> B[k,l]:=(C[k-1,l]+C[k+1,l]+C[k,l-1]+C[k,l+1])/4:
> B[n,m]:=(C[n-1,m]+C[n+1,m]+C[n,m-1]+C[n,m+1])/4:
> B[p,m]:=(C[p-1,m]+C[p+1,m]+C[p,m-1]+C[p,m+1])/4:
> od: od: od: od: od: od: od:
> end:
J'ai essayé de modéliser un clou, où V=0, à l'intérieur du pavé
Le probleme, c'est que mon ordi met un temps fou à calculer le premier calcul(A,N) pour N=30, sachant que j'aimerais N>100, et pour enchainer une vingtaine de calcul(A), ça devrait donc prendre quelques mois
Pour parcourir une surface, il faut imbriquer deux boucles,
l'une décrivant l'axe des x, l'autre l'axe des y.
Vous avez imbriqué sept boucles,
multipliant par N à la puissance 5 le temps d'exécution,
et probablement exécutant N à la puissance 5 fois la même chose
Il ne me paraît pas étonnant que votre programme soit très long à exécuter
l'une décrivant l'axe des x, l'autre l'axe des y.
Vous avez imbriqué sept boucles,
multipliant par N à la puissance 5 le temps d'exécution,
et probablement exécutant N à la puissance 5 fois la même chose
Il ne me paraît pas étonnant que votre programme soit très long à exécuter