在python中模拟对数螺旋星系

时间:2016-07-25 07:40:46

标签: python numpy random galaxy spiral

我正在使用python模拟对数螺旋星系。使用参数方程,

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

我使用numpy.random获取星星的随机分布。示例代码如下。

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

生成的图像如下所示 spiral galaxy with two arms

我需要什么: 1)恒星应径向分布在螺旋星系中。我只是沿着手臂分布。 2)两臂都应该是蓝色的。在这里,我有一只蓝色的手臂,另一只绿色的手臂。

模拟之后,我需要旋转星系。任何有关这方面的帮助都是值得的。

**编辑:我使用plot(x1, y1,"b*")

获得了蓝色的双臂

2 个答案:

答案 0 :(得分:4)

如果近似值足够好,请在绘制点之前尝试添加一些噪点。对于初学者,我将从normal (Gaussian) distribution开始。例如,这个经过调整的版本:

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

给出此输出:enter image description here 您可能需要稍微调整一下变量以根据需要调整输出。此外,正如评论中所提到的,这不是真正的径向噪声。

答案 1 :(得分:1)

要旋转图像,我会使用旋转矩阵计算星星的新位置,你需要为每颗星做

    SOLineSplit newsplit = SOgraph.splits.Insert();
    SOgraph.splits.Current.LotSerialNbr = line.LotSerialNbr;
    SOgraph.splits.Current.Qty = line.Qty;
    SOgraph.splits.Current.UOM = line.UOM;
    SOgraph.splits.Update(newsplit);

你究竟是什么意思"径向分布"?你能画一个示例图像吗?