插值恒星光谱

恒星光谱可以用来测量恒星的温度,金属丰度,表面重力,\mathrm{[\alpha/Fe]},特定元素的丰度等。具体的做法一般是用恒星模板来和观测谱进行匹配,寻找谱线特征最相似的模板。其模板参数即被我们认为是目标光谱的恒星参数。在具体的处理过程中,当然还有旋转致宽、仪器展宽,光谱归一化,视向速度改正等需要考虑。如果先不计较这些琐碎的细节,在进行光谱匹配时,我们需要的是对给定的任意一组恒星参数,我们就可以得到相应的模板光谱。

但是在实际的处理过程中,我们很难“直接”得到任意参数的模板光谱。原因主要是计算上的困难。日常用的恒星模板库主要分为两类:一类是实际观测的模板谱,另一类是建立恒星大气模型,通过求解恒星的辐射转移方程,直接计算得到的理论谱。实际观测的模板库,一般有比如说几千上万条光谱组成,每条谱都提供相应的恒星参数。这些观测模板库主要由一些大型的巡天观测得到。很明显,观测模板库不可能提供任意恒星参数的模板。生成理论谱的代码倒是可以根据合理的恒星参数计算相应的理论谱。但是这类代码一般计算速度很慢,在进行光谱匹配的时候,我们实际上不太可能根据恒星参数实时生成理论谱。

常规的做法是,对温度,金属丰度,表面重力等恒星参数按照一定间隔进行取样,计算相应参数的理论谱,从而得到一个模板网格。如果想得到任意恒星参数的模板,只需要在网格范围内进行多维插值。我之前在GitHub上见有用神经网络来训练模型,完成插值的。但是这样做似乎没有必要。简单的多维插值算法应该足够完成工作。我们需要做的是一个在多维空间里的向量插值。类似在GitHub上看到的一个项目,WDmodel,代码中的插值方法,我们需要首先建立一个N维的模板网格(维度可以包括,温度,金属丰度,\log g\mathrm{[\alpha/Fe]}等),然后直接调用scipy里的插值函数,建立插值模型。输入任意网格参数范围内的恒星参数,就可以返回对应的模板谱。

一个具体的示例如下:

import h5py
import scipy.interpolate as spinterp
import matplotlib.pyplot as plt
import numpy as np

h5name = 'TlustyGrids.hdf5'
grids = h5py.File(h5name, 'r')
grid = grids['default']
wave = grid['wave'].astype(float)[:]
flux = grid['flux'].astype(float)[:]
ggrid = grid['ggrid'].astype(float)[:]
tgrid = grid['tgrid'].astype(float)[:]
lflux = np.log10(flux.T)
print(ggrid)
print(tgrid)
print(wave.shape)
print(lflux.shape)
print(tgrid.shape)
print(ggrid.shape)
model = spinterp.RegularGridInterpolator((tgrid, ggrid), lflux)
teff_expect = 34567
logg_expect = 7.8
flux_expect = model((teff_expect, logg_expect))
arg = (wave > 3000) & (wave < 10000)
nwave = wave[arg]
nflux = flux_expect[arg]
plt.plot(nwave, nflux)
plt.show()

运行结果如下:

[7.  7.5 8.  8.5 9.  9.5]
[16000. 18000. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500.
 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500.
 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500.
 90000.]
(13651,)
(31, 6, 13651)
(31,)
(6,)

Visits: 118

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

*