我使用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)
%
所以,请你帮我。
答案 0 :(得分:1)
您的目标函数CPET
是常数:
CPET=@(k,t) y+(vb*cp);
您已将其声明为k
和t
的函数,但y
或vb
时cp
,k
和t
均未发生变化{1}}改变。这就是为什么你的求解器没有改变答案的原因。无论k
或t
lsqcurvefit
向[{1}}提供什么值,答案总是相同的,这是错误的。
你的目标函数很长,所以让我们考虑一个更简单的函数,比如将另一个CPET
函数的二次模型拟合为另一个项(即与t
的工作方式相同)像:
O = k 1 + k 2 * t + k 3 * t 2 + C p 子>(t)的
将此目标函数写入C_P
所需的格式:
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
&#39 ;定义。