(* MATHEMATICA Programm zur Loesung der Poissongleichung *)
(* Beispiel: Dipolladung *)

(* Grid: 50 x 50 *)
Xsize=50; Ysize=50;

(* Randbedingungen und Randwerte werden durch ZRB gesteuert *)
(* ZRB[x,y]= 1 am Rand, sonst 0 *)
ZRB = Table[0,{x,Xsize},{y,Ysize}];
Do[ZRB[[x,1]]=1,{x,Xsize}];
Do[ZRB[[x,Xsize]]=1,{x,Xsize}];
Do[ZRB[[1,y]]=1,{y,Ysize}];
Do[ZRB[[Ysize,y]]=1,{y,Ysize}];

(* Dipol: *)
ZRB[[15,25]]=1; ZRB[[35,25]]=1;

(* Pot[x,y]= Anfangswerte 0 oder gewuenschte Werte am "Rand"*)
Pot=Table[0,{x,Xsize},{y,Ysize}];
(* Dipol: *)
Pot[[15,25]]=1; Pot[[35,25]]=-1;

(* Relaxationsiteration: Definition und 100 Iterationen *)
Relax[x_,y_]:= If[ZRB[[x,y]]==1, Pot[[x,y]],
               N[0.25 (Pot[[x-1,y]] + Pot[[x+1,y]] +
                       Pot[[x,y-1]] + Pot[[x,y+1]])] ];
Do[(NewPot=Table[N[Relax[x,y]],{x,Xsize},{y,Ysize}];
    Pot = NewPot),{nit,1,100}];

(* 3D-Plot *)
ListPlot3D[Pot,PlotRange->All]                         
(* Contourplot *)
ListContourPlot[Pot,{PlotRange->All,Contours->20}]    
