🌐 EN | 🇯🇵 JP

第5章:Pythonで学ぶ超伝導シミュレーション

コードで学ぶ物理の世界

⏱️ 30-40分 💻 5つのコード例 📊 中級

学習目標

5.1 セットアップと前提条件

必要なライブラリ

# 必要なパッケージのインストール
# pip install numpy matplotlib scipy pandas

import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate, optimize
import pandas as pd

# プロットスタイルの設定
plt.style.use('seaborn-v0_8-whitegrid')
plt.rcParams['figure.figsize'] = [10, 6]
plt.rcParams['font.size'] = 12

5.2 BCSギャップ方程式のシミュレーション

BCS理論は、超伝導エネルギーギャップが温度とともにどのように変化するかを予測します。これを数値的に実装してみましょう。

理論

有限温度でのBCSギャップ方程式は次のようになります:

1 = N(0)V ∫₀^ωD dε / √(ε² + Δ²) × tanh(√(ε² + Δ²) / 2kBT)

この方程式を自己無撞着的に解いて、Δ(T)を求めることができます。

import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate, optimize

def bcs_gap_equation(Delta, T, Tc, Delta0):
    """
    数値解のためのBCSギャップ方程式
    解で0になるべき差を返す
    """
    if Delta <= 0 or T >= Tc:
        return Delta  # 解がないことを示すためにDelta自身を返す

    # 換算温度
    t = T / Tc

    # 自然単位系を使用(kB*Tc = 1)
    kB = 1.0

    # 積分点の数
    N = 1000
    omega_D = 10 * Delta0  # デバイカットオフ(>> Delta)

    epsilon = np.linspace(0.001, omega_D, N)
    E = np.sqrt(epsilon**2 + Delta**2)

    # BCSカーネル
    if T > 0:
        kernel = np.tanh(E / (2 * T)) / E
    else:
        kernel = 1.0 / E

    # 数値積分
    integral = np.trapz(kernel, epsilon)

    # ギャップ方程式:結合強度に等しくなるべき
    # T=0でDelta = Delta0となるように規格化
    coupling = Delta0 / np.trapz(1.0 / np.sqrt(epsilon**2 + Delta0**2), epsilon)

    return coupling * integral - 1.0


def solve_bcs_gap(Tc, Delta0, num_points=50):
    """
    温度範囲でBCSギャップ方程式を解く
    TとDeltaの配列を返す
    """
    T_values = np.linspace(0.01 * Tc, 0.999 * Tc, num_points)
    Delta_values = []

    for T in T_values:
        # 初期推測:近似式を使用
        t = T / Tc
        Delta_approx = Delta0 * np.sqrt(1 - t) if t < 1 else 0

        try:
            # ギャップ方程式の根を見つける
            result = optimize.brentq(
                lambda D: bcs_gap_equation(D, T, Tc, Delta0),
                1e-10, Delta0 * 1.5
            )
            Delta_values.append(result)
        except:
            # 数値解が失敗した場合は近似式を使用
            Delta_values.append(Delta_approx)

    return np.array(T_values), np.array(Delta_values)


# シミュレーションパラメータ
Tc = 9.3  # K(ニオブ)
kB = 8.617e-5  # eV/K
Delta0 = 1.76 * kB * Tc  # BCS予測によるDelta(0)

# 安定性のため、より簡単なBCS近似式を使用
def bcs_gap_approx(T, Tc, Delta0):
    """BCSギャップの近似温度依存性"""
    t = T / Tc
    if t >= 1:
        return 0
    # 全温度範囲で有効な近似
    return Delta0 * np.tanh(1.74 * np.sqrt((1/t - 1)))

# データの生成
T_range = np.linspace(0.1, Tc, 200)
Delta_approx = [bcs_gap_approx(T, Tc, Delta0) for T in T_range]

# プロット作成
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 左:ギャップ対温度
ax1 = axes[0]
ax1.plot(T_range, np.array(Delta_approx) * 1000, 'b-', linewidth=2,
         label='BCS予測')
ax1.axvline(x=Tc, color='r', linestyle='--', label=f'Tc = {Tc} K')
ax1.axhline(y=Delta0 * 1000, color='gray', linestyle=':', alpha=0.5,
            label=f'Δ(0) = {Delta0*1000:.3f} meV')

ax1.set_xlabel('温度 (K)', fontsize=12)
ax1.set_ylabel('エネルギーギャップ Δ (meV)', fontsize=12)
ax1.set_title('BCSエネルギーギャップ対温度(ニオブ)', fontsize=14)
ax1.legend(fontsize=10)
ax1.set_xlim(0, Tc * 1.1)
ax1.set_ylim(0, Delta0 * 1000 * 1.2)
ax1.grid(True, alpha=0.3)

# 右:規格化されたギャップ
ax2 = axes[1]
t_norm = T_range / Tc
delta_norm = np.array(Delta_approx) / Delta0

ax2.plot(t_norm, delta_norm, 'b-', linewidth=2, label='BCS近似')

# 弱結合BCS限界を追加
ax2.plot([0, 1], [1, 0], 'g--', alpha=0.5, linewidth=1.5,
         label='線形近似')

ax2.set_xlabel('T / Tc', fontsize=12)
ax2.set_ylabel('Δ(T) / Δ(0)', fontsize=12)
ax2.set_title('規格化されたBCSギャップ', fontsize=14)
ax2.legend(fontsize=10)
ax2.set_xlim(0, 1.1)
ax2.set_ylim(0, 1.1)
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

# 主要な値を出力
print("ニオブのBCS理論予測:")
print(f"  臨界温度 Tc = {Tc} K")
print(f"  零温度ギャップ Δ(0) = {Delta0*1000:.3f} meV")
print(f"  BCS比 2Δ(0)/kB*Tc = {2*Delta0/(kB*Tc):.3f}(BCS:3.52)")

5.3 ロンドン侵入深さのシミュレーション

ロンドン方程式は、磁場が超伝導体にどのように侵入するかを記述します。表面での磁場減衰をシミュレートしてみましょう。

import numpy as np
import matplotlib.pyplot as plt

class LondonPenetration:
    """
    ロンドン理論を使用した磁場侵入のシミュレーション
    """

    def __init__(self, lambda_L, thickness=None):
        """
        ロンドン侵入深さで初期化

        パラメータ:
        -----------
        lambda_L : float
            ロンドン侵入深さ(nm)
        thickness : float, optional
            膜厚(nm)(バルクの場合はNone)
        """
        self.lambda_L = lambda_L
        self.thickness = thickness

    def field_profile_bulk(self, x, B0=1.0):
        """
        バルク超伝導体での磁場プロファイル
        B(x) = B0 * exp(-x/lambda_L)
        """
        return B0 * np.exp(-x / self.lambda_L)

    def field_profile_film(self, x, B0=1.0):
        """
        薄膜での磁場プロファイル
        両側から磁場が印加された厚さdの膜の場合
        """
        if self.thickness is None:
            return self.field_profile_bulk(x, B0)

        d = self.thickness
        lam = self.lambda_L

        # 薄膜の解:coshプロファイル
        return B0 * np.cosh((x - d/2) / lam) / np.cosh(d / (2*lam))

    def current_density(self, x, B0=1.0, mu0=4*np.pi*1e-7):
        """
        マクスウェル方程式からの遮蔽電流密度
        J = -dB/dx / mu0
        """
        return B0 / (self.lambda_L * mu0) * np.exp(-x / self.lambda_L)


# 異なる材料のインスタンスを作成
materials = {
    'アルミニウム': LondonPenetration(50),
    'ニオブ': LondonPenetration(40),
    'YBCO': LondonPenetration(150),
    'NbTi': LondonPenetration(300),
}

# 空間範囲
x = np.linspace(0, 1000, 1000)  # nm

# 包括的な可視化を作成
fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# プロット1:磁場プロファイルの比較
ax1 = axes[0, 0]
colors = plt.cm.viridis(np.linspace(0.2, 0.8, len(materials)))
for (name, sc), color in zip(materials.items(), colors):
    B = sc.field_profile_bulk(x)
    ax1.plot(x, B, linewidth=2, color=color,
             label=f'{name} (λ={sc.lambda_L} nm)')

ax1.axhline(y=1/np.e, color='gray', linestyle='--', alpha=0.5)
ax1.text(800, 1/np.e + 0.05, f'B/B₀ = 1/e', fontsize=10, color='gray')

ax1.set_xlabel('表面からの距離 (nm)', fontsize=12)
ax1.set_ylabel('B/B₀', fontsize=12)
ax1.set_title('バルク超伝導体での磁場侵入', fontsize=14)
ax1.legend(fontsize=10)
ax1.set_xlim(0, 1000)
ax1.set_ylim(0, 1.1)
ax1.grid(True, alpha=0.3)

# プロット2:電流密度プロファイル
ax2 = axes[0, 1]
for (name, sc), color in zip(materials.items(), colors):
    # 規格化された電流密度
    J = np.exp(-x / sc.lambda_L) / sc.lambda_L
    ax2.plot(x, J * 1000, linewidth=2, color=color, label=name)

ax2.set_xlabel('表面からの距離 (nm)', fontsize=12)
ax2.set_ylabel('遮蔽電流(任意単位)', fontsize=12)
ax2.set_title('遮蔽電流密度', fontsize=14)
ax2.legend(fontsize=10)
ax2.set_xlim(0, 500)
ax2.grid(True, alpha=0.3)

# プロット3:薄膜効果
ax3 = axes[1, 0]
thicknesses = [50, 100, 200, 500]  # nm
colors_film = plt.cm.plasma(np.linspace(0.2, 0.8, len(thicknesses)))

lambda_L = 100  # nm
for d, color in zip(thicknesses, colors_film):
    film = LondonPenetration(lambda_L, thickness=d)
    x_film = np.linspace(0, d, 200)
    B = film.field_profile_film(x_film)
    ax3.plot(x_film, B, linewidth=2, color=color, label=f'd = {d} nm')

ax3.set_xlabel('膜内の位置 (nm)', fontsize=12)
ax3.set_ylabel('B/B₀', fontsize=12)
ax3.set_title(f'薄膜での磁場プロファイル(λ = {lambda_L} nm)', fontsize=14)
ax3.legend(fontsize=10)
ax3.grid(True, alpha=0.3)

# プロット4:λの温度依存性
ax4 = axes[1, 1]

def lambda_vs_T(T, Tc, lambda_0):
    """二流体モデル:λ(T) = λ(0) / sqrt(1 - (T/Tc)^4)"""
    t = T / Tc
    if t >= 1:
        return np.inf
    return lambda_0 / np.sqrt(1 - t**4)

# ニオブの例
Tc = 9.3
lambda_0 = 40

T_range = np.linspace(0.1, 0.99 * Tc, 100)
lambda_T = [lambda_vs_T(T, Tc, lambda_0) for T in T_range]

ax4.plot(T_range / Tc, np.array(lambda_T) / lambda_0, 'b-', linewidth=2)
ax4.axhline(y=1, color='gray', linestyle=':', alpha=0.5)
ax4.axvline(x=1, color='r', linestyle='--', alpha=0.5, label='Tc')

ax4.set_xlabel('T / Tc', fontsize=12)
ax4.set_ylabel('λ(T) / λ(0)', fontsize=12)
ax4.set_title('侵入深さの温度依存性', fontsize=14)
ax4.set_xlim(0, 1.05)
ax4.set_ylim(0.9, 5)
ax4.legend(fontsize=10)
ax4.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

5.4 超伝導材料データベース

超伝導材料の包括的なデータベースを構築し、それらの特性を解析しましょう。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 超伝導体データベースの作成
sc_data = {
    'Material': ['Al', 'Hg', 'Pb', 'Nb', 'NbTi', 'Nb3Sn', 'MgB2',
                 'YBCO', 'BSCCO-2223', 'Hg-1223', 'FeSe', 'H3S'],
    'Tc_K': [1.2, 4.2, 7.2, 9.3, 10, 18.3, 39,
             93, 110, 133, 8, 203],
    'Hc2_T': [0.01, 0.04, 0.08, 0.4, 15, 24, 16,
              100, 60, 100, 17, 70],
    'Type': ['I', 'I', 'I', 'II', 'II', 'II', 'II',
             'II', 'II', 'II', 'II', 'II'],
    'Class': ['元素', '元素', '元素', '元素', '合金', 'A15', '化合物',
              '銅酸化物', '銅酸化物', '銅酸化物', '鉄系', '水素化物'],
    'Year': [1933, 1911, 1913, 1930, 1962, 1954, 2001,
             1987, 1988, 1993, 2008, 2015],
    'Practical': [False, False, False, True, True, True, True,
                  True, True, False, False, False],
    'Lambda_nm': [50, 40, 39, 40, 300, 80, 140,
                  150, 200, 200, 400, 50],
    'Xi_nm': [1600, 170, 83, 38, 4, 3, 5,
              1.5, 2, 1.5, 2, 1]
}

df = pd.DataFrame(sc_data)

# ギンツブルグ・ランダウパラメータの計算
df['Kappa'] = df['Lambda_nm'] / df['Xi_nm']

# データベースの表示
print("超伝導体データベース:")
print(df.to_string(index=False))
print()

# 解析と可視化
fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# プロット1:材料クラス別のTc
ax1 = axes[0, 0]
class_colors = {'元素': 'blue', '合金': 'green', 'A15': 'orange',
                '化合物': 'purple', '銅酸化物': 'red', '鉄系': 'brown',
                '水素化物': 'magenta'}

for mat_class in df['Class'].unique():
    subset = df[df['Class'] == mat_class]
    ax1.scatter(subset['Year'], subset['Tc_K'], s=100,
                c=class_colors[mat_class], label=mat_class, alpha=0.7)

ax1.axhline(y=77, color='cyan', linestyle='--', alpha=0.7, linewidth=2)
ax1.text(2018, 80, 'LN₂ (77K)', fontsize=10, color='cyan')

ax1.set_xlabel('発見年', fontsize=12)
ax1.set_ylabel('臨界温度 (K)', fontsize=12)
ax1.set_title('超伝導体Tcの進化', fontsize=14)
ax1.legend(fontsize=9, loc='upper left')
ax1.grid(True, alpha=0.3)

# プロット2:Tc対Hc2
ax2 = axes[0, 1]
for mat_class in df['Class'].unique():
    subset = df[df['Class'] == mat_class]
    ax2.scatter(subset['Tc_K'], subset['Hc2_T'], s=100,
                c=class_colors[mat_class], label=mat_class, alpha=0.7)

ax2.set_xlabel('臨界温度 Tc (K)', fontsize=12)
ax2.set_ylabel('上部臨界磁場 Hc2 (T)', fontsize=12)
ax2.set_title('Tc対Hc2', fontsize=14)
ax2.set_xscale('log')
ax2.set_yscale('log')
ax2.legend(fontsize=9)
ax2.grid(True, alpha=0.3, which='both')

# プロット3:κ値(第一種対第二種の境界)
ax3 = axes[1, 0]
colors_kappa = ['blue' if k < 0.71 else 'red' for k in df['Kappa']]
bars = ax3.bar(df['Material'], df['Kappa'], color=colors_kappa, alpha=0.7)
ax3.axhline(y=1/np.sqrt(2), color='green', linestyle='--', linewidth=2,
            label=f'κ = 1/√2 ≈ 0.71')
ax3.set_ylabel('κ = λ/ξ', fontsize=12)
ax3.set_title('ギンツブルグ・ランダウパラメータ κ', fontsize=14)
ax3.set_yscale('log')
ax3.legend(fontsize=10)
plt.setp(ax3.xaxis.get_majorticklabels(), rotation=45, ha='right')

# プロット4:実用材料対研究材料
ax4 = axes[1, 1]
practical = df[df['Practical'] == True]
research = df[df['Practical'] == False]

ax4.scatter(practical['Tc_K'], practical['Hc2_T'], s=150, c='green',
            marker='s', label=f'実用材料 ({len(practical)})', alpha=0.7)
ax4.scatter(research['Tc_K'], research['Hc2_T'], s=150, c='red',
            marker='o', label=f'研究材料 ({len(research)})', alpha=0.7)

# 材料名を追加
for _, row in df.iterrows():
    ax4.annotate(row['Material'], (row['Tc_K'], row['Hc2_T']),
                xytext=(5, 5), textcoords='offset points', fontsize=8)

ax4.set_xlabel('臨界温度 Tc (K)', fontsize=12)
ax4.set_ylabel('上部臨界磁場 Hc2 (T)', fontsize=12)
ax4.set_title('実用材料対研究材料', fontsize=14)
ax4.legend(fontsize=10)
ax4.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

# 統計的要約
print("\nクラス別統計要約:")
print(df.groupby('Class')[['Tc_K', 'Hc2_T', 'Kappa']].mean().round(2))

5.5 渦糸状態のシミュレーション

第二種超伝導体では、磁束が量子化された渦糸として侵入します。簡単な渦糸格子をシミュレートしてみましょう。

import numpy as np
import matplotlib.pyplot as plt

class VortexSimulation:
    """
    第二種超伝導体における渦糸状態のシミュレーション
    """

    def __init__(self, lambda_L=100, xi=5, Phi_0=2.07e-15):
        """
        渦糸シミュレーションの初期化

        パラメータ:
        -----------
        lambda_L : float
            侵入深さ(nm)
        xi : float
            コヒーレンス長(nm)
        Phi_0 : float
            磁束量子(Wb)
        """
        self.lambda_L = lambda_L
        self.xi = xi
        self.Phi_0 = Phi_0
        self.kappa = lambda_L / xi

    def single_vortex_field(self, x, y, x0=0, y0=0):
        """
        単一渦糸の磁場
        変形ベッセル関数を使用した近似解
        """
        r = np.sqrt((x - x0)**2 + (y - y0)**2)
        # 中心での特異性を回避
        r = np.maximum(r, self.xi)

        # 磁場プロファイル(近似)
        B = np.exp(-r / self.lambda_L) / (2 * np.pi * self.lambda_L**2)
        return B

    def vortex_lattice(self, x, y, B_avg, lattice_type='triangular'):
        """
        与えられた平均磁場に対する渦糸格子を作成
        """
        # 平均磁場から渦糸間隔を計算
        # B_avg = Phi_0 / (渦糸あたりの面積)
        # 三角格子の場合:a = sqrt(2*Phi_0 / (sqrt(3) * B_avg))
        a = np.sqrt(2 * self.Phi_0 / (np.sqrt(3) * B_avg)) * 1e9  # nmに変換

        # 渦糸位置の生成
        vortex_positions = []
        n_range = 5  # 各方向の渦糸数

        for i in range(-n_range, n_range + 1):
            for j in range(-n_range, n_range + 1):
                if lattice_type == 'triangular':
                    x0 = a * (i + 0.5 * (j % 2))
                    y0 = a * j * np.sqrt(3) / 2
                else:  # 正方格子
                    x0 = a * i
                    y0 = a * j
                vortex_positions.append((x0, y0))

        # 全磁場の計算
        B_total = np.zeros_like(x)
        for x0, y0 in vortex_positions:
            B_total += self.single_vortex_field(x, y, x0, y0)

        return B_total, vortex_positions, a


# シミュレーションの作成
sim = VortexSimulation(lambda_L=150, xi=2)  # YBCOに近いパラメータ

# 空間グリッドの作成
L = 500  # nm
N = 200
x = np.linspace(-L, L, N)
y = np.linspace(-L, L, N)
X, Y = np.meshgrid(x, y)

# 異なる印加磁場(テスラ単位)
fields = [0.5, 1.0, 2.0]

fig, axes = plt.subplots(1, 3, figsize=(15, 5))

for ax, B_applied in zip(axes, fields):
    B, vortex_pos, spacing = sim.vortex_lattice(X, Y, B_applied)

    # 磁場強度のプロット
    im = ax.contourf(X, Y, B, levels=50, cmap='hot')
    plt.colorbar(im, ax=ax, label='B(任意単位)')

    # 渦糸中心をマーク
    vx = [p[0] for p in vortex_pos if abs(p[0]) < L and abs(p[1]) < L]
    vy = [p[1] for p in vortex_pos if abs(p[0]) < L and abs(p[1]) < L]
    ax.scatter(vx, vy, c='cyan', s=20, marker='o', alpha=0.5)

    ax.set_xlabel('x (nm)', fontsize=11)
    ax.set_ylabel('y (nm)', fontsize=11)
    ax.set_title(f'B = {B_applied} T\n渦糸間隔 ≈ {spacing:.0f} nm', fontsize=12)
    ax.set_aspect('equal')

plt.suptitle('第二種超伝導体における渦糸格子', fontsize=14, y=1.02)
plt.tight_layout()
plt.show()

# 追加の可視化:渦糸コア近傍の秩序パラメータ
fig, ax = plt.subplots(figsize=(10, 6))

r = np.linspace(0, 100, 200)  # nm

# 秩序パラメータの回復
psi = np.tanh(r / (np.sqrt(2) * sim.xi))

# 磁場減衰
B_normalized = np.exp(-r / sim.lambda_L)

ax.plot(r, psi**2, 'b-', linewidth=2, label='|ψ|²(秩序パラメータ)')
ax.plot(r, B_normalized, 'r-', linewidth=2, label='B/B_core(磁場)')

ax.axvline(x=sim.xi, color='blue', linestyle='--', alpha=0.5,
           label=f'ξ = {sim.xi} nm')
ax.axvline(x=sim.lambda_L, color='red', linestyle='--', alpha=0.5,
           label=f'λ = {sim.lambda_L} nm')

ax.set_xlabel('渦糸中心からの距離 (nm)', fontsize=12)
ax.set_ylabel('規格化された値', fontsize=12)
ax.set_title('単一渦糸の構造', fontsize=14)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 100)

plt.tight_layout()
plt.show()

print(f"渦糸パラメータ:")
print(f"  侵入深さ λ = {sim.lambda_L} nm")
print(f"  コヒーレンス長 ξ = {sim.xi} nm")
print(f"  GLパラメータ κ = {sim.kappa:.1f}")
print(f"  磁束量子 Φ₀ = {sim.Phi_0:.2e} Wb")

5.6 包括的なシミュレーションプロジェクト

すべてを統合して、包括的な超伝導体解析ツールを作成しましょう。

import numpy as np
import matplotlib.pyplot as plt

