A diffúzió modelljének megalkotásakor már felmerült az a probléma, hogy a megfigyelt térrész növelésekor a megoldást kivárhatatlanul hosszú idő alatt kapjuk csak meg. Ez a probléma sokkal élesebben vetődik fel akkor, amikor a mozgás, az áramlás bonyolultabb szabályok szerint megy végbe. Ilyen esetekre gondolva dolgozzuk ki a következő – reprezentációs elveiben eltérő – modellt.
A modell: Osszuk fel a vizsgált térrészt azonos méretű cellákra (sejtekre)! Minden egyes sejtre meg fogjuk adni az állapotát (adott időpillanatban mennyi molekulát, energiát, egyéb elemi objektumot tartalmaz). A diszkrét keretmodellre építhetjük a sejtautomata típusú modelleket, az összes sejt párhuzamos (azonos időbeli) állapotváltozását fogjuk megadni.
Minden egyes sejt következő időpillanatbeli állapota függ egyrészt a saját állapotától, másrészt pedig szomszédai, valamilyen környezete állapotától (de a távolhatást nem engedjük meg).
Milyen cellákat tekintsünk szomszédosaknak? A választott időegységtől függően 4 vagy 8 szomszédot veszünk figyelembe, azaz lehetőségeink:
Legyen a négyzet oldalhosszúsága H, egy molekula időegység alatti átlagos úthossza K! Ekkor a négyzet oldalával szomszédos helyre 4*K*(H-K) helyről lehet lépni, míg a sarkával szomszédos helyekre K*K*π helyről. Ha K<<H, akkor ez utóbbi elhanyagolható az előbbi mellett. Ráadásul nem is vettük figyelembe, hogy a sarkok közelségében levő molekulák is nagyobb valószínűséggel lépnek át oldalsó, mint sarki szomszédba. Ebben az esetben tehát elég 4 szomszédot vizsgálni.
Tartalmazza a sejttér régi állapotát az R(N,M) mátrix, az újat pedig az U(N,M)! A modellben nemnegatív (valós) számok fogják azonosítani az egyes sejtek állapotait, illetve -1 fogja jelölni azokat a sejteket, amelyek mintegy falat határoznak meg a sejttérben, azaz nem változhatnak, s rajtuk keresztül a mozgás sem történhet. Célszerű lesz kezdetben az a feltételezés, hogy sejtterünk szélein ilyen fal-sejtek találhatóak.
Ez a modell homogén és izotróp teret feltételez: a diffúzió sebessége helytől és iránytól független.
Az általános algoritmusban a szimulációs lépés a következő elemi lépésekből áll:
Szimulációs_lépés:
U:=R
Ciklus i=1-től N-ig
Ciklus j=1-től M-ig
Ha U(i,j) nem fal akkor Változás(i,j)
Ciklus vége
Ciklus vége
Eljárás vége.
A Változás azt jelenti, hogy a sejttér adott pontjára a környezetből anyag (energia) áramlik. Megadhatjuk az állapotátmenet függvényt, vagy pedig azt az algoritmust, amellyel ezt az átmenetet megvalósítjuk.
Változás(i,j):
Belépés(i,j,i-1,j)
Belépés(i,j,i+1,j)
Belépés(i,j,i,j-1)
Belépés(i,j,i,j+1)
Eljárás vége.
Minden egyes sejtből a teljes anyagmennyiség D-szerese fog kiáramlani 4 szomszédja közül bármelyikbe.
Belépés(i,j,k,l):
Ha U(k,l) nem fal
akkor U(k,l):=U(k,l)-D*R(k,l): U(i,j):=U(i,j)+D*R(k,l)
Eljárás vége.
Az általános esetben a diffúziós együtthatót sejtenként más-más függvénnyel kell számolnunk (D helyett D(x,y)), egyszerűbb esetben ez csak az egyik indextől függ (így pl. D(x,y)=D(y)).
Eredményként – bár lokálisan izotróp a kicserélődés, de az intenzitást tekintve inhomogén – globális anizotrópiát kaphatunk.
A legegyszerűbb módosítás a legbonyolultabb esethez tartozik:
Belépés(i,j,k,l):
Ha U(k,l) nem fal akkor U(k,l):=U(k,l)-D(k,l)*R(k,l)
U(i,j):=U(i,j)+D(k,l)*R(k,l)
Eljárás vége.
Gyakorlatilag többször fordul elő az, amikor a vizsgált tartomány (pl. vízszintes) sávos szerkezetű, és Si adja meg az i. tartomány felső határát. Jelöljük Do*Di-vel az i. tartományban a diffúziós együtthatót!
A valószerűbb esetekben a fenti algoritmusban a szomszédos helyről belépést a következőképpen módosítjuk:
Belépés(i,j,k,l):
i:=1; H:=S(i)
Ciklus amíg H>K
i:=i+1; H:=H+S(i)
Ciklus vége
D:=Do*D(i)
Ha U(k,l) nem fal
akkor U(k,l):=U(k,l)-D*R(k,l); U(i,j):=U(i,j)+D*R(k,l)
Eljárás vége.
Elképzelhető megoldás, hogy ebben az esetben is azt a változatot választjuk, amikor sorokhoz rendelünk diffúziós együtthatókat, s a korábbi, egyszerűbb algoritmust alkalmazhatjuk.
Ilyen szerkezetűek lehetnek például a talajvíz, illetve a talajvízben levő szennyező anyagok mozgásával, terjedésével kapcsolatos modellek.
Ebben a módosításban a molekulák különböző irányokba nem azonos valószínűséggel léphetnek ki. Jelölje Di=Ki+D0 az i. irányba kilépő molekulák számát, ahol a változók:
Például lehetnek az irányfüggő komponensek és a diffúziós együttható a következő értékűek:
Itt a változást leíró eljárást fogjuk módosítani:
Változás(i,j):
Belépés(i,j,i-1,j,K1)
Belépés(i,j,i+1,j,K2)
Belépés(i,j,i,j-1,K3)
Belépés(i,j,i,j+1,K4)
Eljárás vége.
Ekkor a belépés a következő lehet:
Belépés(i,j,k,l,D):
D:=D0+D
Ha U(k,l) nem fal
akkor U(k,l):=U(k,l)-D*R(k,l); U(i,j):=U(i,j)+D*R(k,l)
Eljárás vége.
Ebben a példában a diffúzió sebessége függjön a helytől és az iránytól is! Tehát D=D0*(Di+Ki), ahol Ki jelenti az irányfüggő, Di pedig a helyfüggő komponenst. Értelmezésük megegyezik az előző két modell értelmezésével.
Most a változást és a szomszédos helyről való belépést megvalósító eljárást is módosítjuk.
Változás(i,j):
Belépés(i,j,i-1,j,K1)
Belépés(i,j,i+1,j,K2)
Belépés(i,j,i,j-1,K3)
Belépés(i,j,i,j+1,K4)
Eljárás vége.
Belépés(i,j,k,l,D):
i:=1; H:=S(i)
Ciklus amíg H>K
i:=i+1; H:=H+S(i)
Ciklus vége
D:=Do*D(i)+D
Ha U(k,l) nem fal akkor U(k,l):=U(k,l)-D*R(k,l)
U(i,j):=U(i,j)+D*R(k,l)
Eljárás vége.
Most a helytől függés bonyolultabban érvényesüljön! Minden egyes helynek legyen más a diffúziós együtthatója! A diffúziós együttható függjön az állapottól (koncentrációtól): D:=C*R(x,y)! Ekkor a szomszédos helyről belépés fog változni.
Belépés(k,l):
Ha U(k,l) nem fal akkor U(k,l):=U(k,l)-C*R(k,l)*R(k,l)
U(i,j):=U(k,l)+C*R(k,l)*R(k,l)
Eljárás vége.
Másik lehetőségünk, hogy nem a molekulák számától közvetlenül függ a diffúzió sebessége, hanem a cellák valamilyen állapotjellemzőjétől. Ezt a molekulák számával arányosan tudjuk kiszámolni, majd egy cella molekulaszámával normálhatjuk. Jelölje A(i,j) az (i,j) cella régi állapotjellemzőjét, B(i,j) pedig az újat (még nem normálva).
A szimulációs lépés programján is változtatni kell, a szomszédból való belépés mellett.
Szimulációs lépés:
U:=R
Ciklus i=1-től N-ig
Ciklus j=1-től M-ig
Ha U(i,j) nem fal akkor Változás(i,j)
Ciklus vége
Ciklus vége
Ciklus i=1-től N-ig
Ciklus j=1-től M-ig
Elágazás
U(i,j)>0 esetén A(i,j):=B(i,j)/U(i,j)
U(i,j)=0 esetén A(i,j):=0
Elágazás vége
Ciklus vége
Ciklus vége
Eljárás vége.
Belépés(i,j,k,l):
Ha U(k,l) nem fal akkor U(k,l):=U(k,l)-A(k,l)*R(k,l)
U(i,j):=U(i,j)+A(k,l)*R(k,l)
B(k,l):=B(k,l)-A(k,l)*R(k,l)
B(i,j):=B(i,j)+A(k,l)*R(k,l)
Elágazás vége
Eljárás vége.
Az eddigi zárt modellünket alakítsuk át nyílt modellé, azaz a vizsgált rendszerbe léphessen be anyag, illetve távozhasson is belőle! A be-, illetve a kilépés tetszőleges pontokon végbemehet. A belépési pontokat nevezzük forrásnak, a kilépési pontokat pedig nyelőnek!
Forrás: minden időegységben F mennyiséggel növekszik (kívülről) az értéke.
Nyelő1: minden időegységben Q mennyiséggel csökken az értéke, ha lehet (a rendszeren kívülre távozik)
Nyelő2: minden időegységben értékének R-szeresével csökken az értéke (a rendszeren kívülre távozik)
(Ilyen jelenség pl. kút és a talajvíz, forró pontok - párolgás, ...)
Az algoritmusban a szimulációs lépés a következő lépésekből áll:
Szimulációs lépés:
U:=R
Források kezelése
Ciklus i=1-től N-ig
Ciklus j=1-től M-ig
Ha U(i,j) nem fal akkor Változás(i,j)
Ciklus vége
Ciklus vége
Nyelő1 kezelése; Nyelő2 kezelése
Eljárás vége.
Mindegyik forrás adott mennyiséggel megnöveli a forrás helyén levő anyag mennyiségét. Jelölje Fdb a források számát, F(Fdb) pedig a források adatait: Rekord(x,y,menny)!
Források kezelése:
Ciklus i=1-től Fdb-ig
U(F(i).x,F(i).y):= U(F(i).x,F(i).y)+F(i).menny
Ciklus vége
Eljárás vége.
Az 1-es típusú nyelő adott mennyiséggel csökkenti a nyelő helyén levő anyagmennyiségét, ha lehetséges.
Jelölje Nydb1 a nyelők számát, Ny1(Nydb1) pedig a nyelők adatait a forrásokhoz hasonló struktúrában: Rekord(x,y,menny)!
Nyelő1 kezelése:
Ciklus i=1-től Nydb1-ig
j:=Ny1(i).x; k:=Ny1(i).y
Ha U(j,k)>Ny1(i).menny akkor U(j,k):=U(j,k)-Ny1(i).menny
különben U(j,k):=0
Ciklus vége
Eljárás vége.
A 2-es típusú nyelő adott százalékkal csökkenti a nyelő helyén levő anyag mennyiségét, ha lehetséges.
Jelölje Nydb2 a nyelők számát, Ny2(Nydb2) pedig a nyelők adatait a már szokásos módon: Rekord(x,y,ki)!
Nyelő2_kezelése:
Ciklus i=1-től Nydb2-ig
j:=Ny2(i).x; k:=Ny2(i).y
U(j,k):=U(j,k)*(1-Ny2(i).k)
Ciklus vége
Eljárás vége.
Készült az "Országos koordinációval a pedagógusképzés megújításáért” című TÁMOP-4.1.2.B.2-13/1-2013-0007 pályázat keretében. (ISBN 978-963-284-631-6) |
A tananyag az ELTESCORM keretrendszerrel készült