用python模拟对数螺旋星系

2024-05-11 14:40:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我用过随机数为了得到恒星的随机分布。下面给出了示例代码。在

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*")得到了两个蓝色的手臂


Tags: fromimportplotnppirandomsincos
2条回答

如果近似值足够好,请在绘制点之前尝试添加一些噪波。首先,我会从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 您可能需要稍微调整一下变量,以根据需要调整输出。另外,正如评论中提到的,这不是真正的径向噪声。在

为了旋转图像,我会用一个旋转矩阵来计算恒星的新位置,你必须对每一个恒星这样做

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

你说的“径向分布”到底是什么意思?你能画个例子吗?在

相关问题 更多 >