(*Vstupy*)
nula = 0;
e0=8.854 (10^(-12))(*F/m*);
(*stineni - kraje matice*)
stineni1=0.0000000001;
stineni2=0.0000000001;
stineni3=0.0000000001;
stineni4=0.0000000001;

(*počet iterací*)
iterace = 1000;

(*poloha elektrod*)
n = 200(*počet řádků*);
m = 200(*počet sloupců*);

h = 48(*misto horní elektrody - řádek*);
d =52(*misto dolní elektrody- řádek*);

z=65(*začátek elektrody - sloupec*);
k=65(*začátek elektrod - sloupec**);

z2=145(*konec elektrod - sloupec*);
k2=145(*konec elektrod - sloupec*);

(*potenciál na elektrodách*)
potencialhorni = 300;(*potencial na horní elektrodě*)
potencialdolni = 0.0000001; (*potencial na dolní elektrodě*)


(*program*)

policko=Table[nula,{i,n},{j,m}]; (*tvorba matice z 0 o rozměrech n a m*)

For[i=1,i<=z2-z+1,i++, 
	policko[[h,z+i-1]]=potencialhorni
	] (*vložení hodnoty potenciálu horní elektrody*)
For[i=1,i≤k2-k+1,i++, 
	policko[[d,k+i-1]]=potencialdolni
	](*vložení hodnoty potenciálu dolni elektrody*)
	
For[i=1,i≤m,i++, 
	policko[[1,i]]=stineni1
	] (*horní stínění*)
	
For[i=1,i≤m,i++, 
	policko[[m,i]]=stineni2
	] (*dolní stínění*)
	
For[i=1,i≤n,i++, 
	policko[[i,n]]=stineni3
	] (*prave stínění*)	
For[i=1,i≤n,i++, 
	policko[[i,1]]=stineni4
	] (*levé stínění*)	
	
policko//MatrixForm(*tvorba pole před průměrováním*);

zdrojovaMatice =policko;
finalni = zdrojovaMatice;

For [i=0,i<iterace, i++,
prumerovaMatice=ImageConvolve[Image[finalni],(({{0, 0.25, 0}, {0.25, 0, 0.25}, {0, 0.25, 0}}))]; (*do "prumerovaMatice" se uloží průměry bodů po jedné iteraci, průměry jsou tvořený na základě hodnot v matici "finalni"*)
bezZdroju = ImageData[ImageMultiply[prumerovaMatice,ContourDetect[ Image[zdrojovaMatice],0]],"Real"]; (*v matici "prumerovaMatice" se na pozicích elektrod nahradí hodnoty nulama
a uloží se do "bezZdroju"*)
finalni = bezZdroju+ zdrojovaMatice; (*Sečte se matice "zdrojovaMatice", kde jsou samé nuly až na pozice elektrod s maticí "bezZdroju", kde jsou odstraněny hodnoty na pozicích
elektrod prumerovaMatice všude jinde jsou hodnoty zachovány dle průměrování hodnot*)
];


MatrixPlot[finalni]


(*výkres*)
MatrixPlot[finalni, ColorFunction->Hue]

(*potencialy*)
ListContourPlot[Table[finalni[[i,j]],{i,1,Length[finalni]},{j,1,Length[finalni]}],PerformanceGoal->"Quality",ScalingFunctions->{None,"Reverse"}, Contours->30]

(*Graf průřez celého obrazce*)
sudecislo=(n)/2;
lichecislo=(n)/2+0.5;

Prostredek = If[EvenQ[n],Table[{i -1,finalni[[i,sudecislo]]},{i,1,Length[finalni]}],Table[{i-1,finalni[[i,lichecislo]]},{i,1,Length[finalni]}]];
ListLinePlot[Prostredek]


(*Graf průřez mezi elektridama*)
sudecislo1=(z2-z)/2+z;
lichecislo1=(z2-z)/2+0.5+z;

Prostredek1 = If[EvenQ[(z2-z)],Table[{i,finalni[[i,sudecislo1]]},{i,h,d}],Table[{i,finalni[[i,lichecislo1]]},{i,h,d}]];
ListLinePlot[Prostredek1,AxesOrigin->{h,0}]

Fun[{x_,y_}]:={x*0.1,y};
Prostredek;
Prostredek2=Table[Fun[Prostredek[[i]]],{i,1,Length[Prostredek]}];

ListLinePlot[Prostredek2,PlotRange->All];

finalni//MatrixForm;


(*pravy sloupec*)
(*vnitrek*)
pravovnitrek=Table[{finalni[[j,z2+4]]},{j,h-5,h+3}];

(*vnejsek*)
pravovnejsek=Table[{finalni[[j,z2+6]]},{j,h-5,h+3}];

(*odecet*)
odecet1 = pravovnejsek-pravovnitrek;
odecet1secteno = Total[odecet1];
(*výsledek*)


(*levy sloupec*)
(*vnitrek*)
levovnitrek=Table[{finalni[[j,z-4]]},{j,h-5,h+3}];
(*vnejsek*)
levovnejsek=Table[{finalni[[j,z-6]]},{j,h-5,h+3}];
(*odecet*)
odecet2=levovnejsek-levovnitrek;
odecet2secteno = Total[odecet2];

(*výsledek*)

(*horni řádek*)
(*vnitrek*)
nahorevnitrek=Table[{finalni[[h-3,i]]},{i,z-4,z2+6}];

(*vnejsek*)
nahorevnejsek=Table[{finalni[[h-5,i]]},{i,z-4,z2+6}];

(*odecet*)
odecet3 = nahorevnejsek-nahorevnitrek;
odecet3secteno = Total[odecet3];


(*dolni řádek*)
(*vnitrek*)
dolevnitrek=Table[{finalni[[h+1,i]]},{i,z-4,z2+6}];

(*vnejsek*)
dolevnejsek=Table[{finalni[[h+3,i]]},{i,z-4,z2+6}];

(*odecet*)
odecet4 = dolevnejsek-dolevnitrek;
odecet4secteno = Total[odecet4];

(*výsledek*)
a=(odecet1secteno+odecet2secteno+odecet3secteno+odecet4secteno)*e0/2