我有以下型号:
-dc/dt = kc(t) - k'n(t)
我使用 CuPy 根据模拟轨迹计算 c(t) 和 n(t)。然后,我通过 curve_fit 计算 k 和 k',通过以下代码:
# compute dc/dt
dc_dt = np.gradient(c_t, times)
# define the model function
def model(t, k, k_prime):
return -k * np.array(c_t) + k_prime * np.array(n_t)
initial_guess = [0.5, 0.5]
bounds = ([0.0, 0.0], [np.inf, np.inf])
# fit the model to the data
params, covariance = curve_fit(model, times, dc_dt)
k1_optimized, k2_optimized = params
但是,对于所有温度,k' = k2 = 1.0,这是不正确的。
我尝试将 c(t) 和 n(t) 结果保存到 Excel 工作表中,并在另一台计算机中计算 k1 和 k2;在这种情况下,k2 不是 1.0。我想知道出了什么问题?
您有一个标准的最小二乘问题,类似于线性回归问题。
设 c、dc/dt 和 n 为数组。形成平方误差
对 k 和 k’ 进行偏微分,并将其设置为 0(旨在最小化 S2)。
给出两个联立线性方程:
可以通过消除 k 和 k' 来解决。
代码:
import numpy as np
# Generate some data
N = 1000
times = np.linspace( 0, 1, N )
c_0 = 1
k0, k0_prime = 2, 3
n_t = 4 * np.ones( N )
c_t = c_0 * np.exp( -k0 * times ) + ( k0_prime * n_t / k0 ) * ( 1 - np.exp( -k0 * times ) )
dc_dt = np.gradient(c_t, times[1] - times[0] )
# Form relevant sums
Scc = ( c_t * c_t ).sum()
Snn = ( n_t * n_t ).sum()
Scn = ( c_t * n_t ).sum()
Scd = ( c_t * dc_dt ).sum()
Snd = ( n_t * dc_dt ).sum()
k = -( Snn * Scd - Scn * Snd ) / ( Snn * Scc - Scn * Scn )
kprime = ( Scc * k + Scd ) / Scn
print( f'k = {k:6.3f}, kprime = {kprime:6.3f}' )
输出:
k = 2.000, kprime = 3.000