プログラミングを頑張る土木系専攻大学院生のブログ

主にプログラミングについて開発備忘録的な形で投稿しています。

【Pythonの curve_fit関数学ぶ】Haldane式のフィッティングと分解速度解析

この記事では、Haldane式を用いた分解速度のフィッティングを例に、curve_fit関数を用いたPythonでの、フィッティングの実装方法を詳しく解説します。

実際のデータを使いながら、解説していきます

① フィッティングとは

フィッティング(fitting)とは、
実験や観測で得られたデータに対して、理論式や経験式のパラメータを最適化し、
「データに最もよく合うように数式の形を決める」作業のことです。

フィッティングの目的と流れ

  • 目的
    実験データから、現象を説明する数式(モデル)のパラメータを推定し、
    その現象の特徴や傾向を定量的に理解することです。

  • 流れ

    1. 実験や観測で得られたデータ(例:濃度と反応速度)を用意する
    2. そのデータを説明できるモデル式(例:Haldane式)を選ぶ
    3. モデル式のパラメータ(例:最大比速度や阻害定数など)を調整し、
      実測値とモデル値のズレが最小になるようにする
    4. 最適化されたパラメータを使って、現象の理解や予測に役立てる

フィッティングのイメージ

  • データ点(青い点)が実験値
  • モデル式(赤い曲線)が理論値
  • 曲線がデータ点にできるだけ近づくように、パラメータを調整する

② Haldaneの式と分解反応の基礎知識

分解反応とは

分解反応は、微生物や酵素有機物(ここではo-クレゾール)を分解する化学反応です。
このとき、分解速度(単位時間あたりの分解量)は、基質濃度や微生物濃度などに依存します。

Haldaneの式とは

Haldaneの式は、基質阻害型酵素反応や微生物による分解速度を表す経験式の一つです。
特に、基質(ここではo-クレゾール)の濃度が高くなると、逆に分解速度が低下する現象(基質阻害)を表現できます。

Haldaneの式

[tex:v = \frac{kSX}{K_S + S + \frac{S2}{K_H}} ]

  • v:分解速度(mg/(L・h) など)
  • S:基質濃度(mg/L)
  • X:微生物濃度(ここでは活性汚泥濃度、mg/L)
  • k:最大比速度定数(定数)
  • K_S:半飽和定数(基質親和性を示す)
  • K_H:阻害定数(基質阻害の強さを示す)

Haldane式の特徴

  • Sが小さいとき(低濃度):速度はSに比例し、通常のミカエリス・メンテン式に近い
  • Sが大きいとき(高濃度):分解速度が逆に下がる(基質阻害)
  • K_Sが小さいほど基質への親和性が高い
  • K_Hが小さいほど阻害効果が強い

Pythonにおけるフィッティングの手法

curve_fit関数の使い方

Pythonでは、scipy.optimizeモジュールのcurve_fit関数を使うことで、
非線形最小二乗法によるフィッティングが簡単に行えます。

基本的な使い方

  1. モデル関数を定義
    例:def model(x, a, b): return a * x + b

  2. データを用意
    例:xdata, ydata

  3. curve_fitでパラメータ推定
    python from scipy.optimize import curve_fit params, cov = curve_fit(model, xdata, ydata, p0=[初期値a, 初期値b])

  4. paramsに最適化されたパラメータが格納される


④ 実際に問題を解いてみる

問題文

活性汚泥 2000 mg/L によりo-クレゾールを分解する。
下記のデータ(o-クレゾール濃度と初期分解速度)に対して、
Haldaneの式
v = (kSX) / (K_S + S + S^2 / K_H) (ここでX=2000 mg/L)を用い、
パラメータ k, K_S, K_H を推定せよ。

データ

o-クレゾール濃度 (mg/L) 0 10 30 50 70 150 250 350
初期分解速度 (mg/(L・h)) 0.0 2.0 6.0 7.2 7.0 5.5 4.0 3.2

アプローチ

  1. データをpandasで読み込む
  2. Haldane式の関数を定義する(X=2000を代入済み)
  3. curve_fitでパラメータ(k, K_S, K_H)を推定する
  4. 推定結果を表示し、フィット曲線と実測値をグラフで比較する

コード

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

# データの準備
data = pd.DataFrame({
    "o-クレゾール濃度(mg/L)": [0, 10, 30, 50, 70, 150, 250, 350],
    "初期分解速度(mg/(L・h))": [0.0, 2.0, 6.0, 7.2, 7.0, 5.5, 4.0, 3.2]
})

S = data["o-クレゾール濃度(mg/L)"].values
v = data["初期分解速度(mg/(L・h))"].values

# Haldane式(X=2000mg/Lを代入済み)
def haldane(S, k, K_S, K_H):
    return 2000 * k * S / (K_S + S + S**2 / K_H)

# 初期値の設定(適当でOK)
p0 = [10, 10, 100]

# curve_fitによるフィッティング
params, _ = curve_fit(haldane, S, v, p0=p0)
k, K_S, K_H = params

print(f"k = {k:.3f}, K_S = {K_S:.3f}, K_H = {K_H:.3f}")

# 実測値のプロット
plt.scatter(S, v, color='blue', label='実測値')

# フィッティング曲線の描画
S_fit = np.linspace(0, max(S), 200)
v_fit = haldane(S_fit, k, K_S, K_H)
plt.plot(S_fit, v_fit, color='red', label='Haldane式フィット')

plt.xlabel("o-クレゾール濃度 S (mg/L)")
plt.ylabel("初期分解速度 v (mg/(L・h))")
plt.title("o-クレゾール分解速度とHaldane式フィット")
plt.legend()
plt.grid(True)
plt.show()

グラフ


まとめ

  • フィッティングは、実験データに理論式を当てはめてパラメータを推定する作業です。
  • Haldane式は、基質濃度が高くなると分解速度が頭打ちになり、さらに高濃度では阻害されて速度が低下する現象を表現できるモデルです。
  • Pythoncurve_fit関数を使えば、非線形モデル(Haldane式など)でも簡単にパラメータ推定ができます。
  • 実際のデータとフィット曲線をグラフで比較することで、モデルの妥当性も視覚的に確認できます。

ぜひご自身のデータでも試してみてください!