如何使用scipy和matplotlib来拟合反向S型函数

时间:2019-05-08 19:53:48

标签: python matplotlib scipy

我有一些可以成功绘制图形的数据点,但是现在我想对数据拟合曲线。我调查了其他stackoverflow答案,发现了一些问题,但似乎无法实现它们。我知道该功能是反向S型。

我想使用这个希尔方程:https://imgur.com/rYqEASm

到目前为止,我尝试使用curve_fit()包中的scipy函数来查找参数,但是我的代码总是会中断。

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

x = np.array([1, 1.90, 7.70, 30.10, 120.40, 481.60, 1925.00, 7700.00])
y = np.array([4118.47, 4305.79, 4337.47, 4838.11, 2660.76, 1365.05, 79.21, -16.40])

def fit_hill(t,b,s,i,h):
    return b + ((t-b)/(1 + (((x * s)/i)**-h)))

plt.plot(x,y, 'o')
plt.xscale('log')
plt.show()

params = curve_fit(fit_hill, x, y)

[t,b,s,i,h] = params[0]

1 个答案:

答案 0 :(得分:1)

fit_hill应该具有6个参数。 (请参阅https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html

fit_hill(x,t,b,s,i,h)。 您应该尝试对参数进行初步猜测。

例如,在您的模型中,当x = 0时,值为t。因此,您可以将x = 0处的值设置为t的估算值。

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

x = np.array([1, 1.90, 7.70, 30.10, 120.40, 481.60, 1925.00])
y = np.array([4118.47, 4305.79, 4337.47, 4838.11, 2660.76, 1365.05, 79.21])

def fit_hill(x,t,b,s,i,h):
    return b + ((t-b)/(1 + (((x * s)/i)**-h)))

plt.plot(x,y, 'o')
popt,pcov = curve_fit(fit_hill, x, y,(4118,200,1,1900,-2))
plt.plot(x,fit_hill(x,*popt),'+')

plt.xscale('log')
plt.show()

您是否绘制了模型以可视化它是否适合您的数据?

只能在s / i中使用的

s和i可以用模型中的一个变量替换。