我有一条曲线IxV
。我还有一个方程式,我想在这个IxV
曲线中拟合,所以我可以调整它的常量。它由下式给出:
I = I01(exp((V-R*I)/(n1*vth))-1)+I02(exp((V-R*I)/(n2*vth))-1)
vth
和R
是已知的常量,因此我只想实现I01
,I02
,n1
,n2
。问题是:正如你所看到的,我依赖自己。我试图使用曲线拟合工具箱,但它似乎不适用于递归方程。
有没有办法让曲线拟合工具箱对此起作用?如果没有,我该怎么办?
答案 0 :(得分:0)
不,CFTB无法适应这种递归定义的函数。而且我的错误,因为我的真实价值在任何一点都是未知的,会在变量问题中产生一种错误。你所拥有的只是我的“测量”值。
I中的错误问题可能很严重,因为I中的任何错误,或者缺乏拟合,噪声,模型问题等都将在表达式中使用。然后你取消这些不准确的值,可能会造成混乱。
您可以使用迭代方法。因此像
% 0. Initialize I_pred
I_pred = I;
% 1. Estimate the values of your coefficients, for this model:
% (The curve fitting toolbox CAN solve this problem, given I_pred)
I = I01(exp((V-R*I_pred)/(n1*vth))-1)+I02(exp((V-R*I_pred)/(n2*vth))-1)
% 2. Generate new predictions for I_pred
I_pred = I01(exp((V-R*I_pred)/(n1*vth))-1)+I02(exp((V-R*I_pred)/(n2*vth))-1)
% Repeat steps 1 and 2 until the parameters from the CFTB stabilize.
只有当您的起始值良好且模型/数据中没有大的错误/噪声时,上述伪代码才有效。即使在美好的一天,上述方法可能也不会很好地融合。但我看不到其他希望。
答案 1 :(得分:0)
假设I01
和I02
是变量而不是函数,那么你应该像这样设置问题:
a0 = [I01 I02 n1 n2];
MinFun = @(a) abs(a(1)*(exp(V-R*I)/(a(3)*vth))-1) + a(2)*(exp((V-R*I)/a(4)*vth))-1) - I);
aout = fminsearch(a0,MinFun);
通过减去I并取绝对值,双方相等的点将是MinFun
为零(最小化)的点。