|
| N-body-optimering Fra : Joe Taicoon |
Dato : 19-03-09 09:39 |
|
Hvis man har n objekter som man vil simulere under gensidig tyngdpåvirkning
så er det O(n^2) hvis man naivt beregner kraft mellem hvert par af objekter.
Ville en helt banal optimering ikke være at inddele ens rum i et oct-tree og
i hver celle beregne den gennemsnitlige position (vægtet efter masse) og
samlede masse for alle objekter i cellen og så herefter behandle alle
objekterne i en celle som eet objekt med denne fælles masse og position?
Hvis man helt simpelt har delt sit rum op i to dele hvor der er 100 objekter
i hver halvdel, så er den naive metode (100^2)/2 indbyrdes beregninger mens
den simple optimering kræver at man to gange beregner massevægtet position
og samlet masse for de to rum. Derefter kan man for hver af de 100 objekter
i et rum regne tiltrækning op mod gennemsnitsobjektet i det andet rum. Det
er 200 indbyrdes beregninger af kraft. Det som alternativ til de 5000 fra
før.
Min pointe er at man jo generelt kan tage en mængde partikler, eksempelvis
alle partikler i Jorden, og betragte deres samlede indflydelse som kommende
fra een partikel der er gennemsnittet af de andre og har deres samlede
masse... så længe man ikke er under Jordens overflade. Med
rumopdelingesoptimeringen er man jo også garanteret at man ikke er inde i
det andet rum og dermed burde der ikke være problemer.
Hvis man tager et 2d-eksempel og laver en quad-tree, så vil man for hvert
objekt i et rum kun skulle beregne effekt fra eet objekt i hvert af de andre
tre rum. Hver rum er så yderligere opdelt i fire rum som kan behandles
tilsvarende.
Jeg er ret sikker på at der ingen problemer er, og at metoden vil være
effektiv, men det undrer mig lidt at jeg ikke er stødt på en beskrivelse af
den andetsteds da den er så simpel og alligevel effektiv....?
| |
jenspolsen@hotmail.c~ (19-03-2009)
| Kommentar Fra : jenspolsen@hotmail.c~ |
Dato : 19-03-09 06:55 |
|
On 19 Mar., 09:38, "Joe Taicoon" <ask.if....@need.it> wrote:
> Hvis man har n objekter som man vil simulere under gensidig tyngdpåvirkning
> så er det O(n^2) hvis man naivt beregner kraft mellem hvert par af objekter.
> Ville en helt banal optimering ikke være at inddele ens rum i et oct-tree og
> i hver celle beregne den gennemsnitlige position (vægtet efter masse) og
> samlede masse for alle objekter i cellen og så herefter behandle alle
> objekterne i en celle som eet objekt med denne fælles masse og position?
Det er det der hedder at beregne massemidtpunktet. Og det er
ligegyldigt om de objekter du beregner massemidtpunktet for befinder
sig tæt sammen i rummet (i samme celle med dit udtryk), da deres
tyngepåvirkning af andre objekter vil være som var deres totale masse
samlet i massemidtpunktet.
> Hvis man helt simpelt har delt sit rum op i to dele hvor der er 100 objekter
> i hver halvdel, så er den naive metode (100^2)/2 indbyrdes beregninger mens
> den simple optimering kræver at man to gange beregner massevægtet position
> og samlet masse for de to rum. Derefter kan man for hver af de 100 objekter
> i et rum regne tiltrækning op mod gennemsnitsobjektet i det andet rum. Det
> er 200 indbyrdes beregninger af kraft. Det som alternativ til de 5000 fra
> før.
Så har du bare ikke medregnet effekten af de 99 objekter der befinder
sig tættest på (i samme rum med dit udtryk). Og da massetiltrækningen
aftager med kvadratet på afstanden, så er påvirkningen af de tætteste
objekter langt størrerer.
Du kan derimod godt beregne hvordan massemidtpunktet af hver af de to
objektsamlinger på 100 objekter påvirker hinanden ved bare 2
beregninger. Men det er jo ikke hvad du er interesseret i.
> Min pointe er at man jo generelt kan tage en mængde partikler, eksempelvis
> alle partikler i Jorden, og betragte deres samlede indflydelse som kommende
> fra een partikel der er gennemsnittet af de andre og har deres samlede
> masse... så længe man ikke er under Jordens overflade.
Også hvis man er under jorden overflade. Som tidligere nævnt
partiklernes tyngepåvirkning af andre objekter vil være som var deres
totale masse samlet i massemidtpunktet.
> Med
> rumopdelingesoptimeringen er man jo også garanteret at man ikke er inde i
> det andet rum og dermed burde der ikke være problemer.
Som tidligere forklaret er din rumopdeling uden betydning.
> Hvis man tager et 2d-eksempel og laver en quad-tree, så vil man for hvert
> objekt i et rum kun skulle beregne effekt fra eet objekt i hvert af de andre
> tre rum. Hver rum er så yderligere opdelt i fire rum som kan behandles
> tilsvarende.
Hvorfor ikke bare beregne massemidtpunktet for alle objekterne og så
se hvordan dette påvirker hvert objekt. Det må vel give det korrekte
resultat.
J.O.
| |
Joe Taicoon (19-03-2009)
| Kommentar Fra : Joe Taicoon |
Dato : 19-03-09 14:20 |
|
>Så har du bare ikke medregnet effekten af de 99 objekter der befinder
>sig tættest på (i samme rum med dit udtryk). Og da massetiltrækningen
>aftager med kvadratet på afstanden, så er påvirkningen af de tætteste
>objekter langt størrerer.
Det fik jeg vidst ikke formuleret ordentligt. Meningen er naturligvis at for
hver af de 100 obekter i eet rum at regne tiltrækning mellem den og de andre
100 partikler i verden: 1 i det andet rum og 99 i sin eget.
>Også hvis man er under jorden overflade. Som tidligere nævnt
>partiklernes tyngepåvirkning af andre objekter vil være som var deres
>totale masse samlet i massemidtpunktet.
Det er så ikke korrekt, da man under Jordens overflade begynder at have
partikler som træker væk fra massemidtpunktet og dermed bidrager negativt.
Man oplever da heller ikke uendelig tynderaft i jordens centrum, men istedet
0.
| |
MAX I MUS (19-03-2009)
| Kommentar Fra : MAX I MUS |
Dato : 19-03-09 07:01 |
|
On 19 Mar., 09:38, "Joe Taicoon" <ask.if....@need.it> wrote:
> Hvis man har n objekter som man vil simulere under gensidig tyngdpåvirkning
> så er det O(n^2) hvis man naivt beregner kraft mellem hvert par af objekter.
> Ville en helt banal optimering ikke være at inddele ens rum i et oct-tree og
> i hver celle beregne den gennemsnitlige position (vægtet efter masse) og
> samlede masse for alle objekter i cellen og så herefter behandle alle
> objekterne i en celle som eet objekt med denne fælles masse og position?
Er det så banalt? Men det er i hvert fald en velkendt idé. Den første
beskrivelse af det i litteraturen er så vidt jeg ved fra 1986:
"A Hierarchical O(N log N) Force Calculation Algorithm", Josh Barnes &
Piet Hut, 1986. Nature 324, 446.
> Jeg er ret sikker på at der ingen problemer er, og at metoden vil være
> effektiv, men det undrer mig lidt at jeg ikke er stødt på en beskrivelse af
> den andetsteds da den er så simpel og alligevel effektiv....?
Det undrer mig også, at du ikke kan finde masser af referencer til
"tree code n-body" med en hurtig googlesøgning. Det kunne jeg nemt.
Hvis du med "ingen problemer" mener, at metoden er eksakt, så er det
forkert. Det er en approximation at erstatte kraften fra N partikler i
en kasse med kraften fra 1 partikel placeret i massemidtpunktet.
Med venlig hilsen Sven.
| |
Joe Taicoon (19-03-2009)
| Kommentar Fra : Joe Taicoon |
Dato : 19-03-09 14:26 |
|
>Hvis du med "ingen problemer" mener, at metoden er eksakt, så er det
>forkert. Det er en approximation at erstatte kraften fra N partikler i
>en kasse med kraften fra 1 partikel placeret i massemidtpunktet.
Ja, det bemærkede jeg desværre også senere. Selv at erstatte kraften fra to
partikler med den fra deres midpunkt med dobbelt masse er forkert. Jo mindre
ens afstand til den ene partikel i forhold til deres indbyrdes afstand, jo
mere forkert.
Det undrede mig også i farten at man skulle kunne gøre det for en
ikke-lineær kraft, men jeg har altid gået rundt med troen på at hvis man tog
alle partikler i Jorden og trykede dem ind til eet punkt i Jordens midpunkt,
så ville det ikke påvirke kresende satelleiter... det kan jeg nu se at det
bestemt vil. :-/
Nå, man kan jo beregne en grænse for fejlen for et givent rum, og så bare
rekursivt opdele når afstanden til rummet er for lille i forhold til rummets
størelse så man definerer en maksimal fejl.
Hvad angår søgeord på tree og n-body, så har jeg læst løst og fast om emnet
nu og da og er aldrig stødt på det. Så får jeg selv tanken, men får ikke
samtidigt konstrueret nogle søgeord.
| |
Torben Ægidius Mogen~ (19-03-2009)
| Kommentar Fra : Torben Ægidius Mogen~ |
Dato : 19-03-09 16:28 |
|
"Joe Taicoon" <ask.if.you@need.it> writes:
> Hvis man har n objekter som man vil simulere under gensidig
> tyngdpåvirkning så er det O(n^2) hvis man naivt beregner kraft mellem
> hvert par af objekter.
> Ville en helt banal optimering ikke være at inddele ens rum i et
> oct-tree og i hver celle beregne den gennemsnitlige position (vægtet
> efter masse) og samlede masse for alle objekter i cellen og så
> herefter behandle alle objekterne i en celle som eet objekt med denne
> fælles masse og position?
Jo, det kan man sagtens.
> Jeg er ret sikker på at der ingen problemer er, og at metoden vil være
> effektiv, men det undrer mig lidt at jeg ikke er stødt på en
> beskrivelse af den andetsteds da den er så simpel og alligevel
> effektiv....?
En lignende metode er beskrevet i artiklen
http://scitation.aip.org/getabs/servlet/GetabsServlet?prog=normal&id=SJOCE3000006000001000085000001&idtype=cvips&gifs=yes
Den er desværre ikke gratis.
Torben
| |
Joe Taicoon (19-03-2009)
| Kommentar Fra : Joe Taicoon |
Dato : 19-03-09 20:01 |
| | |
Niels L. Ellegaard (21-03-2009)
| Kommentar Fra : Niels L. Ellegaard |
Dato : 21-03-09 19:21 |
|
"Joe Taicoon" <ask.if.you@need.it> writes:
> Hvis man helt simpelt har delt sit rum op i to dele hvor der er 100
> objekter i hver halvdel, så er den naive metode (100^2)/2 indbyrdes
> beregninger mens den simple optimering kræver at man to gange beregner
> massevægtet position og samlet masse for de to rum. Derefter kan man
> for hver af de 100 objekter i et rum regne tiltrækning op mod
> gennemsnitsobjektet i det andet rum. Det er 200 indbyrdes beregninger
> af kraft. Det som alternativ til de 5000 fra før.
Hvis man vil løse Newtons Lov for et system af ioner, så kan man løbe
ind i lignende problem. De elektriske kræfter mellem to modsat ladede
ioner følger samme lov som massetrætrækningen mellem to partikler, så
hvis man vil simulerer et stort system af ioner, så er man nødt til at
tage højde for en masse par af ioner. (Til sammenligning er de
almindelige van der Waals kræfter ret kortrækkende)
I sådan nogen simulationer bruger man often en metode der hedder Ewald
summation. I korte træk går metoden (så vidt jeg husker) ud på at
tilnærme ladningstætheden men en Fourierrække.
http://en.wikipedia.org/wiki/Ewald_summation
Jeg ved ikke om man kan anvende noget der ligner Ewald summation på de
systemer som du tænkte på. Det største problem er vist at Ewald
summation kræver periodiske randbetingelser.
Niels
| |
Torben Ægidius Mogen~ (24-03-2009)
| Kommentar Fra : Torben Ægidius Mogen~ |
Dato : 24-03-09 10:41 |
|
"Joe Taicoon" <ask.if.you@need.it> writes:
> Hvis man har n objekter som man vil simulere under gensidig
> tyngdpåvirkning så er det O(n^2) hvis man naivt beregner kraft mellem
> hvert par af objekter.
> Ville en helt banal optimering ikke være at inddele ens rum i et
> oct-tree og i hver celle beregne den gennemsnitlige position (vægtet
> efter masse) og samlede masse for alle objekter i cellen og så
> herefter behandle alle objekterne i en celle som eet objekt med denne
> fælles masse og position?
Jeg nævnte tidligere Appel's artikel, men da den ikke er nem
tilgængelig, vil jeg lige opsummere metoden. Det er efter
hukommelsen, så nogle detaljer kan vere forkerte.
1. Det antages, at alle objekter er kugleformede, så massen kan
betragtes som værende i et punkt.
2. Sæt alle objekter ind i en træstruktur, sådan at objekter tæt ved
hinanden i rummet er tæt på hinanden i træet. Det kan evt. gøres
ved en rekursiv underopdeling af rummet i stil med octtrees.
3. Hver bladknude har koordinater for massen, massens størrelse og en
hastighedsvektor, samt et felt, hvor man kan indsætte
accelerationsvektoren, når den findes.
4. Indre knuder gives en samlet masse, et massemidtpunkt, en radius
samt et felt, hvor den samlede acceleration på undertræet kan
indsættes.
En finæsse er, at koordinater og hastigheder af objekter er relative
til forældreknudens position og hastighed. Dermed kan man flytte et
helt undertræ blot ved at flytte rodknuden af træet.
Algoritmen for beregning af acceleration af hvert objekt er nu:
accel(T1,P1,T2,P2) {
if distance(P1,P2) > k*(radius(T1)+radius(T2))
then {
acceleration(T1) += vector(P1,P2)*mass(T2)*G/distance(P1,P2)^2;
acceleration(T2) += vector(P1,P2)*mass(T1)*G/distance(P1,P2)^2
else if radius(T1) > radius(T2)
then let (T11,T12) = subtrees(T1) in {
accel(T11,P1+position(T11),T2,P2);
accel(T12,P1+position(T12),T2,P2)
}
else let (T21,T22) = subtrees(T2) in {
accel(T1,P1,T21,P2+position(T21));
accel(T1,P1,T22,P2+position(T22))
}
Inden dette gennemløb er acceleration(Ti) sat til 0 for alle
undertræer Ti. Det initielle kald er accel(T,P0,T,P0), hvor T er hele
træet og P0 er positionen af rodknuden. Da alle positioner er
relative, findes den faktiske position ved at summere positionerne fra
rodnkuden ned til den aktuelle position.
k er en konstant, der bestemmer nøjagtigheden af beregningen. Hvis k
er stor, er beregningen mere præcis, men tidsforbruget er større (da
man laver flere underopdelinger). G er gravtitionskonstanten.
Nu laves et gennemløb, hvor man flytter alle objekter:
move(T) {
position(T) += acceleration(T);
if T is not a root node
then let (T1,T2) = subtrees(T) in {
move(T1);
move(T2)
}
Efterhånden bliver træet mindre og mindre optimalt, da knuder, der før
var tæt på hinanden, kan ende med at være langt fra hinanden. En
mulighed er at genopbygge træet efter N gennemløb, men Appel foreslår,
at man i første gennemløb tilføjer en test:
Hvis T1 er en bladknude og radius(T2) > distance(P1,P2), så marker T1
til at flyttes over som undertræ til T2. Flytningen sker efter
move-fasen, og knuder over T1 og T2 får genberegnet deres position,
masse, radius og hastighed.
Appel angiver i artiklen køretiden til O(n*log(n)), men en senere
analyse viser, at køretiden faktisk er O(n), hvor konstantfaktoren
afhænger (ikke-lineært) af k.
Torben
| |
|
|