Matlab递归曲线拟合与自定义方程

时间:2013-04-19 14:38:27

标签: matlab recursion curve-fitting

我有一条曲线IxV。我还有一个方程式,我想在这个IxV曲线中拟合,所以我可以调整它的常量。它由下式给出:

I = I01(exp((V-R*I)/(n1*vth))-1)+I02(exp((V-R*I)/(n2*vth))-1)

vthR是已知的常量,因此我只想实现I01I02n1n2。问题是:正如你所看到的,我依赖自己。我试图使用曲线拟合工具箱,但它似乎不适用于递归方程。

有没有办法让曲线拟合工具箱对此起作用?如果没有,我该怎么办?

2 个答案:

答案 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)

假设I01I02是变量而不是函数,那么你应该像这样设置问题:

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为零(最小化)的点。