MATLAB: многофункциональный фитинг - PullRequest
0 голосов
/ 24 ноября 2011

У меня есть функция, сумма трех показателей:

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 - дробь, и у каждого выражения есть один параметр, назовите его 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 (t), a2 (t), a3 (t) и дробей. Проблема в том, что, когда я подгоняю функцию для каждого временного интервала, у меня часто возникает ситуация, когда a1 и a2 приятно повышаются (идеальное линейное соответствие), но a3 понижается. Также у меня есть проблема с дробями - я не могу взять среднее значение для каждой дроби, потому что когда я добавляю f1 (t) + f2 (t) + f3 (t), она никогда не равна 1.

Есть ли какой-нибудь (простой) способ уместить все сразу? Как это сделать? Спасибо!

1 Ответ

0 голосов
/ 25 ноября 2011

Сначала я бы предложил уменьшить количество параметров:

  • Заменить f3 на 1-f1-f2
  • Если ai (t) всегда линейно, заменить на ai (t) = ai0 + bi * t. При bi> 0 вы можете убедиться, что ai (t) увеличивается.

Это дает вам два параметра для каждого ai (t), плюс f1 и f2 для каждой временной точки, так что всего 6 + 2 * (количество временных точек) параметров. В зависимости от количества временных точек, может быть возможно подобрать те, которые имеют fmincon, как предложил Крис Тейлор.

С помощью fmincon вы можете добавлять ограничения параметров довольно гибкими способами. Возможно, вы захотите добавить ограничение 0 <= f1 <= 1 (и то же самое для f2) к тем, которые у вас уже есть. </p>

...