为什么 curve_fit 在不同的计算机上给出不同的结果?

问题描述 投票:0回答:1

我有以下型号:

-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。我想知道出了什么问题?

python scipy scipy-optimize
1个回答
0
投票

您有一个标准的最小二乘问题,类似于线性回归问题。

设 c、dc/dt 和 n 为数组。形成平方误差

enter image description here

对 k 和 k’ 进行偏微分,并将其设置为 0(旨在最小化 S2)。

enter image description here

给出两个联立线性方程:

enter image description here

可以通过消除 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
© www.soinside.com 2019 - 2024. All rights reserved.