| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | 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
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |