学習目標
初級:
- 導電性高分子の基本メカニズム(π共役系とドーピング)を理解する
- 生体適合性高分子の要件と代表例を説明できる
- 刺激応答性高分子(温度、pH応答)の原理を理解する
中級:
- 導電率とドーピングレベルの関係を計算できる
- LCST(下限臨界共溶温度)をFlory-Huggins理論で予測できる
- 薬物放出速度をカイネティクスモデルで解析できる
上級:
- バンドギャップを計算し、光吸収スペクトルを予測できる
- イオン伝導度をArrhenius式で解析できる
- 生分解速度をモデル化し、分解時間を予測できる
4.1 導電性高分子
導電性高分子(Conducting Polymers)は、共役π電子系を持ち、ドーピングにより電気伝導性を示す有機材料です。代表例として、ポリアニリン(PANI)、PEDOT:PSS、ポリピロール(PPy)があります。
σ = 1-1000 S/cm] I --> J[用途: 透明電極
有機EL, 太陽電池]
4.1.1 導電率とドーピング
導電率σは、ドーピングレベル(酸化/還元度)に依存します。以下では、ポリアニリンのドーピングシミュレーションを行います。
import numpy as np
import matplotlib.pyplot as plt
# 導電性高分子のドーピングシミュレーション
def simulate_conductivity_doping(polymer='Polyaniline'):
"""
ドーピングレベルと導電率の関係をシミュレート
Parameters:
- polymer: 高分子名('Polyaniline', 'PEDOT', 'Polypyrrole')
Returns:
- doping_levels: ドーピングレベル(%)
- conductivities: 導電率(S/cm)
"""
# ドーピングレベル範囲(0-50%)
doping_levels = np.linspace(0, 50, 100)
# 導電率モデル(経験式)
# σ = σ_max * (x / x_opt)^2 * exp(-((x - x_opt) / w)^2)
# x: ドーピングレベル, x_opt: 最適ドーピング, w: 幅パラメータ
polymer_params = {
'Polyaniline': {'sigma_max': 200, 'x_opt': 25, 'w': 15},
'PEDOT': {'sigma_max': 1000, 'x_opt': 30, 'w': 20},
'Polypyrrole': {'sigma_max': 100, 'x_opt': 20, 'w': 12}
}
params = polymer_params.get(polymer, polymer_params['Polyaniline'])
# 導電率計算(S/cm)
x_opt = params['x_opt']
w = params['w']
sigma_max = params['sigma_max']
conductivities = sigma_max * ((doping_levels / x_opt) ** 2) * \
np.exp(-((doping_levels - x_opt) / w) ** 2)
# 可視化
plt.figure(figsize=(14, 5))
# サブプロット1:導電率 vs ドーピングレベル
plt.subplot(1, 3, 1)
for poly_name, poly_params in polymer_params.items():
x_opt_p = poly_params['x_opt']
w_p = poly_params['w']
sigma_max_p = poly_params['sigma_max']
sigma_p = sigma_max_p * ((doping_levels / x_opt_p) ** 2) * \
np.exp(-((doping_levels - x_opt_p) / w_p) ** 2)
plt.plot(doping_levels, sigma_p, linewidth=2, label=poly_name)
plt.xlabel('Doping Level (%)', fontsize=12)
plt.ylabel('Conductivity σ (S/cm)', fontsize=12)
plt.title('Conductivity vs Doping Level', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
plt.yscale('log')
# サブプロット2:キャリア密度
plt.subplot(1, 3, 2)
# キャリア密度 n ∝ ドーピングレベル
carrier_density = doping_levels * 1e20 # cm^-3(仮想値)
mobility = conductivities / (1.6e-19 * carrier_density + 1e-10) # cm²/V·s
plt.plot(doping_levels, carrier_density / 1e20, 'b-', linewidth=2)
plt.xlabel('Doping Level (%)', fontsize=12)
plt.ylabel('Carrier Density n (×10²⁰ cm⁻³)', fontsize=12)
plt.title(f'{polymer}: Carrier Density', fontsize=14, fontweight='bold')
plt.grid(alpha=0.3)
# サブプロット3:移動度
plt.subplot(1, 3, 3)
plt.plot(doping_levels, mobility, 'r-', linewidth=2)
plt.xlabel('Doping Level (%)', fontsize=12)
plt.ylabel('Mobility μ (cm²/V·s)', fontsize=12)
plt.title(f'{polymer}: Charge Carrier Mobility', fontsize=14, fontweight='bold')
plt.grid(alpha=0.3)
plt.yscale('log')
plt.tight_layout()
plt.savefig('conductivity_doping.png', dpi=300, bbox_inches='tight')
plt.show()
# 結果出力
print(f"=== {polymer}のドーピング解析 ===")
print(f"最大導電率: {sigma_max} S/cm")
print(f"最適ドーピングレベル: {x_opt}%")
# 特定ドーピングレベルでの値
for doping in [10, 25, 40]:
idx = np.argmin(np.abs(doping_levels - doping))
print(f"\nドーピングレベル {doping}%:")
print(f" 導電率: {conductivities[idx]:.2f} S/cm")
print(f" キャリア密度: {carrier_density[idx]:.2e} cm⁻³")
return doping_levels, conductivities
# 実行
simulate_conductivity_doping('Polyaniline')
4.1.2 バンドギャップ計算
共役高分子のバンドギャップEgは、光吸収スペクトルから決定できます。以下では、HOMOーLUMOギャップと光吸収の関係をシミュレートします。
import numpy as np
import matplotlib.pyplot as plt
# バンドギャップと光吸収スペクトル
def calculate_bandgap_absorption(bandgap_eV=2.5):
"""
バンドギャップから光吸収スペクトルを計算
Parameters:
- bandgap_eV: バンドギャップエネルギー(eV)
Returns:
- wavelengths: 波長(nm)
- absorbance: 吸光度
"""
# 波長範囲(nm)
wavelengths = np.linspace(300, 800, 500)
# エネルギー変換 E(eV) = 1240 / λ(nm)
photon_energies = 1240 / wavelengths
# 吸収スペクトル(単純化:階段関数 + ガウシアンブロードニング)
def absorption_profile(E, Eg, width=0.3):
"""吸収スペクトル(Gaussianブロードニング)"""
if E < Eg:
return 0
else:
return np.exp(-((E - Eg) / width) ** 2)
absorbance = np.array([absorption_profile(E, bandgap_eV) for E in photon_energies])
# 可視化
plt.figure(figsize=(14, 5))
# サブプロット1:吸収スペクトル
plt.subplot(1, 3, 1)
plt.plot(wavelengths, absorbance, 'b-', linewidth=2)
# バンドギャップ対応波長
lambda_g = 1240 / bandgap_eV
plt.axvline(lambda_g, color='red', linestyle='--', linewidth=1.5,
label=f'λg = {lambda_g:.0f} nm (Eg = {bandgap_eV} eV)')
plt.xlabel('Wavelength (nm)', fontsize=12)
plt.ylabel('Absorbance (a.u.)', fontsize=12)
plt.title('UV-Vis Absorption Spectrum', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
# 可視光領域を色分け
plt.fill_betweenx([0, max(absorbance)], 380, 450, color='violet', alpha=0.2)
plt.fill_betweenx([0, max(absorbance)], 450, 495, color='blue', alpha=0.2)
plt.fill_betweenx([0, max(absorbance)], 495, 570, color='green', alpha=0.2)
plt.fill_betweenx([0, max(absorbance)], 570, 590, color='yellow', alpha=0.2)
plt.fill_betweenx([0, max(absorbance)], 590, 620, color='orange', alpha=0.2)
plt.fill_betweenx([0, max(absorbance)], 620, 750, color='red', alpha=0.2)
# サブプロット2:バンドギャップと色の関係
plt.subplot(1, 3, 2)
bandgaps = np.linspace(1.5, 3.5, 50)
lambda_gaps = 1240 / bandgaps
colors_perceived = []
for lam in lambda_gaps:
if lam < 400:
colors_perceived.append('UV')
elif lam < 450:
colors_perceived.append('Violet')
elif lam < 495:
colors_perceived.append('Blue')
elif lam < 570:
colors_perceived.append('Green')
elif lam < 590:
colors_perceived.append('Yellow')
elif lam < 620:
colors_perceived.append('Orange')
elif lam < 750:
colors_perceived.append('Red')
else:
colors_perceived.append('IR')
plt.scatter(bandgaps, lambda_gaps, c=lambda_gaps, cmap='rainbow', s=50, edgecolors='black')
plt.xlabel('Bandgap Eg (eV)', fontsize=12)
plt.ylabel('Absorption Edge λg (nm)', fontsize=12)
plt.title('Bandgap vs Absorption Wavelength', fontsize=14, fontweight='bold')
plt.colorbar(label='Wavelength (nm)')
plt.grid(alpha=0.3)
plt.axhline(lambda_g, color='red', linestyle='--', alpha=0.7)
# サブプロット3:複数のバンドギャップ比較
plt.subplot(1, 3, 3)
bandgaps_examples = [1.8, 2.5, 3.2]
for Eg in bandgaps_examples:
photon_E = 1240 / wavelengths
abs_spec = np.array([absorption_profile(E, Eg, 0.3) for E in photon_E])
plt.plot(wavelengths, abs_spec, linewidth=2, label=f'Eg = {Eg} eV')
plt.xlabel('Wavelength (nm)', fontsize=12)
plt.ylabel('Absorbance (a.u.)', fontsize=12)
plt.title('Effect of Bandgap on Absorption', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
plt.xlim(300, 800)
plt.tight_layout()
plt.savefig('bandgap_absorption.png', dpi=300, bbox_inches='tight')
plt.show()
# 結果出力
print("=== バンドギャップ解析 ===")
print(f"バンドギャップ: {bandgap_eV} eV")
print(f"吸収端波長: {lambda_g:.1f} nm")
if lambda_g < 400:
color_range = "紫外(UV)"
elif lambda_g < 750:
color_range = "可視光"
else:
color_range = "赤外(IR)"
print(f"吸収領域: {color_range}")
print(f"\n導電性高分子の典型的Eg: 1.5-3.0 eV")
return wavelengths, absorbance
# 実行例:Eg = 2.5 eV(PEDOT:PSS相当)
calculate_bandgap_absorption(bandgap_eV=2.5)
4.2 生体適合性高分子
生体適合性高分子(Biocompatible Polymers)は、生体組織と接触しても毒性や免疫反応を引き起こさない材料です。代表例はPEG(ポリエチレングリコール)、ポリ乳酸(PLA)、PLGA(ポリ乳酸-グリコール酸共重合体)です。
4.2.1 薬物放出カイネティクス
生分解性高分子からの薬物放出は、拡散と分解の競合で決定されます。以下では、Korsmeyer-Peppasモデルで放出挙動を解析します。
import numpy as np
import matplotlib.pyplot as plt
# 薬物放出カイネティクス
def simulate_drug_release_kinetics(model='Korsmeyer-Peppas'):
"""
生分解性高分子からの薬物放出をシミュレート
Parameters:
- model: 放出モデル('Korsmeyer-Peppas', 'Higuchi', 'First-order')
Returns:
- time: 時間(時間)
- release_fraction: 累積放出率(%)
"""
# 時間範囲(時間)
time = np.linspace(0, 48, 500)
# Korsmeyer-Peppasモデル: Mt/M∞ = k * t^n
# n: 拡散指数(n=0.5: Fickian拡散, n=1.0: Case II, 0.5
4.2.2 生分解速度解析
ポリ乳酸(PLA)などの生分解性高分子は、加水分解により分解します。分子量低下は一次反応でモデル化できます。
import numpy as np
import matplotlib.pyplot as plt
# 生分解速度シミュレーション
def simulate_biodegradation(polymer='PLA', temperature=310):
"""
生分解性高分子の分解速度をシミュレート
Parameters:
- polymer: 高分子名('PLA', 'PLGA', 'PCL')
- temperature: 温度(K)
Returns:
- time: 時間(日)
- molecular_weight: 分子量(相対値)
"""
# 分解パラメータ(Arrhenius式)
# k = k0 * exp(-Ea/RT)
polymer_params = {
'PLA': {'k0': 1e10, 'Ea': 80000}, # J/mol
'PLGA': {'k0': 1e11, 'Ea': 75000},
'PCL': {'k0': 1e9, 'Ea': 85000}
}
params = polymer_params.get(polymer, polymer_params['PLA'])
k0 = params['k0']
Ea = params['Ea']
R = 8.314 # J/mol·K
# 速度定数(1/日)
k = k0 * np.exp(-Ea / (R * temperature)) * 86400 # 秒→日変換
# 時間範囲(日)
time = np.linspace(0, 365, 500)
# 一次分解: Mw(t) = Mw0 * exp(-k*t)
Mw0 = 100000 # 初期分子量(g/mol)
molecular_weight = Mw0 * np.exp(-k * time)
# 可視化
plt.figure(figsize=(14, 5))
# サブプロット1:分子量低下
plt.subplot(1, 3, 1)
for poly_name, poly_params in polymer_params.items():
k_poly = poly_params['k0'] * np.exp(-poly_params['Ea'] / (R * temperature)) * 86400
Mw_t = Mw0 * np.exp(-k_poly * time)
plt.plot(time, Mw_t / 1000, linewidth=2, label=poly_name)
plt.xlabel('Time (days)', fontsize=12)
plt.ylabel('Molecular Weight (kDa)', fontsize=12)
plt.title(f'Biodegradation at {temperature}K ({temperature-273.15:.0f}°C)', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
plt.yscale('log')
# サブプロット2:温度依存性
plt.subplot(1, 3, 2)
temperatures = [298, 310, 323] # K(25, 37, 50°C)
for T in temperatures:
k_T = k0 * np.exp(-Ea / (R * T)) * 86400
Mw_T = Mw0 * np.exp(-k_T * time)
plt.plot(time, Mw_T / 1000, linewidth=2, label=f'{T-273.15:.0f}°C')
plt.xlabel('Time (days)', fontsize=12)
plt.ylabel('Molecular Weight (kDa)', fontsize=12)
plt.title(f'{polymer}: Temperature Dependence', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
plt.yscale('log')
# サブプロット3:分解率(質量残存率)
plt.subplot(1, 3, 3)
# 分解率 = (Mw0 - Mw(t)) / Mw0 * 100
degradation_percent = (1 - molecular_weight / Mw0) * 100
plt.plot(time, degradation_percent, 'b-', linewidth=2)
plt.axhline(50, color='red', linestyle='--', linewidth=1.5, label='50% Degradation')
# 50%分解時間
t_50 = -np.log(0.5) / k
plt.axvline(t_50, color='green', linestyle='--', linewidth=1.5,
label=f't₅₀ = {t_50:.0f} days')
plt.xlabel('Time (days)', fontsize=12)
plt.ylabel('Degradation (%)', fontsize=12)
plt.title(f'{polymer}: Degradation Progress', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
plt.tight_layout()
plt.savefig('biodegradation.png', dpi=300, bbox_inches='tight')
plt.show()
# 結果出力
print(f"=== {polymer}生分解解析({temperature}K = {temperature-273.15:.0f}°C)===")
print(f"初期分子量 Mw0: {Mw0/1000:.0f} kDa")
print(f"活性化エネルギー Ea: {Ea/1000:.0f} kJ/mol")
print(f"分解速度定数 k: {k:.2e} 1/day")
print(f"50%分解時間 t₅₀: {t_50:.0f} 日")
print(f"90%分解時間 t₉₀: {-np.log(0.1)/k:.0f} 日")
return time, molecular_weight
# 実行例:PLA、37°C(体温)
simulate_biodegradation('PLA', temperature=310)
4.3 刺激応答性高分子
刺激応答性高分子(Stimuli-Responsive Polymers)は、温度、pH、光などの外部刺激に応答して構造や物性を変化させます。代表例はPNIPAM(ポリN-イソプロピルアクリルアミド)で、LCST(下限臨界共溶温度)を示します。
4.3.1 LCST計算(Flory-Huggins理論)
LCSTは、Flory-Huggins相互作用パラメータχが温度依存性を持つことで説明されます:
\[ \chi = A + \frac{B}{T} \]
import numpy as np
import matplotlib.pyplot as plt
# LCST計算(Flory-Huggins理論)
def calculate_lcst_flory_huggins(polymer='PNIPAM'):
"""
Flory-Huggins理論に基づくLCST相図を計算
Parameters:
- polymer: 高分子名('PNIPAM', 'PEO')
Returns:
- temperatures: 温度(K)
- volume_fractions: 体積分率
"""
# Flory-Hugginsパラメータ(温度依存性)
# χ(T) = A + B/T
polymer_params = {
'PNIPAM': {'A': -12.0, 'B': 4300}, # K
'PEO': {'A': -15.0, 'B': 5000}
}
params = polymer_params.get(polymer, polymer_params['PNIPAM'])
A = params['A']
B = params['B']
# 体積分率範囲
phi = np.linspace(0.01, 0.99, 100)
# 重合度(高分子/溶媒)
N = 1000 # 高分子重合度
# スピノダル曲線(二次微分 = 0)
# d²ΔGmix/dφ² = 0 → χ_spinodal = 0.5 * (1/(N*φ) + 1/(1-φ))
chi_spinodal = 0.5 * (1 / (N * phi) + 1 / (1 - phi))
# 温度計算(χ = A + B/T から T = B / (χ - A))
temperatures_spinodal = B / (chi_spinodal - A)
# 臨界点(φ = 1/√(N+1) ≈ 1/√N)
phi_critical = 1 / np.sqrt(N + 1)
chi_critical = 0.5 * (1 + 1/np.sqrt(N))**2
T_critical = B / (chi_critical - A)
# 可視化
plt.figure(figsize=(14, 5))
# サブプロット1:相図
plt.subplot(1, 3, 1)
plt.plot(phi * 100, temperatures_spinodal - 273.15, 'b-', linewidth=2, label='Spinodal Curve (LCST)')
plt.scatter([phi_critical * 100], [T_critical - 273.15], s=200, c='red',
edgecolors='black', linewidths=2, zorder=5, label=f'Critical Point ({T_critical-273.15:.1f}°C)')
plt.fill_between(phi * 100, temperatures_spinodal - 273.15, 100, alpha=0.3, color='red',
label='Two-Phase Region')
plt.fill_between(phi * 100, 0, temperatures_spinodal - 273.15, alpha=0.3, color='green',
label='Single-Phase Region')
plt.xlabel('Polymer Volume Fraction φ (%)', fontsize=12)
plt.ylabel('Temperature (°C)', fontsize=12)
plt.title(f'{polymer} LCST Phase Diagram', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
plt.ylim(0, 100)
# サブプロット2:χパラメータの温度依存性
plt.subplot(1, 3, 2)
T_range = np.linspace(273, 373, 100) # K
chi_T = A + B / T_range
plt.plot(T_range - 273.15, chi_T, 'purple', linewidth=2)
plt.axhline(chi_critical, color='red', linestyle='--', linewidth=1.5,
label=f'χ_crit = {chi_critical:.3f}')
plt.axvline(T_critical - 273.15, color='green', linestyle='--', linewidth=1.5,
label=f'LCST = {T_critical-273.15:.1f}°C')
plt.xlabel('Temperature (°C)', fontsize=12)
plt.ylabel('Flory-Huggins Parameter χ', fontsize=12)
plt.title('Temperature Dependence of χ', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
# サブプロット3:濁度変化シミュレーション
plt.subplot(1, 3, 3)
phi_sample = 0.05 # 5% 溶液
temperatures_exp = np.linspace(10, 60, 100) # °C
chi_exp = A + B / (temperatures_exp + 273.15)
# 相分離判定(χ > χ_spinodal で相分離)
chi_spinodal_at_phi = 0.5 * (1 / (N * phi_sample) + 1 / (1 - phi_sample))
turbidity = np.where(chi_exp > chi_spinodal_at_phi, 1, 0)
plt.plot(temperatures_exp, turbidity, 'b-', linewidth=3)
plt.fill_between(temperatures_exp, turbidity, alpha=0.3, color='blue')
plt.axvline(T_critical - 273.15, color='red', linestyle='--', linewidth=1.5,
label=f'LCST = {T_critical-273.15:.1f}°C')
plt.xlabel('Temperature (°C)', fontsize=12)
plt.ylabel('Turbidity (Phase Separation)', fontsize=12)
plt.title(f'{polymer} (φ = {phi_sample*100}%): Turbidity Change', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
plt.ylim(-0.1, 1.2)
plt.tight_layout()
plt.savefig('lcst_phase_diagram.png', dpi=300, bbox_inches='tight')
plt.show()
# 結果出力
print(f"=== {polymer} LCST解析(Flory-Huggins理論)===")
print(f"Flory-Hugginsパラメータ: χ = {A} + {B}/T")
print(f"重合度 N: {N}")
print(f"臨界体積分率 φ_c: {phi_critical:.4f}")
print(f"臨界χ値: {chi_critical:.4f}")
print(f"LCST: {T_critical - 273.15:.1f}°C")
return temperatures_spinodal, phi
# 実行
calculate_lcst_flory_huggins('PNIPAM')
4.3.2 pH応答性電離度計算
import numpy as np
import matplotlib.pyplot as plt
# pH応答性高分子の電離度計算
def calculate_ph_responsive_ionization(pKa=5.5):
"""
Henderson-Hasselbalch式によるpH応答性高分子の電離度を計算
Parameters:
- pKa: 酸解離定数
Returns:
- pH_values: pH値
- ionization_degrees: 電離度
"""
# pH範囲
pH_values = np.linspace(2, 10, 200)
# Henderson-Hasselbalch式
# α = 1 / (1 + 10^(pKa - pH))(弱酸性基の場合)
ionization_degree = 1 / (1 + 10**(pKa - pH_values))
# 可視化
plt.figure(figsize=(14, 5))
# サブプロット1:電離度 vs pH
plt.subplot(1, 3, 1)
pKa_values = [4.5, 5.5, 6.5]
for pKa_val in pKa_values:
alpha = 1 / (1 + 10**(pKa_val - pH_values))
plt.plot(pH_values, alpha * 100, linewidth=2, label=f'pKa = {pKa_val}')
plt.axhline(50, color='gray', linestyle='--', linewidth=1, alpha=0.7)
plt.xlabel('pH', fontsize=12)
plt.ylabel('Ionization Degree (%)', fontsize=12)
plt.title('pH-Responsive Ionization', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
# サブプロット2:膨潤比(電離度に比例)
plt.subplot(1, 3, 2)
# 膨潤比 Q ∝ α²(Donnan効果)
swelling_ratio = 1 + 10 * ionization_degree**2
plt.plot(pH_values, swelling_ratio, 'purple', linewidth=2)
plt.axvline(pKa, color='red', linestyle='--', linewidth=1.5, label=f'pKa = {pKa}')
plt.xlabel('pH', fontsize=12)
plt.ylabel('Swelling Ratio Q/Q₀', fontsize=12)
plt.title('pH-Induced Swelling', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
# サブプロット3:滴定曲線
plt.subplot(1, 3, 3)
# 滴定曲線(NaOH添加量と pH)
# 簡略化:弱酸の滴定
V_NaOH = np.linspace(0, 50, 200) # mL
# pH = pKa + log((V_NaOH) / (V_eq - V_NaOH))(V_eq: 当量点)
V_eq = 25 # mL
pH_titration = []
for V in V_NaOH:
if V < V_eq:
if V > 0:
pH_val = pKa + np.log10(V / (V_eq - V))
else:
pH_val = 3 # 初期pH(仮定)
elif V == V_eq:
pH_val = 7 # 当量点(弱酸-強塩基)
else:
pH_val = 7 + np.log10((V - V_eq) / V_eq)
pH_titration.append(pH_val)
plt.plot(V_NaOH, pH_titration, 'g-', linewidth=2)
plt.axvline(V_eq, color='red', linestyle='--', linewidth=1.5, label=f'Equivalence Point ({V_eq} mL)')
plt.axhline(pKa, color='blue', linestyle='--', linewidth=1.5, label=f'pKa = {pKa}')
plt.xlabel('Volume of NaOH (mL)', fontsize=12)
plt.ylabel('pH', fontsize=12)
plt.title('Titration Curve of pH-Responsive Polymer', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
plt.ylim(2, 12)
plt.tight_layout()
plt.savefig('ph_responsive_ionization.png', dpi=300, bbox_inches='tight')
plt.show()
# 結果出力
print("=== pH応答性高分子解析 ===")
print(f"pKa: {pKa}")
print(f"pH = pKa での電離度: 50%")
print(f"\npH値別電離度:")
for pH_target in [3, 5, 7, 9]:
idx = np.argmin(np.abs(pH_values - pH_target))
print(f" pH {pH_target}: {ionization_degree[idx]*100:.1f}%")
return pH_values, ionization_degree
# 実行
calculate_ph_responsive_ionization(pKa=5.5)
4.4 高分子電解質
高分子電解質(Polymer Electrolytes)は、イオン伝導性を示す高分子材料で、リチウムイオン電池や燃料電池に応用されます。代表例はNafion(プロトン伝導膜)です。
4.4.1 イオン伝導度のArrhenius解析
import numpy as np
import matplotlib.pyplot as plt
# イオン伝導度のArrhenius解析
def analyze_ionic_conductivity(polymer='Nafion'):
"""
高分子電解質のイオン伝導度をArrhenius式で解析
Parameters:
- polymer: 高分子名('Nafion', 'PEO-LiTFSI')
Returns:
- temperatures: 温度(K)
- conductivities: イオン伝導度(S/cm)
"""
# Arrhenius式: σ = σ0 * exp(-Ea / RT)
polymer_params = {
'Nafion': {'sigma0': 1e4, 'Ea': 15000}, # S/cm, J/mol
'PEO-LiTFSI': {'sigma0': 1e6, 'Ea': 50000}
}
params = polymer_params.get(polymer, polymer_params['Nafion'])
sigma0 = params['sigma0']
Ea = params['Ea']
R = 8.314 # J/mol·K
# 温度範囲(K)
temperatures = np.linspace(273, 373, 100)
# イオン伝導度(S/cm)
conductivities = sigma0 * np.exp(-Ea / (R * temperatures))
# 可視化
plt.figure(figsize=(14, 5))
# サブプロット1:Arrhenius プロット
plt.subplot(1, 3, 1)
for poly_name, poly_params in polymer_params.items():
sigma0_p = poly_params['sigma0']
Ea_p = poly_params['Ea']
sigma_p = sigma0_p * np.exp(-Ea_p / (R * temperatures))
plt.plot(1000 / temperatures, np.log10(sigma_p), linewidth=2, label=poly_name)
plt.xlabel('1000/T (K⁻¹)', fontsize=12)
plt.ylabel('log(σ) [S/cm]', fontsize=12)
plt.title('Arrhenius Plot of Ionic Conductivity', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(alpha=0.3)
# サブプロット2:導電率 vs 温度
plt.subplot(1, 3, 2)
plt.plot(temperatures - 273.15, conductivities, 'b-', linewidth=2, label=polymer)
plt.axhline(1e-4, color='red', linestyle='--', linewidth=1.5,
label='Target (10⁻⁴ S/cm)')
plt.xlabel('Temperature (°C)', fontsize=12)
plt.ylabel('Ionic Conductivity σ (S/cm)', fontsize=12)
plt.title(f'{polymer}: Conductivity vs Temperature', fontsize=14, fontweight='bold')
plt.yscale('log')
plt.legend()
plt.grid(alpha=0.3)
# サブプロット3:活性化エネルギー比較
plt.subplot(1, 3, 3)
poly_names = list(polymer_params.keys())
Ea_values = [polymer_params[p]['Ea'] / 1000 for p in poly_names] # kJ/mol
bars = plt.bar(poly_names, Ea_values, color=['#4A90E2', '#E74C3C'],
edgecolor='black', linewidth=2)
plt.ylabel('Activation Energy Ea (kJ/mol)', fontsize=12)
plt.title('Comparison of Activation Energies', fontsize=14, fontweight='bold')
plt.grid(alpha=0.3, axis='y')
for bar, val in zip(bars, Ea_values):
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height,
f'{val:.0f} kJ/mol', ha='center', va='bottom', fontsize=10, fontweight='bold')
plt.tight_layout()
plt.savefig('ionic_conductivity.png', dpi=300, bbox_inches='tight')
plt.show()
# 結果出力
print(f"=== {polymer}イオン伝導度解析 ===")
print(f"Arrheniusパラメータ: σ0 = {sigma0:.2e} S/cm, Ea = {Ea/1000:.1f} kJ/mol")
for T_target in [298, 323, 353]: # 25, 50, 80°C
idx = np.argmin(np.abs(temperatures - T_target))
print(f"\n温度 {T_target}K ({T_target-273.15:.0f}°C):")
print(f" イオン伝導度: {conductivities[idx]:.2e} S/cm")
return temperatures, conductivities
# 実行
analyze_ionic_conductivity('Nafion')
演習問題
演習1: 導電率計算(Easy)
ドーピングレベル30%、最大導電率500 S/cm、最適ドーピング25%のとき、導電率を簡易式σ = σ_max × (x/x_opt)で計算してください。
解答を見る
sigma_max = 500
x = 30
x_opt = 25
sigma = sigma_max * (x / x_opt)
print(f"導電率: {sigma} S/cm")
# 出力: 600 S/cm(過剰ドーピング)
演習2: バンドギャップ計算(Easy)
吸収端波長が550 nmの導電性高分子のバンドギャップ(eV)を計算してください。
解答を見る
lambda_nm = 550
Eg = 1240 / lambda_nm
print(f"バンドギャップ: {Eg:.2f} eV")
# 出力: 2.25 eV
演習3: 薬物放出時間(Easy)
Korsmeyer-Peppasモデル(k=0.1, n=0.5)で50%放出時間を計算してください。
解答を見る
k = 0.1
n = 0.5
Mt_Minf = 0.5
t_50 = (Mt_Minf / k)**(1/n)
print(f"50%放出時間: {t_50:.1f} 時間")
# 出力: 25.0 時間
演習4: LCST予測(Medium)
χ = -12 + 4300/T、臨界χ = 0.502のとき、LCSTを計算してください。
解答を見る
A = -12
B = 4300
chi_critical = 0.502
T_lcst = B / (chi_critical - A)
print(f"LCST: {T_lcst:.1f} K = {T_lcst - 273.15:.1f}°C")
# 出力: LCST: 344.0 K = 70.8°C
演習5: pH応答電離度(Medium)
pKa = 5.5の高分子をpH 7.0の溶液に浸漬したとき、電離度を計算してください。
解答を見る
pKa = 5.5
pH = 7.0
alpha = 1 / (1 + 10**(pKa - pH))
print(f"電離度: {alpha*100:.1f}%")
# 出力: 96.9%
演習6: 生分解半減期(Medium)
速度定数k = 0.005 1/dayのとき、分子量半減期を計算してください。
解答を見る
import numpy as np
k = 0.005
t_half = np.log(2) / k
print(f"半減期: {t_half:.0f} 日")
# 出力: 139 日
演習7: イオン伝導度計算(Medium)
σ0 = 1×10⁴ S/cm、Ea = 15 kJ/mol、T = 80°C(353 K)のとき、イオン伝導度を計算してください(R = 8.314 J/mol·K)。
解答を見る
import numpy as np
sigma0 = 1e4
Ea = 15000
R = 8.314
T = 353
sigma = sigma0 * np.exp(-Ea / (R * T))
print(f"イオン伝導度: {sigma:.2e} S/cm")
# 出力: 約 0.01 S/cm
演習8: 光吸収スペクトル予測(Hard)
Eg = 2.0 eVの共役高分子について、吸収端波長と主な吸収色を予測してください。また、透過光の色を推定してください。
解答を見る
Eg = 2.0
lambda_edge = 1240 / Eg
print(f"吸収端波長: {lambda_edge:.0f} nm")
print("吸収色: 赤〜緑(波長620nm以下)")
print("透過光の色: 赤(補色として赤が透過)")
# 出力: 620 nm、赤色領域まで吸収、赤色を呈する
演習9: 薬物放出制御(Hard)
24時間で80%放出を達成したい。Korsmeyer-Peppasモデル(n=0.6)でパラメータkを最適化してください。
解答を見る
import numpy as np
t_target = 24
Mt_Minf_target = 0.8
n = 0.6
k = Mt_Minf_target / (t_target**n)
print(f"最適k: {k:.4f}")
print(f"検証: Mt/M∞ = {k * (24**n):.2f}")
# 出力: k ≈ 0.0927, 24時間後80%放出
演習10: 多機能性高分子設計(Hard)
導電性(σ > 1 S/cm)と生体適合性を両立する高分子を設計してください。PEDOT-PEGコポリマーを想定し、最適組成を提案してください。
解答を見る
設計方針:
- PEDOT含量: 70-80%(導電性確保)
- PEG含量: 20-30%(生体適合性・親水性付与)
- 期待特性: σ = 1-10 S/cm、細胞接着性良好
# 最適組成シミュレーション
PEDOT_ratio = 0.75
PEG_ratio = 0.25
sigma_max_PEDOT = 1000 # S/cm
sigma_estimated = sigma_max_PEDOT * PEDOT_ratio * 0.1 # 希釈効果考慮
print(f"PEDOT: {PEDOT_ratio*100}%, PEG: {PEG_ratio*100}%")
print(f"予測導電率: {sigma_estimated:.1f} S/cm")
print("生体適合性: PEGにより細胞接着性向上")
# 出力: σ ≈ 7.5 S/cm、生体適合性良好
参考文献
- Skotheim, T. A., & Reynolds, J. R. (Eds.). (2007). Handbook of Conducting Polymers (3rd ed.). CRC Press. pp. 1-85.
- Ratner, B. D., et al. (2013). Biomaterials Science: An Introduction to Materials in Medicine (3rd ed.). Academic Press. pp. 120-195.
- Stuart, M. A. C., et al. (2010). Emerging applications of stimuli-responsive polymer materials. Nature Materials, 9, 101-113.
- Dobrynin, A. V., & Rubinstein, M. (2005). Theory of polyelectrolytes in solutions and at surfaces. Progress in Polymer Science, 30, 1049-1118.
- Mauritz, K. A., & Moore, R. B. (2004). State of understanding of Nafion. Chemical Reviews, 104(10), 4535-4585.
- Siepmann, J., & Peppas, N. A. (2001). Modeling of drug release from delivery systems. Advanced Drug Delivery Reviews, 48, 139-157.
次章への接続
第5章では、本シリーズで学んだ全ての知識を統合し、Pythonによる実践的ワークフローを構築します。RDKitによる高分子構造生成、機械学習によるTg予測、MDシミュレーションデータ解析、そしてPolyInfoなどのデータベース連携まで、実務で即戦力となるスキルを習得します。