Ich versuche, eine spiralförmige Struktur, wie Spiralarme einer Galaxie, in einem 2D-Array in Python zu erstellen. Die erste und einfache Art, wie ich es tat, war eine einfache Log-Spiral-Funktion, wie im Bild definiert: log spiral functionErstellen einer Spiralstruktur in Python, mit Hyperbolic Tangens
Die x
und y
Werte von
x,y=meshgrid(arange(0,M=400,1), arange(0,N=400,1))
M
und N
erstellt werden, sind die Dimensionen des Arrays. Der Radius Koordinate ist einfach, wie die Gleichung des letzten Bildes,
r=(abs(x-gal_center[1])**(2.0)+((abs(y-gal_center[0]))/(q))**(2.0))**(0.5)
das Profil Helligkeit von f (r) zu schaffen und ploting
plt.imshow((abs(galaxy_model))**0.2)
gib mir eine commom spiralförmigen Struktur, wie eine Spiral Galaxis.
Eine andere Möglichkeit, dies zu tun, ist die Verwendung einer anderen Funktion, die hyperbolic tangent. In den Gleichungen des letzten Bildes, außer r
, das wie zuvor definiert ist, sind alle anderen Parameter einstellbare Zahlen.
Für diese Funktion habe ich Probleme, eine Spiralstruktur in einem 2D-Array zu machen. Ich weiß nicht, ob ich den hyperbolischen Tangens verwenden muss, um eine Koordinatentransformation im Array oder eine Matrix-/Array-Verzerrung vorzunehmen, um eine Spiralstruktur zu erzeugen. Ich habe es versucht, aber ich konnte es nicht.
Wie kann ich verfahren, um dieses spira/image zu erstellen, mit den oben genannten Definitionen? Danke für die Hilfe!
Weitere Informationen zu diesem Thema, in den Referenzen:
- Peng, Y. Chien et al; Detaillierte strukturelle Zerlegung von Galaxienbildern, 2002
- Peng, Y. Chien et al .; Detaillierte Zerlegung von Galaxy-Bildern. II. Jenseits achsensymmetrischer Modelle, 2009
- Peng, Y. Chien, Galfit Benutzerhandbuch, 2003
- Rowe, Barnaby et al; GALSIM: Die modulare Galaxie Bildsimulation Toolkit 2015
Edited:
Der Code, den ich verwende, wie folgt:
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()
Eine Reihe von Parametern sein:
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
Could Bitte posten Sie den ganzen Code, also dass wir es testen können? – JeD
Ja, der Code ist hier. –
Mit der Formel, die Sie für die hyperbolische Funktion angegeben haben, erhalten Sie nur ein Oval. Dies liegt daran, dass es nur "r" als variable Eingabe verwendet. Dies bedeutet, dass Punkte mit demselben "r" -Wert die gleiche Farbe erhalten. Entweder ist deine Formel falsch oder r_in und r_out sind abhängig von r. – JeD