pandas 使用等于0且无法转换为形式f(x)= x的函数拟合数据

jyztefdp  于 2022-12-10  发布在  其他
关注(0)|答案(1)|浏览(122)

我在一个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值,并绘制它呢?

nr7wwzry

nr7wwzry1#

我自己会找到答案。
首先我把函数的y值p作为第一个参数,我用lmfit参数类作为参数,Lmfit参数基本上就是字典。

p_solvable = lambda p,T,parameter : function(p,T,parameter["p0"],parameter["v"],...)

然后我用scipy.optimize.root_scalar用brentq方法求解方程。brentq方法需要括号,其中符号是变化的。我选择1作为下限,所以np.log(1-p〉0)被定义,而最大值的两倍作为上限。

p_max = np.max(p)

def p(T):
   P_Init = [root_scalar(p_solvable,args=(T,parameter), method="brentq", bracket=[1,p_max*2]).root for T in T]
   return P_Init

现在我有了一个函数,可以输入f(x)= y并使用lmfit或scipy curve_fit进行拟合

相关问题