Подгонка функции с помощью lsqcurvefit
Я использую lsqcurvefit, чтобы соответствовать своей функции. Моя функция:
C_PET (t)=(k_1/(α_2+α_1 ) [(k_3+k_4-α_1 ) e^((-α_1 t) )+(α_2-k_3-k_4 ) e^((-α_2 t) ) ]* C_P (t))+vC_b (t)
Я пошел, чтобы найти решение, означающее наилучшее соответствие моим K-параметрам. Проблема в том, что решение, которое дает мой код, является отправной точкой. это код (vb является константой, cp, ydata, t являются вектором
k0 = 1*ones(1,4);
k0(4) = 0;
k0 = [0.8,0.1,0.5,0.07]
a1=[k0(2)+k0(3)+k0(4)+sqrt(((k0(2)+k0(3)+k0(4)).^2) -4*k0(2)*k0(4))]/2;
a2=[k0(2)+k0(3)+k0(4)-sqrt(((k0(2)+k0(3)+k0(4)).^2) -4*k0(2)*k0(4))]/2;
l1=(k0(1)/(a2+a1))*(k0(3)+k0(4)-a1) l2=(a2-k0(3)-k0(4))
l2=(a2-k0(3)-k0(4))
y=conv((l1*exp(-a1*t)+l2*exp(-a2*t)),cp);
y=(y(1:numel(t)));
CPET=@(k,t) y+(vb*cp);
[xfitted,errorfitted] = lsqcurvefit(CPET,k0,t,ydata)
%
Так что, пожалуйста, вы можете помочь мне.
1 ответ
Ваша целевая функция CPET
является константой:
CPET=@(k,t) y+(vb*cp);
Вы объявили это как функцию k
а также t
но ни y
, vb
ни cp
изменить когда k
или же t
менять. Вот почему ваш решатель не меняет ответ. Независимо от того, какие значения k
или же t
lsqcurvefit
кормит CPET
ответ всегда один и тот же, что неверно.
Ваша целевая функция очень длинная, поэтому давайте рассмотрим гораздо более простую, скажем, подгонку квадратичной модели, которая имеет другую функцию t
как другой термин (т.е. так же, как ваш C_P
работает) как то так:
O = k1 + k2* t + k3* t2 + CP(t)
Чтобы записать эту целевую функцию в форму, ожидаемую lsqcurvefit
делать:
O = @(k,t) k(1) + k(2).*t + k(3).*t.^2 + CP(t)
Сейчас CP
выше может быть вектор CP, если и только если t
всегда будет натуральным числом. Однако было бы гораздо разумнее создать функцию под названием CP
это занимает t
в качестве входа. Например, может быть, все CP
это взять синус t
затем
CP = @(t)sin(t); %// This needs to be declared before O
Вы должны написать свой CPET
Схожий как функция k
а также t
и он должен использовать оба k
а также t
в его определении.