0

我有一条曲线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. 问题是:如你所见,我依赖于自己。我试图使用曲线拟合工具箱,但它似乎不适用于递归方程。

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

4

2 回答 2

0

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

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

于 2013-04-19T18:18:23.477 回答
0

不,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.

仅当您的起始值良好且模型/数据中没有大的错误/噪音时,上述伪代码才会起作用。即使在美好的一天,上述方法也可能不会很好地收敛。但除此之外,我看不到希望。

于 2013-04-19T14:47:59.083 回答