我在一个Pandas数据框中有2列31行。我想绘制这些x,y数据,并将它们拟合为一个具有4个参数的复杂函数。函数看起来像这样。函数必须为0
# Data:
T,p = df["T"], df["p"] #31 rows
# known constants: a,b,Ta,c0,x
def c(T,v,VP,a=...,b=...,Ta=...,c0=...):
c = c0 + a*(T-Ta) + b*t_r(T)**v/(t_r(T)**v-K(T,VP))
return c
# t_r and K are other functions
def function(p,T,p0,v,N,VP,a,b,c0,x):
return np.log(1-p) + p + (x*c(T,v,VP))*p**2 + (p0/N)*(R-0.5*R**3) # =0
我感兴趣的是拟合参数N、p0、Vp
我尝试使用Lmfit并将函数更改为-〉function(params,T,p)
from Lmfit import minimize, Parameters
## add Parameters
params = Parameters() ##Class with a list of parameters
# add all constant Parameters with vary = False
params.add("a", value=...,vary=False)
...
## add variables to fit with vary = True, limits with min,max
params.add("N",value=..., vary=True,min=0,max=...)
...
output = minimize(function,params) #Fit Results
output.params.pretty_print() #Show Results
现在我获得了参数,但我想通过对更连续的数组绘制(T,p)来检查这是否有意义,例如:
Ts = np.linspace(10,60,1000) # x-array
ps = ... ? # y-array
plt.plot(Ts,ps,label="Fit") # Plot Data
我怎样才能得到一个函数来计算每个点上T的p值,并绘制它呢?
1条答案
按热度按时间nr7wwzry1#
我自己会找到答案。
首先我把函数的y值p作为第一个参数,我用lmfit参数类作为参数,Lmfit参数基本上就是字典。
然后我用scipy.optimize.root_scalar用brentq方法求解方程。brentq方法需要括号,其中符号是变化的。我选择1作为下限,所以np.log(1-p〉0)被定义,而最大值的两倍作为上限。
现在我有了一个函数,可以输入f(x)= y并使用lmfit或scipy curve_fit进行拟合