2017-06-09 6 views
2

Ich habe herum mit dem diffusen Schlüsselwort gespielt.Netlogo Diffusion Verwirrung

Betrachten Sie die folgende 3x3 Welt, wo es 3 chemische Gradienten in der oberen linken Ecke und keine Chemikalie an anderer Stelle gibt. Außerdem gibt es keinen Umriss an den Kanten.

[3 0 0 ] 
[0 0 0 ] 
[0 0 0 ] 

Wenn ich eine Diffusionsrate von 0,5 haben, würde ich erwarten, dass 3 (gradient) * .5 (diffusion rate)/3 (#neighbors) = .5 des Gradienten würde seine drei Nachbarn gegeben werden. Ich würde auch erwarten, dass der ursprüngliche Patch 1,5 Einheiten übrig hat.

Wenn ich jedoch den diffusen Code ausführe, scheint 3 (gradient) * .5 (diffusion rate)/8 (#neighbors) = .1875 des Farbverlaufs auf die 3 Nachbarn eingestellt zu sein. Der ursprüngliche Patch hat dann 2,4375 verbleibende Einheiten, die nicht 0,5 des ursprünglichen Gradienten sind. Was ist denn hier los? Ist das ein Fehler oder ist mein Verständnis falsch?

Siehe unten:

patches-own [value] 
to setup 
    cp 
    ask patch 0 2 [ set value 3] 
    diffuse value .5 
    ask patch 1 1 [ show value] 
end 

observer: show [value] of patches 
observer: [0.1875 0.1875 0 2.4375 0 0 0 0.1875 0] 
observer> ask patch 0 2 [ show count neighbors] 
(patch 0 2): 3 

Antwort

1

Eine schnelle Bearbeitung auf Ihren Code ist, wenn Sie die linke obere Patch soll einen Wert von 3 haben, müssen Sie fragen Patch 0 2. Sie sind zur Zeit den Boden zu fragen rechtes Pflaster.

Nun kommt Ihr Problem von der Tatsache, dass, wenn Sie diffundieren, es versucht, 1,5 Wert weg verteilt über 8 Patches zu geben, jedes benachbarte Patch 0,1875 geben. Da sich dein Startfeld in einer Ecke befindet, kann es sich nur über 3 Felder verteilen und gibt nur 0,5625 (3 * .1825) ab.

Dies hinterlässt den ursprünglichen Patch mit 2.4375.

Beachten Sie, dass Sie Ihr erwartetes Ergebnis erhalten, wenn Sie der Welt erlauben, sich fortzubewegen.

+0

Dies würde bedeuten, dass die Diffusionsrate eher eine versuchte Diffusion als die tatsächliche Diffusionsmenge ist. Leider muss ich meine eigene Diffusion implementieren, weil ich Rauch durch ein Gebäude modelliere (Rauch kann nicht durch Wände gehen). Ich habe gerade mein Modell mit der eingebauten Diffusion validiert. Außerdem: "Wenn ein Patch weniger als acht Nachbarn hat, erhält jeder Nachbar noch eine achte Aktie; der Patch behält alle übrig gebliebenen Anteile." ccl.northwestern.edu/netlogo/docs/dictionary.html#diffuse Das erscheint mir seltsam. Kennt jemand die Logik hinter dieser Designentscheidung? – mattsap

+0

Ich mag einfache Diffusion hier falsch verstehen, aber vielleicht ist diffuse wie passive Diffusion aufgebaut, wo sich die "Partikel" zufällig bewegen und durch die "Wände" zu den (potentiell acht) umgebenden Flecken diffundieren - das würde die "versuchte Diffusion" erklären ", da Sie im Wesentlichen die Geschwindigkeit festgelegt haben, mit der Ihre Variable durch eine gegebene Wand diffundieren kann. Etwas wie [dieses] (https://imgur.com/a/Kzko5) aber mit acht Seiten? Offensichtlich spucke ich hier nur, aber jetzt bin ich neugierig. –

+2

Wenn Sie an zwei Orten das gleiche Feuer haben - eins mit Wänden und eins ohne - was passiert eigentlich? NetLogo geht davon aus, dass es bleibt, wenn es nicht entkommen kann. Ich bin nicht sicher, dass dies eine schlechte Annahme ist, weil der Rauch (vermutlich) versucht, in alle Richtungen zu gehen. Das heißt, wenn es nach Norden blockiert ist, dreht es sich nicht um und geht nach Süden, es bleibt einfach gegen die Nordwand gedrückt. Natürlich kann Rauch aufgrund von Druckunterschieden besonders sein. – JenB