(*Vstupy*)
nula = 0;

(*stineni - kraje matice*)
stineni1=0.0000000001;
stineni2=0.0000000001;
stineni3=0.0000000001;
stineni4=0.0000000001;

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

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

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

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

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

(*potenciál na elektrodách*)
potencialhorni = 30;(*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]}],Exclusions->None; 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}]

n= 22; (*rozmer matice vyslednych potencialu*)
leva=0; (*V - potenciál na levé elektrodě*)
horni=20.;(*V - potenciál na horní elektrodě*)
prava=0;(*V - potenciál na pravé elektrodě*)
dolni=0.;(*V - potenciál na dolní elektrodě*)
fce[x_]:=x;
nulovamatice = 0; 
a = 5;

(*tvorba matice, která plyne z řešení rovnic*)
ctyrky=NestList[fce,4,(n^2)-1];
jednicky=NestList[fce,-1,(n^2)-n-1];
ctyrkova=DiagonalMatrix[ctyrky];
hornijednicky=DiagonalMatrix[jednicky,n];
dolnijednicky=DiagonalMatrix[jednicky,-n];
diagonaly=ctyrkova+hornijednicky+dolnijednicky; (*matice, kde jsou vyřešene -1 dole a nahore a 4 diagonála*)
(*i jsou řádky, j sloupce, n rozmer finalni matice*)

pocetjednicek=0;
For[i=1,i≤(n^2),i++,
	If[i==1||i==2,j1=1,j1=i-1];
		For[j=j1,j≤1+i,j++,(*To mi projíždí jen ty 3 čísla a posunuje se to*)
	If[((i==j+1)||(i==j-1))&&((pocetjednicek≠(n+n-2))),{diagonaly[[i,j]]:=-1,pocetjednicek++},If[i==j+1,pocetjednicek=0](*neni li splnena ani jedno if preskočí to a jede se cyklus odznova*)
]
]
]
inverzni=Inverse[diagonaly];(*tvorba inverzní matice*)
levahorni=leva+horni;
pravahorni=prava+ horni;
levadolni = leva + dolni;
pravadolni=dolni+prava;

nulova=Table[nulovamatice{i,n*n},{j,1}];
nulova//MatrixForm;

prvni=Table[nulovamatice,{i,n*n},{j,1}];
prvni[[{1},{1}]]={{levahorni}};prvni//MatrixForm;

druha=Table[nulovamatice,{i,n*n},{j,1}];
For[i=2,i<(n),i++,druha[[i,1]]= horni];
druha//MatrixForm;

treti=Table[nulovamatice,{i,n*n},{j,1}];
treti[[{n},{1}]]={{pravahorni}};treti//MatrixForm;

ctvrta=Table[nulovamatice,{i,n*n},{j,1}];
For[i= 1,i<n-1,i++,
	For[ j =1,j<n+1, j++,(*5*)
		If[j==1, ctvrta[[(j)+(n)+(i-1)n,1]]=leva];
		If[j==n, ctvrta[[(2n)+(i-1)n,1]]=prava]

]
]
ctvrta//MatrixForm;

pata=Table[nulovamatice,{i,n*n},{j,1}];
pata[[{n*n-n+1},{1}]]={{levadolni}};pata//MatrixForm;

sesta=Table[nulovamatice,{i,n*n},{j,1}];
sesta[[{n*n},{1}]]={{pravadolni}};sesta//MatrixForm;

sedma=Table[nulovamatice,{i,n*n},{j,1}];
For[i=(n*n-n+2),i<(n*n),i++,sedma[[i,1]]= dolni];
sedma//MatrixForm;

strany = treti+prvni+pata+sesta + druha + sedma + ctvrta;
strany//MatrixForm;
potencialy=inverzni.strany;

finalni=IdentityMatrix[n+2]; (*TA dvojka RPOTOZE STRANY*)
radek=1;
For[i=1,i≤n+2,i++,
For[j=1,j≤n+2,j++,
If[i==1,finalni[[1,j]]=horni];
If[i==n+2,finalni[[n+2,j]]:=dolni];
If[j==1,finalni[[i,1]]:=leva];
If[j==n+2,finalni[[i,n+2]]:=prava];

If[1<i<n+2&&1<j<n+2,finalni[[i,j]]=potencialy[[radek++,1]],];
]
]
finalni[[1,1]]:=((horni+prava)/4);
finalni[[n+2,1]]:=((dolni+prava)/4);
finalni[[1,n+2]]:=((horni+leva)/4);
finalni[[n+2,n+2]]:=((dolni+leva)/4);
(*:= odkaz*)
potencialy//MatrixForm;
(*tohle jsou vysledne potencialy ktere vniknou jako inverzni.strany*)
finalni//MatrixForm;
(*v te matici finalni jsou zatim automaticky vypsane strany a krizky v rozich a nejak mi tam neslo vlozit ty jednotlive potencialy, kdyz to necham vyplnit vsude tak budou vsude jenom ten posledni potencial, jeste jsem to nedoresila*)

(*Ekvipotenciály*)
(*f=Table[{i,j,finalni[[i,j]]},{i,1,Length[finalni]},{j,1,Length[finalni]}];*)
ListContourPlot[Table[finalni[[i,j]],{i,1,Length[finalni]},{j,1,Length[finalni]}]]

(*výčet prvků odprostřed*)
sudecislo=(n+2)/2;
lichecislo=(n+2)/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]}]];

ListPlot[Prostredek]
ListLinePlot[Prostredek]
MatrixPlot[finalni]
a





5
Prostredek