私は銀河のらせん状の腕のようなスパイラル構造をPythonの2D配列に作成しようとしています。私はそれをやった最初かつ簡単な方法は、画像のように定義された、シンプルなログスパイラル機能を使用していました:log spiral function双曲線正接を使用してPythonでスパイラル構造を作成する
x
とy
値は
x,y=meshgrid(arange(0,M=400,1), arange(0,N=400,1))
M
とN
によって作成された寸法です配列の半径座標は私に螺旋状commom螺旋構造を与える
r=(abs(x-gal_center[1])**(2.0)+((abs(y-gal_center[0]))/(q))**(2.0))**(0.5)
は、Fのプロファイル明るさ(R)を作成し、
plt.imshow((abs(galaxy_model))**0.2)
をploting、最後の画像の式のように、単純です銀河。
別の方法として、hyperbolic tangentを使用することもできます。 最後の画像の方程式では、前に定義したr
を除き、他のすべてのパラメータは調整可能な数値です。
この機能のために、2D配列で螺旋構造を作るのに問題があります。双曲線正接を使用して配列内の座標変換や行列/配列の歪みを作成して螺旋構造を作成する必要があるかどうかはわかりません。私はそれを試みたが、できなかった。
上記の定義を使用して、このspira/imageを作成する手順を教えてください。 助けてくれてありがとう!参考とする対象約
詳細情報:
- 鵬、Y. Chienら。銀河画像の詳細な構造分解、2002年
- Peng、Y. Chien et al;ギャラクシー画像の詳細な分解。 II。 Axisymmetric Models、2009を超えて。
- Peng、Y. Chien、Galfitユーザーズマニュアル、2003
- Rowe、Barnaby et al; GALSIM:モジュラー銀河の画像シミュレーションツールキット、2015
編集:次のように
私が使用しているコードは次のとおりです。パラメータの
from __future__ import division
import numpy as np
from numpy import*
import matplotlib.pyplot as pyplot
import scipy as sp
from scipy import*
import pylab as pl
from pylab import*
import math
from math import*
import pyfits as pf
from pyfits import*
def exponential_profile(Io,ro,r):
Iexp=0.5*Io*np.exp(-r/ro)
return Iexp
def sersic_profile(Io,ro,r,n):
Iser=Io*np.exp(-(r/ro)**(1/n))
return Iser
def galaxy_model1(q,c,gal_center,Io,ro,n,M,N,xi,p,n1,n2,s1,s2,k):
x,y=meshgrid(arange(-M/2,M/2,1), arange(-N/2,N/2,1))
r=(abs(x-0*gal_center[1])**(c+2.0)+((abs(y-0*gal_center[0]))/(q))**(c+2.0))**(1.0/(c+2.0))
power=2.0
fr=(30-xi*np.log(1.0+r**power)+(1.0/p)*np.cos(n1*arctan2(x,y)+k*np.log(s1+r**power))+(1.0/p)*np.cos(n2*arctan2(x,y)+k*np.log(s2+r**power)) )
I_exp=exponential_profile(Io,ro,r)
I_ser=sersic_profile(Io,ro,r,n)
galaxy_model_1=0.1*I_exp+0.1*I_ser+0.5*fr
return galaxy_model_1
def galaxy_model2(q,c,Cb,rout,rin,Oout,a,M,N,Io,ro,n):
gal_center=(M/2,N/2)
x,y=meshgrid(arange(0,M,1), arange(0,N,1))
r=(abs(x-0*gal_center[1])**(c+2.0)+((abs(y-0*gal_center[0]))/(q))**(c+2.0))**(1.0/(c+2.0))
A=2*Cb/(abs(Oout)+Cb)-1.00001
B=(2-np.arctanh(A))*((rout)/(rout-rin))
T=0.5*(np.tanh(B*(r/rout-1)+2)+1)
Or=Oout*T*(0.5*(r/rout+1))**a
I_exp=exponential_profile(Io,ro,r)
I_ser=sersic_profile(Io,ro,r,n)
galaxy_model_2=0.1*I_exp+0.1*I_ser+0.5*Or
return galaxy_model_2
galaxy_model_1=galaxy_model1(q,c,(M/2,N/2),Io,ro,n,M,N,xi,p,n1,n2,s1,s2,k)
galaxy_model_2=galaxy_model2(q,c,Cb,rout,rin,Oout,a,M,N,Io,ro,n)
fig=plt.figure()
ax1=fig.add_subplot(121)
ax1.imshow((abs(galaxy_model_1))**0.2)
pf.writeto('gal_1.fits', galaxy_model_1, clobber=1)
ax2=fig.add_subplot(122, axisbg='white')
ax2.imshow((abs(galaxy_model_2))**0.2)
plt.show()
セットが使用できます
M=400
N=400
q=0.8
c=0.0
Io=100.0
ro=10.0
n=3.0
xi=2.0
p=1.7
n1=3.0
n2=3.0
s1=0.05
s2=0.5
k=3.0
Cb=0.23
rout=100.0
rin=10.0
Oout=pi/2
a=0.0
はでしたあなたはコード全体を投稿してください私たちはそれをテストすることができますか? – JeD
はい、コードはこちらです。 –
双曲線関数に指定した数式を使用して楕円形以外のものを得ることはできません。これは、可変入力として 'r'しか使用しないためです。つまり、同じ 'r'値を持つ点は同じ色になります。数式が間違っているか、r_inとr_outがrに依存しています。 – JeD