- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将我的实验数据与药代动力学中非常著名的模型进行拟合。方程组相当复杂:
dC1/dt = k1*Cp - (k2+k3)*C1 + k4*C2
dC2/dt = k3*C1 - k4*C2
Ctissue = (1-vB)*(C1 + C2) + vB*Cp
vB 是一个常数,Cp 是一个数组(通过测量已知的因变量),k1、k2、k3、k4 是不同隔室之间的动力学常数,也是我希望从拟合中获得的参数。 Ctissue 是我想要与真实数据相匹配的。 C1 和 C2 是两个数组,在执行拟合后我应该能够计算它们。有一个商业软件(PKIN)可以计算这个方程组,所以我确信这是可能的,但我不知道如何用 python 实现它。
这是我的代码
tini = np.array([ 15., 45., 75., 120., 180., 240., 300., 360., 450.,
570., 690., 810., 930., 1080., 1260., 1440., 1650., 1890.,
2130., 2400., 2700., 3000., 3300., 3525.])
Ctissue = np.array([ 1.00229754, 25.06505484, 60.0265695 , 82.87576127,
68.07901198, 67.10795788, 81.42071546, 81.05644343,
100.6740041 , 90.43091176, 111.7861611 , 110.3851624 ,
116.4682562 , 126.7390119 , 133.8460856 , 132.8657165 ,
145.3951029 , 141.4012821 , 156.7317122 , 159.8293774 ,
163.609847 , 175.7823822 , 168.5340708 , 171.5013387 ])
Cp = np.array([ 13.99461153, 559.5563251 , 914.7457277 , 782.4498718 ,
574.7527458 , 521.4668956 , 412.9772775 , 421.5475443 ,
403.2700613 , 368.6237412 , 355.8405377 , 340.0395723 ,
306.9848032 , 295.0192494 , 295.0294368 , 240.9861338 ,
245.9420067 , 217.3042524 , 229.6231028 , 196.4563327 ,
190.8358096 , 190.161142 , 182.2021123 , 169.1384708 ])
vB = 0.05
# initial conditions
x10 = 0.1
x20 = 0.1
y0 = [x10, x20]
guess = [0.1,0.1,0.1,0.1]
import scipy as sp
import numpy as np
import pandas as pd
import matplotlib as mpl
from matplotlib import pyplot as plt
import math as m
from scipy.integrate import odeint
from lmfit import minimize, Parameters, Parameter, report_fit
from scipy.interpolate import interp1d
def myCp( t ):
cp = interp1d( tini, Cp )
if np.all(t < tini[0]):
out = Cp[0]
elif np.all(t > tini[-1]):
out = 0
else:
out = cp( t )
return out
def f(y, t, paras):
#define differential equations
x1 = y[0]
x2 = y[1]
try:
k1 = paras['k1'].value
k2 = paras['k2'].value
k3 = paras['k3'].value
k4 = paras['k4'].value
except KeyError:
k1, k2, k3, k4 = paras
f1 = k1*myCp( t ) - (k2+k3)*x1 + k4*x2
f2 = k3*x1 - k4*x2
return [f1, f2]
def g(t, x0, paras):
x = odeint(f, x0, t, args=(paras,))
return x
def tis2comp3(t, paras):
x0 = params['x10'].value, params['x20'].value
model = g(t, x0, paras)
x1_model = model[:, 0]
x2_model = model[:, 1]
Ct = (1-vB)*(x1_model + x2_model) + vB*myCp( t )
return Ct
def residual(paras, t, data):
Ct = tis2comp3(t, params)
return (Ct - data).ravel()
# set parameters
params = Parameters()
params.add('x10', value=x10, vary=False)
params.add('x20', value=x20, vary=False)
params.add('k1', value=guess[0], min=0.0001, max=2.)
params.add('k2', value=guess[1], min=0.0001, max=2.)
params.add('k3', value=guess[2], min=0.0001, max=2.)
params.add('k4', value=guess[3], min=0.0001, max=2.)
# fit model
result = minimize(residual, params, args=(tini, Ctissue), method='leastsq') # leastsq nelder
# check results of the fit
xfit = np.linspace(15., 3525., 100)
yfit = tis2comp3(xfit, result.params)
#plot the final optimization results
figopt = plt.figure(figsize=(10,6))
lineini, = plt.plot(tini,Ctissue, 'b', linestyle='none', marker='o', markersize=7, label='data')
lineopt, = plt.plot(xfit,yfit, 'r-', label='optimized curve')
plt.legend(handles=[lineini,lineopt])
拟合运行顺利,但拟合曲线不满意。大家还有其他意见、建议吗?
最佳答案
你的问题似乎是你使用Cp
将离散图片与准连续图片混合在一起,使用odeint
和f
如果你看的话在拟合迭代中 f
的第一个输出中,您将看到第一个输出(即 f1
)是一个数组,而第二个输出是一个数字。所以存在概念错误。
将您的 f
更改为如下所示:
import numpy as np
from matplotlib import pyplot as plt
from scipy.integrate import odeint
from scipy.interpolate import interp1d
tini = np.array([
15., 45., 75., 120., 180., 240., 300., 360., 450.,
570., 690., 810., 930., 1080., 1260., 1440., 1650., 1890.,
2130., 2400., 2700., 3000., 3300., 3525.])
Ctissue = np.array([
1.00229754, 25.06505484, 60.0265695 , 82.87576127,
68.07901198, 67.10795788, 81.42071546, 81.05644343,
100.6740041, 90.43091176, 111.7861611 , 110.3851624 ,
116.4682562, 126.7390119, 133.8460856 , 132.8657165 ,
145.3951029, 141.4012821, 156.7317122 , 159.8293774 ,
163.609847, 175.7823822, 168.5340708 , 171.5013387 ])
Cp = np.array([
13.99461153, 559.5563251 , 914.7457277 , 782.4498718 ,
574.7527458 , 521.4668956 , 412.9772775 , 421.5475443 ,
403.2700613 , 368.6237412 , 355.8405377 , 340.0395723 ,
306.9848032 , 295.0192494 , 295.0294368 , 240.9861338 ,
245.9420067 , 217.3042524 , 229.6231028 , 196.4563327 ,
190.8358096 , 190.161142 , 182.2021123 , 169.1384708 ])
vB = 0.05
def myCp( t ):
cp = interp1d( tini, Cp )
if t < tini[0]: # does this makes sense
out = Cp[0] # may require to be refined
elif t > tini[-1]:
out = Cp[-1] # same here.
else:
out = cp( t )
return out
def f( y, t, paras ):
#define differential equations
x1 = y[0]
x2 = y[1]
k1, k2, k3, k4 = paras
f1 = k1 * myCp( t ) - ( k2 + k3 ) * x1 + k4 * x2
f2 = k3 * x1 - k4 * x2
return [ f1, f2 ]
paras=[.1, .12, .14, .15 ]
sol = odeint( f, [ .1, .2], tini, args=( paras, ) )
print sol[ :, 0 ]
print sol[ :, 1 ]
应该可以。
当 odeint
检查超出 t
限制的值时,您必须弄清楚合理的外推是什么样的。
关于python - 使用 lmfit 的 2 组织 3 室模型拟合数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55202128/
我是 python 的新手,并尝试使用 lmfit 包来检查我自己的计算,但是我不确定 (1) 如何为以下测试(和 2)包含数据(sig)的错误我在 conf_interval2d 中遇到的错误如下所
我正在尝试使用 lmfit 使用 Model 和 Parameters 类查找某些随机数据的函数的最佳拟合参数。然而,它似乎并没有太多地探索参数空间。它进行了约 10 次函数评估,然后返回了糟糕的拟合
我正在尝试使用 lmfit 拟合部分数据(应该看起来像高斯),但我得到了一条线。请参见下图。 数据绘图: 我尝试过的代码如下: import matplotlib.pyplot as plt from
这是一个关于从 lmfit fit_report()( 1) 对象中提取拟合统计信息的问题 在this lmfit 示例,返回如下部分输出: [[Model]] Model(gaussian)
import matplotlib.pyplot as plt import numpy as np from lmfit.model import load_model def mysine(x,
我试图弄清楚如何使用 lmfit 进行截距估计包会产生不同的结果,具体取决于起始值。我使用 statsmodels 将估计结果与标准 OLS 估计结果进行比较。有人可以帮忙吗? 代码: from lm
我正在尝试使用 LMFIT 库进行多洛伦兹拟合,但它不起作用,我什至理解我的语法made 是完全错误的,但我没有任何新的想法。 我的问题是这样的:我有一个很长的光谱,其中包含多组峰,但这些组中峰的数量
在逼近(负)指数函数时,lmfit 的指数模型如何工作? 以下尝试关注https://lmfit.github.io/lmfit-py/model.html ,但未能提供正确的结果: mod = lm
我正在使用 lmfit python 包进行非线性优化 (url: http://lmfit.github.io/lmfit-py/)。我想知道在使用最小二乘拟合方法时是否可以传递雅可比函数?如果是,
尝试从 lmfit 拟合 ExponentialGaussianModel() 但收到以下错误消息:The input contains nan values 我在 Windows 上使用 Jupyt
我正在尝试使用 lmfit 拟合一些数据。最初,我使用了 Model 类,它基于此示例/教程运行良好: https://lmfit.github.io/lmfit-py/model.html但后来我想
我正在使用 lmfit 在 python 中进行拟合,在定义模型(即我想要用于拟合的函数)之后,我执行 out = model.fit(...)为了可视化结果,我这样做 plt.plot(x, out
我正在尝试将曲线拟合到一些数据(模型将是 3 个高斯加背景)。数据位于这篇文章的底部(不知道如何附加它),列是(x,y,err_y),err_y是y的平方根。这是我的代码: import numpy
我正在尝试使用 lmfit 包拟合一组数据。作为最小化例程,我选择了 Differential_evolution ( https://docs.scipy.org/doc/scipy-0.17.0/
有没有办法基于具有任意数量因变量的函数构建 lmfit 模型?例如: from lmfit import Model def my_poly(x, *params): func = 0 for
我在 Python 中使用 lmfit 来拟合一些数据,其中包括拟合变量 a、b 和 c。我需要确保 a 0 和 b - a > 0(或者 a - b y 的不等式约束应转换为 x = y + s
我想使用最小二乘法 (Levenberg-Marquardt) 最小化函数 f 中的 x 和 y。在 Python 中,我可以像下面这样使用 lmfit params = lmfit.Paramete
输出错误是: 最小化异常:如果没有合理的不确定性估计,则无法确定置信区间 为什么我收到这个错误?我如何计算不确定性估计并解决这个问题? for dosya1 in glob.glob("mean*")
我正在使用Python lmfit对 2005-2016 年的月平均数据进行最小二乘拟合。我构建了如下所示的函数: equation原始代码如下: # t is in fractional years
我正在尝试将模型拟合到某些数据。自变量称为 A 和 B,它们是 Pandas DataFrame 中的列。我正在尝试根据数据框中的 y 调整两个参数。 以前,使用 Scipy 的 curve_fit,
我是一名优秀的程序员,十分优秀!