如何通过拟合包含数值计算整数的函数来优化一组给定数据的参数?

问题描述

我想拟合一个函数 f(x; k_1,k_2) 其中 f 是一个函数,它包含一个数值计算的整数,参数 k_1 和 k_2,我想针对一组给定的数据进行优化。

下面是函数的定义:

enter image description here

下面是函数 f(x) 对于 k_1 和 k_2 的任意固定值的样子:

def dgdx(g,x):
    k_1 = 1e7
    k_2 = 10
    return k_1*g**(1/2)-k_2*g
g_0 = 1e10
x = np.linspace(0,1,101)
g = odeint(dgdx,g_0,x)
a=10
b=100
f = a*(g)**(1/2)+b
plt.plot(x,f,'-')

enter image description here

我的问题在标题中。为了解决它,我写了下面的代码,但它导致内核死亡:

def dgdx(x,k_1,k_2):
    return k_1*(g(x,k_2))**(1/2)-k_2*g(x,k_2)

def g(x,k_2):
    return quad(dgdx,args=(k_1,k_2))

def f(x,k_2):
    a=10
    b=100
    return a*(g(x,k_2))**(1/2)+b

x_given = np.linspace(0,101)
y_given = f(x_given,1e7,10)+0.2*np.random.normal(size=len(x_given))

params,extras = curve_fit(f,x_given,y_given)

print("k_1=%g,k_2=%g" % (params[0],params[1]))

plt.plot(x_given,y_given,'o')
plt.plot(x_given,f(x,params[0],params[1]))

或者,我也尝试了下面的代码,但出现错误:超出最大递归深度。

def dgdx(x,k_2):
    return odeint(dgdx(x,k_2),x)

def f(x,params[1]))

解决方法

库 lmfit 支持拟合 ODE。