実験の測定値をシグモイド曲線にフィッティングしたいのですが,下図のように曲線が直角になってしまいます。
使用しているコードのうち,フィッティングを行っている部分は以下のように書いています。
Python
1import matplotlib.pyplot as plt 2import csv 3import numpy as np 4import pandas as pd 5time = data["day.1"] 6E = data["E.1"] 7 8N = len(E) 9e = max(E)-E 10 11de_e = np.zeros(N-1) 12e_slope = np.zeros(N-1) 13 14## object input 15for n in range(N-1): 16 de_e[n] = e[n+1]-e[n] 17 e_slope[n] = de_e[n]/(time[n+1]-time[n]) 18 19##approximation 20from scipy.optimize import curve_fit 21e_rmax = max(e_slope) 22e_Tinf = time[np.argmax(e_slope)] 23x = time; y = e ;z = max(e)-min(e) 24 25###defining your fitfunction 26def func(x, A, B): 27 return z/(1+ np.exp(-A * (x-B))) 28 29###guess some start values 30initialGuess=[e_rmax,e_Tinf] 31guessedFactors=[func(x,*initialGuess) for x in time] 32###making the actual fit 33popt,pcov = curve_fit(func, time, y, initialGuess) 34#one may want to 35 36E_rmax = popt[0] 37E_Tinf = popt[1] 38E_dC = max(e)-min(e) 39 40#近似曲線 41t_E = np.arange(0, 15, 0.1) 42p_E = max(E)-(max(e)-min(e))/(1+ np.exp(-popt[0]*(t_E - popt[1]))) 43 44ax2.scatter(time,E,color="red",label="⊿E",s=10,zorder=1) 45ax2.plot(t_E,p_E,color="grey",marker="", linewidth = 1.0,zorder=0) 46
元データは以下の通りです。
day.1 E.1
0 1.0 0.000000
1 2.0 7.545589
2 3.0 5.371153
3 3.5 1.667747
4 4.5 6.016085
5 5.0 25.000000
6 5.5 42.660328
7 6.0 51.000000
8 6.5 60.464650
9 7.5 63.169740
10 8.5 62.563373
11 9.5 65.173223
12 10.0 59.794710
また,出力グラフの上部にはこのようなエラーが出ていました。
OptimizeWarning: Covariance of the parameters could not be estimated
category=OptimizeWarning)
RuntimeWarning: overflow encountered in exp
[<matplotlib.lines.Line2D at 0x7f847b6602d0>]
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/30 09:31