跳转到内容

MINC/工具/emma/emma-拟合

来自维基教科书,开放的书籍,开放的世界

MATLAB 拟合演示

[编辑 | 编辑源代码]

在许多情况下,需要将非线性函数拟合到测量数据,MATLAB 提供了一个非常灵活的平台来执行此分析。本文档提供了一个对标准双室血流模型进行最小二乘拟合的示例

文件:Ratequation.gif

其中 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)。

华夏公益教科书