Résolution d'une EDP par discrétisation

Yuhu

Résolution d'une EDP par discrétisation

Message par Yuhu » 22 mai 2006 17:50

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.

JMD

Résolution d'une EDP par discrétisation

Message par JMD » 22 mai 2006 21:57

restart:N:=10:a:=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:
Dernière modification par JMD le 23 mai 2006 07:15, modifié 1 fois.

Yuhu

Message par Yuhu » 23 mai 2006 03:38

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
:lol: :cry:

JMD

Message par JMD » 23 mai 2006 07:13

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

Yuhu

Message par Yuhu » 23 mai 2006 12:24

Oulah oui pauvre ordinateur :lol: merci de me l'avoir fait remarquer.

Je retourne à mes tests :)

Répondre