我有一条曲线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
. 问题是:如你所见,我依赖于自己。我试图使用曲线拟合工具箱,但它似乎不适用于递归方程。
有没有办法让曲线拟合工具箱对此起作用?如果没有,我该怎么办?
我有一条曲线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
. 问题是:如你所见,我依赖于自己。我试图使用曲线拟合工具箱,但它似乎不适用于递归方程。
有没有办法让曲线拟合工具箱对此起作用?如果没有,我该怎么办?
假设I01
andI02
是变量而不是函数,那么您应该像这样设置问题:
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
是零(最小化)的点。
不,CFTB 不能适应这种递归定义的函数。而 I 中的错误,由于 I 的真实值对于任何点都是未知的,因此会产生一种变量错误问题。你所拥有的只是 I 的“测量”值。
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.
仅当您的起始值良好且模型/数据中没有大的错误/噪音时,上述伪代码才会起作用。即使在美好的一天,上述方法也可能不会很好地收敛。但除此之外,我看不到希望。