見出し画像

Scipyのcurve_fitを使用した非線形曲線Y=ax/x+bへの近似方法

はじめに

生化学でよく出てくる酵素反応の経時変化を,下記の式への近似する。

まずはモジュールのimport

# import module
import numpy as np
import matplotlib.pyplot as plt

数値例を作成
(X値,0から360までの範囲で,上記のような曲線に近いY値が得られたという想定)。

X = [0,10,20,30,60,120,180,240,300,360]
y = [0,6,15,19,43,58,62,64,66,68]

実際にプロットして確認

# X yを プロット

fig, ax = plt.subplots(figsize = (7,5))
ax.plot(X, y, marker="o", linewidth=0, color='gray')
ax.set(xlabel=(''), ylabel=(''))
plt.show()

Y = ax/(x + b)への近似

#scipyのcurve_fitをimport
from scipy.optimize import curve_fit

#近似する式を定義
def nonlinear_fit(x,a,b):
    return a*x/(b+x)

#curve fittingの実施
param, cov = curve_fit(nonlinear_fit, X, y)

#paramにaとbの値[a,b]という形で入っているので確認する

print('[a,b]=')
print(param)

つまり…

という式に近似できることがわかった。

上式の曲線をプロット

まずは0から360までのXの値を100point取る

x_curveplot = np.linspace(0,360,100)
     # np. linespace(始点,終点,値の数)という形

確認すると0から100まで等間隔に100点取られていることがわかる
( len(x_curveplot)として値の数を調べると100と出る )。

x_curveplot

個々のx値における上記曲線のY値(ax/x+b)を計算する

y_curveplot = param[0]*x_curveplot/(param[1] + x_curveplot)
#上記paramの一つめの値(a)をparam[0]で,2つめの値(b)をparam[1]で呼び出している。

近似曲線のプロット

fig, ax = plt.subplots(figsize = (7,5))
ax.plot(x_curveplot, param[0]*x_curveplot/(param[1] + x_curveplot), \
ls = '-', linewidth = 1 , color = 'black')
plt.show()

近似曲線とともにX,yデータをプロット


fig, ax = plt.subplots(figsize = (7,5))
ax.plot(x_curveplot, param[0]*x_curveplot/(param[1] + x_curveplot),\
ls = '-', linewidth = 1 , color = 'black')
ax.plot(X,y, marker = 'o', markersize = 6, ls= '', color = 'black')
plt.show()

[完成]


おまけ:
上で行ったものを統合したもの

#!/usr/bin/env python
# coding: utf-8

## Non-linear regression
# import module
import numpy as np
import matplotlib.pyplot as plt

#数値データ例
X = [0,10,20,30,60,120,180,240,300,360]
y = [0,6,15,19,43,58,62,64,66,68]


# X yを プロット
fig, ax = plt.subplots(figsize = (7,5))
ax.plot(X, y, marker="o", linewidth=0, color='gray')
ax.set(xlabel=(''), ylabel=(''))
plt.show()

#次の式に近似する
# Y = ax/x+b

#近似にはscipyのcurve_fitを使用する
from scipy.optimize import curve_fit

#近似する式を定義
def nonlinear_fit(x,a,b):
    return a*x/(b+x)

#curve fitting
param, cov = curve_fit(nonlinear_fit, X, y)

#paramにaとbを確認
print('[a,b]=')
print(param)

#上記式の曲線に乗る値を作成
x_curveplot = np.linspace(0,360,100)
y_curveplot = param[0]*x_curveplot/(param[1] + x_curveplot)
#()上記paramの一つめの値(a)をparam[0]で2つめの値(b)をparam[1]で呼び出している。)

# 曲線のプロット
fig, ax = plt.subplots(figsize = (7,5))
ax.plot(x_curveplot, param[0]*x_curveplot/(param[1] + x_curveplot),ls = '-', linewidth = 1 , color = 'black')
plt.show()

# 曲線+最初に得た数値データ
fig, ax = plt.subplots(figsize = (7,5))
ax.plot(x_curveplot, param[0]*x_curveplot/(param[1] + x_curveplot), ls = '-', linewidth = 1 , color = 'black')
ax.plot(X,y, marker = 'o', markersize = 6, ls= '', color = 'black')
plt.show()


#以上


この記事が気に入ったらサポートをしてみませんか?