0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

銀河団解析でよく見るβ-modelを、Pythonでいろいろ描いてみる

0
Posted at

はじめに

銀河団のX線画像を触り始めると、かなり早い段階でβ-modelというものが出てきます。

自分はこれまで銀河団の解析をほとんどやったことがなく、β-modelも名前を知っている程度でした。

式だけ見ていてもいまいち形の感覚がつかめないので、今回は細かい導出はいったん置いて、パラメータをいろいろ変えながら2次元で描いてみます。

ほぼ自分用のメモです。

今回のコードはGoogle Colabにも置いておきます。

Google Colabで実行する

今回描くβ-model

β-modelを調べると、まず銀河団ガスの3次元密度分布として、

\rho(r)=\rho_0
\left[1+\left(\frac{r}{r_c}\right)^2\right]^{-3\beta/2}

という式が出てきます。

一方、X線画像の表面輝度をfitするときには、

S_X(R)=S_0
\left[1+\left(\frac{R}{r_c}\right)^2\right]^{-3\beta+1/2}+B

という形をよく使います。

前者は3次元のガス密度、後者はX線で見える2次元の表面輝度です。

X線放射率がガス密度の2乗に比例すると近似し、視線方向に積分すると後者の指数が出てきます。ここでは温度などの半径依存性は無視しています。

今回は後者の2次元表面輝度モデルを描きます。

形だけを見たいので、

S_0=1,\qquad B=0

に固定しておきます。

Pythonで描いてみる

必要なのは numpy と matplotlib だけです。

まずはモデルと描画用の関数をまとめて定義します。

後で楕円も描きたいので、少し一般化しておきます。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm

# 座標
x = np.linspace(-200, 200, 500)
y = np.linspace(-200, 200, 500)
X, Y = np.meshgrid(x, y)

# 基準パラメータ
base = dict(S0=1.0, rc=30.0, beta=0.6, q=1.0, theta=0.0, B=0.0)

def beta_model(X, Y, S0=1, rc=30, beta=0.6, q=1, theta=0, B=0):
    t = np.deg2rad(theta)
    u = X * np.cos(t) + Y * np.sin(t)
    v = -X * np.sin(t) + Y * np.cos(t)
    R2 = u**2 + (v / q)**2
    return S0 * (1 + R2 / rc**2)**(-3*beta + 0.5) + B

def plot_grid(cases, ncols=4, filename=None):
    ncols = min(ncols, len(cases))
    nrows = int(np.ceil(len(cases) / ncols))

    fig, axes = plt.subplots(
        nrows, ncols,
        figsize=(3.5*ncols, 3.5*nrows),
        layout="constrained",
        squeeze=False,
    )

    for ax, (title, params) in zip(axes.flat, cases):
        S = beta_model(X, Y, **{**base, **params})

        im = ax.imshow(
            S, origin="lower", extent=[-200, 200, -200, 200],
            cmap="viridis", norm=LogNorm(vmin=1e-4, vmax=1),
        )
        ax.set_title(title)
        ax.set_aspect("equal")
        ax.set_xlabel("x")
        ax.set_ylabel("y")

    for ax in list(axes.flat)[len(cases):]:
        ax.set_visible(False)

    fig.colorbar(
        im, ax=list(axes.flat)[:len(cases)],
        label="Surface brightness (a.u.)", shrink=0.8,
    )

    if filename:
        fig.savefig(filename, dpi=180, bbox_inches="tight")

    plt.show()

以降は plot_grid() にパラメータを渡して描いていきます。

比較しやすいように、座標範囲とカラースケールは統一しています。

まずは1枚

とりあえず、

r_c=30,\qquad \beta=0.6

として描いてみます。

plot_grid(
    [(r"$r_c=30,\ \beta=0.6$", {})],
    filename="beta_model_basic.png",
)

image.png

中心が明るく、外側に向かって滑らかに暗くなりました。

