sx=100;  (* horizontal grid size *)
sy=50;  (* vertical grid size *)
h=30  (* height of tip in grid units *)

(* top and bottom edges of grid where potential 1 and 0 is imposed *)
top=Table[{sy,i},{i,sx}];  
bot=Join[Table[{1,i},{i,sx}],Flatten[Table[{j+1,sx/2+i},{j,h},{i,-h+j,h-j}],1]];

(* set potential at top and bottom edges *)
setBoundary[v_]:=ReplacePart[v,{top->1.,bot->0.}]

(* replace potential at interior grid points by average of potential at adjacent grid points *)
neighborAverage[v_]:=(RotateRight[v,{1,0}]+RotateRight[v,{-1,0}]+RotateRight[v,{0,1}]+RotateRight[v,{0,-1}])/4  

(* weighted combination of potential with its neighbor-average *)
relax[v_]:=setBoundary[(1-α)v+α neighborAverage[setBoundary[v]]]

(* set potential at random values between potentials of top and bottom edges *)
rand:=setBoundary[RandomReal[{0,1},{sy,sx}]]

(* contour plot of potential *)
render[v_]:=ListContourPlot[v,AspectRatio->Automatic,Frame->False]

(* set the relaxation parameter *)
α=.5;

(* initialize the potential *)
v=rand;

Do[
v=relax[v];
If[Mod[iter,1]==0,Print[render[v]]];
,{iter,10}]