2016-07-25 42 views
3

Ich simuliere eine logarithmische Spiralgalaxie mit Python. Unter Verwendung der Parametergleichungen,Eine logarithmische Spiralgalaxie in Python simulieren

x= a*exp(b*theta)*cos(theta) und y= a*exp(b*theta)*sin(theta)

benutzte ich numpy.random für die zufällige Verteilung der Sterne zu bekommen. Der Beispielcode ist unten angegeben.

import random 
from math import * 
from pylab import * 
import numpy as np 

n=100000 
a= 1 
b=0.6 
th =np.random.randn(n) 
x= a*exp(b*th)*cos(th) 
y=a*exp(b*th)*sin(th) 
x1 = a*exp(b*(th))*cos(th+ pi) 
y1=a*exp(b*(th))*sin(th + pi) 
plot(x,y,"*") 
plot(x1, y1,"*") 
show() 

Das resultierende Bild wird unter spiral galaxy with two arms

gezeigt Was ich brauche: 1) Sterne sollten radial in der Spiralgalaxie verteilt werden. Ich habe die Verteilung nur entlang der Arme bekommen. 2) Beide Arme sollten blau sein. Hier habe ich einen Arm mit blauer Farbe und andere mit Grün.

Nachdem ich das simuliert habe, muss ich die Galaxie drehen. Jede Hilfe in diesem Zusammenhang wäre erwähnenswert.

** edit: Ich habe beide Arme in blauer Farbe mit plot(x1, y1,"b*")

+0

Wie für die Farbe: 'plot (x1, y1," b * ") wird blaue Sterne geplottet. Wenn Sie nur "*" angeben, ändert sich die Farbe für mehrere Plots. Was die anderen Fragen angeht: Was hast du probiert? Zeig uns deine fehlgeschlagenen Versuche und wir können dir von dort aus helfen. – Ian

+0

Vielen Dank für die Antwort. Es klappt. Eigentlich habe ich keine Ahnung. Ich weiß nicht, wie man die Punkte (Sterne), wie wir sie in einer Galaxie sehen, radial verteilt. @mwormser –

+0

Sie verwenden das falsche Modell - mit diesem Modell werden Sie niemals "Radialrauschen" bekommen. Du könntest versuchen, gaußsches Rauschen zu 'x',' y', 'x1' und' y1' hinzuzufügen, und es wird dir _etwas_ geben. Aber ob das für Ihre Zwecke ausreicht, ist nicht klar. Wenn du versuchst, ein schönes Bild zu machen, dann ist es egal. Wenn Sie versuchen, etwas Astrophysik zu simulieren, dann ist es wahrscheinlich nicht das, was Sie wollen. Vielleicht solltest du versuchen, auf physics.stackexchange zu fragen? – Praveen

Antwort

3

Wenn eine Annäherung gut genug ist, versuchen Sie, die Punkte vor dem Zeichnen etwas zu notieren. Für den Anfang würde ich mit einem normal (Gaussian) distribution beginnen. Zum Beispiel gezwickt diese Version:

import random 
from math import * 
from pylab import * 
import numpy as np 

n=1000 
a=0.5 
b=0.6 
th=np.random.randn(n) 
x=a*exp(b*th)*cos(th) 
y=a*exp(b*th)*sin(th) 
x1=a*exp(b*(th))*cos(th+pi) 
y1=a*exp(b*(th))*sin(th+pi) 

sx=np.random.normal(0, a*0.25, n) 
sy=np.random.normal(0, a*0.25, n) 
plot(x+sy,y+sx,"*") 
plot(x1+sx, y1+sy,"*") 

show() 

gibt diese Ausgabe: enter image description here Sie müssen möglicherweise mit den Variablen ein wenig spielen, um, um die Ausgabe an Ihre Bedürfnisse anpassen. Wie in den Kommentaren erwähnt, ist dies nicht das wahre radiale Rauschen.

+0

kann ich eine solche Verteilung bekommen? @Pikalek https://s32.postimg.org/69f3oliz9/hqdefault.jpg –

+0

potenziell - Ich habe meine Antwort mit Beispielcode & ein Ausgabebild aktualisiert – Pikalek

+0

Vielen Dank @Pikalek. Das ist genau das, was ich brauche. Danke ...... –

1

das Bild zu drehen, würde ich die neuen Positionen der Sterne berechnen eine Rotationsmatrix, die Sie für jeden Stern zu tun haben, wie

R = [ [ np.cos(phi), -np.sin(phi) ], [ np.sin(phi), np.cos(phi) ] ] 
[x_new, y_new] = np.dot([x_old, y_old], R) 

Was genau meinen Sie mit "radial verteilt"? Könnten Sie ein Beispielbild zeichnen?

+0

Sieh dieses Galaxienbild .. Ich möchte eine Verteilung wie diese. Was ich bekomme, ist nur am Arm. @ RobertAlpha https://s32.postimg.org/69f3oliz9/hqdefault.jpg –