外側まで見やすくするため、カラースケールは対数表示にしています。

βを変えてみる

まずは $\beta$ を変えてみます。

plot_grid(
    [(rf"$\beta={b}$", {"beta": b}) for b in [0.4, 0.6, 0.8, 1.0]],
    filename="beta_dependence.png",
)

image.png

$\beta$ が小さいと外側まで明るさが残り、大きくすると急激に暗くなります。

実際、$R\gg r_c$ では、

S_X(R)\propto R^{-6\beta+1}

となるので、外側の落ち方に効いていることが分かります。

core radiusを変えてみる

次は $r_c$ です。

plot_grid(
    [(rf"$r_c={r}$", {"rc": r}) for r in [10, 20, 40, 80]],
    filename="rc_dependence.png",
)

image.png

$r_c$ を大きくすると、中心の明るい領域が広がります。

$\beta$ を小さくした場合も画像全体が広がったように見えますが、少し違うようです。

両方をまとめて変えてみます。

$r_c$ と $\beta$ を同時に変える

$r_c$ と $\beta$ をそれぞれ3通りずつ変えて、3×3で並べます。

plot_grid(
    [
        (rf"$r_c={r},\ \beta={b}$", {"rc": r, "beta": b})
        for r in [15, 30, 60]
        for b in [0.4, 0.6, 0.8]
    ],
    ncols=3,
    filename="rc_beta_grid.png",
)

image.png

縦方向に $r_c$、横方向に $\beta$ を変えています。

こうして並べると、$r_c$ はcoreの広がり、$\beta$ は外側の落ち方に影響している様子が分かりやすいです。

もちろん両方とも分布全体の形に影響するので、実際のfitでは相関が生じることもあります。

個人的には、この9枚を並べた図が一番分かりやすかったです。

楕円にもしてみる

実際の銀河団は完全な円とは限らないので、楕円にもしてみます。

今回は2次元の半径を、

R^2=u^2+\left(\frac{v}{q}\right)^2

として、

q=\frac{b}{a}

を軸比として使います。

$q=1$ なら円で、小さくすると細長くなります。

ここでは単純に2次元のモデルを楕円に拡張しており、3次元の楕円体を投影しているわけではありません。

plot_grid(
    [(rf"$q={q}$", {"q": q}) for q in [1.0, 0.8, 0.6, 0.4]],
    filename="q_dependence.png",
)

image.png

$q$ を小さくするほど、楕円が細長くなりました。

向きも変えてみる

最後に楕円を回転させてみます。

$q=0.5$ に固定して、角度だけ変えます。

plot_grid(
    [
        (rf"$\theta={t}^\circ$", {"q": 0.5, "theta": t})
        for t in [0, 30, 60, 90]
    ],
    filename="theta_dependence.png",
)

image.png

ちゃんと回りました。

今回の $\theta$ は単純な $x-y$ 平面上の回転角です。実際の天体画像でposition angleを使う場合は、座標軸や角度の定義を合わせる必要があります。

まとめ

今回動かしたパラメータを整理すると、こんな感じです。

parameter 見た目への影響
$S_0$ 全体の明るさ
$r_c$ coreの広がり
$\beta$ 外側の落ち方
$q$ 楕円のつぶれ具合
$\theta$ 楕円の向き
$B$ 一定の背景レベル

今回は $S_0=1$、$B=0$ に固定して、主に形状に関係するパラメータを変えてみました。

実際のX線画像には統計揺らぎや背景、PSFなども入るので、当然ながらこんなにきれいな分布にはなりません。

また、実際の銀河団には非対称な構造などもあるので、単一のβ-modelですべてを表現できるわけではありません。

今回はモデルをいろいろ描いて、パラメータと形状の対応を眺めるところまでにしました。

式だけ見ているより、こうしてパラメータを変えた画像を並べた方が自分には分かりやすかったです。

実際の銀河団画像へのfitなどは、また機会があれば試してみたいと思います。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?