MINC/工具/emma/emma-拟合
外观
在许多情况下,需要将非线性函数拟合到测量数据,MATLAB 提供了一个非常灵活的平台来执行此分析。本文档提供了一个对标准双室血流模型进行最小二乘拟合的示例
其中 K1 是血管流向组织的速率常数,k2 是组织流向血管的速率常数,A(t) 是大脑中的活性,Ca(t) 是血液中的活性。
MATLABleastsq函数随优化工具箱提供,是解决此问题的明显选择,因为它对多维问题执行非线性最小二乘拟合。请参阅 MATLAB 文档,以详细了解leastsq函数的工作原理以及它接受哪些选项。出于我们的目的,将使用它的默认容差和拟合算法(Levenberg-Marquardt)。
在 MATLAB 中执行曲线拟合有几个步骤
- 创建一个返回函数值的函数。在这个例子中,我们需要一个返回 A(t) 计算值的函数,基于给定的 K1 和 k2,以及测量的 Ca(t) 曲线。在 MATLAB 中,这非常简单
function sim = simrat (vars, times, Ca) expfun = exp(-vars(2)*times); conv = nconv(Ca, expfun, times(2)-times(1)); conv = conv (1:length(times)); sim = vars(1)*conv;
这个简短的函数在给定拟合变量(在本例中,K1=vars(1), 和 k2=vars(2)), 一个时间向量,以及一个 Ca 值向量的情况下,返回 A(t) 的值。第一行计算方程的指数部分,第二行计算卷积,第三行将卷积剪切到我们感兴趣的长度,第四行设置返回值(K1 乘以卷积)。
- 创建一个返回残差值的函数(实际上,可以将此函数与前面的函数合并)。以下函数从前面的函数获取函数值,并返回残差
function error = fitrat (vars, ts_even, plasma_even, brain_even) sim = simrat (vars, ts_even, plasma_even); error = brain_even - sim;
- 调用leastsq, 传递返回残差的函数名称
[final, options, f, j] = leastsq ('fitrat', [K1 k2], [], [], ... ts_even, plasma_even, brain_even);
leastsq将调用函数 fitrat 获取残差,并按顺序传递 [K1 k2](将在 vars 中接收)、ts_even、plasma_even 和 brain_even。该leastsq函数在 final 中传递回最终参数(解),选项向量(给出诸如迭代次数等信息),以及解处的残差和雅可比矩阵。
- 通过调用 MATLAB 获取 95% 的置信区间confint函数(也来自优化工具箱)。
[conf, var] = confint (final, f, j);
此函数接受最小二乘问题的解(final)、解处的残差(f)和解处的雅可比矩阵(j)。它返回 95% 的置信区间和方差(有关详细信息,请参阅 MATLAB 优化工具箱文档,或在 MATLAB 中键入help confint)。