0

我有一个函数,三个指数的总和:

F = f1*exp1 + f2*exp2 + f3*exp3

确切地:

F=1-((1-f(2)-f(3)).*(exp(-abs(data)./a(1)))+((1-f(1)-f(3)).*(exp(-abs(data)./a(2))))+((1-f(1)-f(2)).*(exp(-abs(data)./a(3)))));

其中 f1, f2, f3 是分数,每个 exp 有一个参数,称为 a1, a2 和 a3。

因此,将此函数拟合到实验数据会给出六个参数(f1、f2、f3、a1、a2、a3)。

注意

a1 > a2 > a3

f1 + f2 + f3 = 1

拟合完成了几个时滞(称为 t1、t2、t3....)。因此,对于每个时间延迟,都有一组六个参数。

参数 a1、a2 和 a3 以线性方式随时间延迟增加(a1(t1) < a1(t2) < a1(t3)... 等等)。每个时滞的分数都是相同的。

我需要的是 a1(t)、a2(t)、a3(t) 和分数的斜率。问题是,当我为每个时滞拟合函数时,我经常遇到 a1 和 a2 很好地上升(完美的线性拟合)但 a3 下降的情况。我也有分数的问题 - 我不能取每个分数的平均值,因为当我添加 f1(t) + f2(t) + f3(t) 时,它永远不会等于 1。

有没有(简单的)方法可以“一次”全部安装?怎么做?谢谢!

4

1 回答 1

0

首先,我建议减少参数的数量:

  • 将 f3 替换为 1-f1-f2
  • 如果 ai(t) 始终是线性的,则替换为 ai(t) = ai0 + bi*t。当 bi>0 时,您可以确保 ai(t) 增加。

这为每个 ai(t) 提供了两个参数,加上每个时间点的 f1 和 f2,所以总共有 6 + 2 * (# of timepoints) 参数。fmincon根据Chris Taylor 的建议,根据时间点的数量,可能适合那些。

使用fmincon,您可以以非常灵活的方式添加参数约束。您可能希望将约束 0<=f1<=1 (对于 f2 也是如此)添加到您已有的约束中。

于 2011-11-25T11:01:02.583 回答