class SuperconductorAnalyzer:
    """
    超伝導体特性の完全な解析ツール
    """

    def __init__(self, name, Tc, lambda_0, xi_0, Hc2_0=None):
        """
        基本パラメータで超伝導体を初期化
        """
        self.name = name
        self.Tc = Tc  # K
        self.lambda_0 = lambda_0  # nm
        self.xi_0 = xi_0  # nm
        self.kappa = lambda_0 / xi_0
        self.type = 'I' if self.kappa < 1/np.sqrt(2) else 'II'

        # BCS定数
        self.kB = 8.617e-5  # eV/K
        self.Delta_0 = 1.76 * self.kB * Tc  # BCSギャップ

        # 臨界磁場
        if Hc2_0 is None:
            # GL理論から推定
            Phi_0 = 2.07e-15  # Wb
            self.Hc2_0 = Phi_0 / (2 * np.pi * (xi_0 * 1e-9)**2)
        else:
            self.Hc2_0 = Hc2_0

    def gap(self, T):
        """温度Tでのbcsギャップ"""
        if T >= self.Tc:
            return 0
        t = T / self.Tc
        return self.Delta_0 * np.tanh(1.74 * np.sqrt(1/t - 1))

    def lambda_L(self, T):
        """温度Tでの侵入深さ"""
        if T >= self.Tc:
            return np.inf
        t = T / self.Tc
        return self.lambda_0 / np.sqrt(1 - t**4)

    def xi(self, T):
        """温度Tでのコヒーレンス長"""
        if T >= self.Tc:
            return np.inf
        t = T / self.Tc
        return self.xi_0 / np.sqrt(1 - t**4)

    def Hc2(self, T):
        """温度Tでの上部臨界磁場"""
        if T >= self.Tc:
            return 0
        return self.Hc2_0 * (1 - (T/self.Tc)**2)

    def full_analysis(self):
        """包括的な解析プロットを生成"""
        T_range = np.linspace(0.1, self.Tc * 1.1, 200)

        fig, axes = plt.subplots(2, 3, figsize=(15, 10))
        fig.suptitle(f'超伝導体解析:{self.name}', fontsize=16)

        # 1. エネルギーギャップ
        ax1 = axes[0, 0]
        gap_vals = [self.gap(T) * 1000 for T in T_range]
        ax1.plot(T_range, gap_vals, 'b-', linewidth=2)
        ax1.axvline(x=self.Tc, color='r', linestyle='--', alpha=0.5)
        ax1.set_xlabel('T (K)')
        ax1.set_ylabel('Δ (meV)')
        ax1.set_title('エネルギーギャップ')
        ax1.grid(True, alpha=0.3)

        # 2. 侵入深さ
        ax2 = axes[0, 1]
        lambda_vals = [self.lambda_L(T) if T < self.Tc else np.nan
                       for T in T_range]
        ax2.plot(T_range, lambda_vals, 'g-', linewidth=2)
        ax2.axvline(x=self.Tc, color='r', linestyle='--', alpha=0.5)
        ax2.set_xlabel('T (K)')
        ax2.set_ylabel('λ (nm)')
        ax2.set_title('侵入深さ')
        ax2.set_ylim(0, self.lambda_0 * 5)
        ax2.grid(True, alpha=0.3)

        # 3. コヒーレンス長
        ax3 = axes[0, 2]
        xi_vals = [self.xi(T) if T < self.Tc else np.nan for T in T_range]
        ax3.plot(T_range, xi_vals, 'm-', linewidth=2)
        ax3.axvline(x=self.Tc, color='r', linestyle='--', alpha=0.5)
        ax3.set_xlabel('T (K)')
        ax3.set_ylabel('ξ (nm)')
        ax3.set_title('コヒーレンス長')
        ax3.set_ylim(0, self.xi_0 * 5)
        ax3.grid(True, alpha=0.3)

        # 4. 臨界磁場
        ax4 = axes[1, 0]
        Hc2_vals = [self.Hc2(T) for T in T_range]
        ax4.plot(T_range, Hc2_vals, 'r-', linewidth=2)
        ax4.axvline(x=self.Tc, color='r', linestyle='--', alpha=0.5)
        ax4.set_xlabel('T (K)')
        ax4.set_ylabel('Hc2 (T)')
        ax4.set_title('上部臨界磁場')
        ax4.grid(True, alpha=0.3)

        # 5. 相図
        ax5 = axes[1, 1]
        T_phase = np.linspace(0, self.Tc, 100)
        H_phase = [self.Hc2(T) for T in T_phase]
        ax5.plot(T_phase, H_phase, 'k-', linewidth=2)
        ax5.fill_between(T_phase, 0, H_phase, alpha=0.3, color='cyan',
                         label='超伝導状態')
        ax5.fill_between(T_phase, H_phase, max(H_phase)*1.2, alpha=0.3,
                         color='lightcoral', label='常伝導状態')
        ax5.set_xlabel('T (K)')
        ax5.set_ylabel('H (T)')
        ax5.set_title('相図')
        ax5.legend()
        ax5.grid(True, alpha=0.3)

        # 6. 情報パネル
        ax6 = axes[1, 2]
        ax6.axis('off')
        info_text = f"""
材料:{self.name}
タイプ:{self.type}

臨界パラメータ:
  Tc = {self.Tc} K
  Hc2(0) = {self.Hc2_0:.2f} T
  Δ(0) = {self.Delta_0*1000:.3f} meV

長さスケール:
  λ(0) = {self.lambda_0} nm
  ξ(0) = {self.xi_0} nm
  κ = {self.kappa:.2f}

BCS予測:
  2Δ/kBTc = {2*self.Delta_0/(self.kB*self.Tc):.2f}
        """
        ax6.text(0.1, 0.9, info_text, transform=ax6.transAxes,
                fontfamily='monospace', fontsize=11, verticalalignment='top')
        ax6.set_title('材料特性')

        plt.tight_layout()
        plt.show()


# 異なる超伝導体を解析
materials_to_analyze = [
    ('ニオブ', 9.3, 40, 38, 0.4),
    ('YBCO', 93, 150, 1.5, 100),
    ('MgB2', 39, 140, 5, 16),
]

for params in materials_to_analyze:
    sc = SuperconductorAnalyzer(*params)
    print(f"\n{'='*50}")
    print(f"解析対象:{sc.name}")
    print(f"{'='*50}")
    sc.full_analysis()

まとめ

重要なポイント

演習問題

演習1:データベースの拡張

実際のパラメータを持つ5つ以上の超伝導体をデータベースに追加してください。低温超伝導体と高温超伝導体の両方を含めてください。比較プロットを再生成してください。

演習2:温度スイープ

一定の印加磁場下で、T = 0.1TcからT = 0.9Tcまでの渦糸格子間隔の変化を示すように、渦糸シミュレーションを修正してください。

演習3:臨界電流

スケーリング則を使用して臨界電流密度Jc(T, H)を計算する関数を実装してください:Jc ∝ [1 - (T/Tc)]² × [1 - (H/Hc2)]²。Jcを2Dカラーマップとしてプロットしてください。

参考文献