【问题标题】:Creating a spiral structure in Python, using hyperbolic tangent在 Python 中创建螺旋结构,使用双曲正切
【发布时间】:2016-03-18 23:11:30
【问题描述】:

我正在尝试在 Python 的二维数组中创建一个螺旋结构,例如星系的旋臂。我做的第一个也是简单的方法是使用一个简单的 log-spiral 函数,如图所示:log spiral function

xy 值由以下人员创建

x,y=meshgrid(arange(0,M=400,1), arange(0,N=400,1))

MN是数组的维度。半径坐标很简单,和上一张图的方程一样,

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)

给我一​​个普通的螺旋结构,就像一个螺旋星系。

另一种方法是使用另一个函数hyperbolic tangent。 在最后一个图像的方程中,除非r 像之前定义的那样,否则所有其他参数都是可调整的数字。

对于这个函数,我在二维数组中制作螺旋结构时遇到了问题。不知道是不是需要用双曲正切在数组中做坐标变换,或者矩阵/数组畸变,来创建螺旋结构。我试过了,但我做不到。

如何使用上述定义制作此螺旋/图像? 感谢您的帮助!

有关该主题的更多信息,请参见参考资料:

  1. 彭,Y. Chien 等人;星系图像的详细结构分解,2002 年
  2. 彭,Y. Chien 等人;星系图像的详细分解。二、超越轴对称模型,2009 年
  3. Peng, Y. Chien,Galfit 用户手册,2003 年
  4. 罗、巴纳比等人; 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

【问题讨论】:

  • 能否请您发布整个代码,以便我们进行测试?
  • 是的,代码在这里。
  • 使用您为双曲函数提供的公式,除了椭圆之外,您不会得到任何东西。这是因为它只使用r 作为变量输入。这意味着具有相同r 值的点将获得相同的颜色。要么你的公式是错误的,要么 r_in 和 r_out 依赖于 r。
  • 顺便说一句;对数函数看起来很酷;)
  • 是的,现在我在想r 是唯一的输入参数。关于r_inr_out,它们只是常数,r_in表示旋臂开始的区域,r_out表示旋臂结束的区域。我参考2,作者没有解释如何在二维数组中使用这个。

标签: python arrays coordinate-transformation spiral


【解决方案1】:

我不确定这是否完全正确,但我认为它很接近,并且产生的结果与论文相似:

def galaxy_model2(q,c,Cb,rout,rin,Oout,a,M,N,Io,ro,n):
    gal_center=(0,0)
    x,y=meshgrid(arange(-M/2,M/2,1), arange(-N/2,N/2,1))
    r=(abs(x-gal_center[1])**(c+2.0)+((abs(y-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
    Or=30-np.log(1.0+r**2.0)+(2.0/p)*np.cos(n2*arctan2(x,y)+k*Or)
    I_exp=exponential_profile(Io,ro,r)
    I_ser=sersic_profile(Io,ro,r,n)
    #galaxy_model_2=0.5*Or
    return Or

唯一的变化是我使用了

Or=30-np.log(1.0+r**2.0)+(2.0/p)*np.cos(n2*arctan2(x,y)+k*Or)

创建一个星系图。

np.cos(n1*arctan2(x,y))

创建此图:

然后我通过添加 k*Or 来旋转它

将它与 n2=3 一起使用,我得到:

【讨论】:

  • 是的,真的是这样,完美运行。我非常感谢@JeD。所以,归根结底,这是一件简单的事情,当你疲倦时尝试做任何事情时,就会发生这种情况,你看不到简单的事情:(。再次感谢:)。
猜你喜欢
  • 2018-12-02
  • 2023-03-28
  • 2016-08-18
  • 2019-11-20
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
相关资源
最近更新 更多