fit function not iterating
15 ビュー (過去 30 日間)
古いコメントを表示
I am attempting to fit a set of data with a custom function. The fit function uses my fitoptions.startpoint data, but then stops and spits out bad fit statistics.
datax = [-7.00100000000000
-6.95600000000000
-6.90600000000000
-6.85600000000000
-6.80600000000000
-6.75600000000000
-6.70700000000000
-6.65700000000000
-6.60700000000000
-6.55700000000000
-6.50700000000000
-6.45700000000000
-6.40700000000000
-6.35700000000000
-6.30700000000000
-6.25700000000000
-6.20700000000000
-6.15800000000000
-6.10800000000000
-6.05800000000000
-6.00900000000000
-5.96300000000000
-5.91400000000000
-5.86400000000000
-5.81300000000000
-5.76400000000000
-5.71300000000000
-5.66300000000000
-5.61400000000000
-5.56300000000000
-5.51400000000000
-5.46400000000000
-5.41400000000000
-5.36400000000000
-5.31400000000000
-5.26400000000000
-5.21500000000000
-5.16400000000000
-5.11000000000000
-5.06000000000000
-5.00900000000000
-4.96500000000000
-4.91600000000000
-4.86500000000000
-4.81600000000000
-4.76500000000000
-4.71600000000000
-4.66600000000000
-4.61600000000000
-4.56500000000000
-4.51600000000000
-4.46500000000000
-4.41600000000000
-4.36700000000000
-4.31700000000000
-4.26700000000000
-4.21700000000000
-4.16600000000000
-4.11700000000000
-4.06700000000000
-4.01700000000000
-3.97200000000000
-3.92200000000000
-3.87200000000000
-3.82300000000000
-3.77300000000000
-3.72300000000000
-3.67300000000000
-3.62300000000000
-3.57300000000000
-3.52300000000000
-3.47300000000000
-3.42300000000000
-3.37300000000000
-3.32300000000000
-3.27400000000000
-3.22400000000000
-3.17400000000000
-3.12400000000000
-3.07400000000000
-3.02500000000000
-2.97900000000000
-2.93000000000000
-2.88000000000000
-2.82900000000000
-2.77900000000000
-2.73000000000000
-2.67900000000000
-2.63000000000000
-2.58000000000000
-2.53100000000000
-2.48100000000000
-2.43100000000000
-2.38100000000000
-2.33100000000000
-2.28100000000000
-2.23100000000000
-2.18200000000000
-2.13200000000000
-2.08200000000000
-2.03200000000000
-1.98700000000000
-1.93700000000000
-1.88700000000000
-1.83700000000000
-1.78700000000000
-1.73700000000000
-1.68700000000000
-1.63700000000000
-1.58700000000000
-1.53700000000000
-1.48700000000000
-1.43700000000000
-1.38700000000000
-1.33700000000000
-1.28700000000000
-1.23800000000000
-1.18900000000000
-1.13900000000000
-1.08900000000000
-1.03900000000000
-0.994000000000000
-0.944000000000000
-0.894000000000000
-0.845000000000000
-0.795000000000000
-0.745000000000000
-0.695000000000000
-0.645000000000000
-0.595000000000000
-0.545000000000000
-0.495000000000000
-0.445000000000000
-0.395000000000000
-0.345000000000000
-0.295000000000000
-0.245000000000000
-0.196000000000000
-0.146000000000000
-0.0960000000000000
-0.0460000000000000]
datay = [4.75700000000000e-12
4.71700000000000e-12
4.72400000000000e-12
4.72900000000000e-12
4.78700000000000e-12
4.79900000000000e-12
4.80800000000000e-12
4.82000000000000e-12
4.83300000000000e-12
4.83900000000000e-12
4.85700000000000e-12
4.86400000000000e-12
4.87500000000000e-12
4.88800000000000e-12
4.89700000000000e-12
4.91300000000000e-12
4.92600000000000e-12
4.93600000000000e-12
4.94500000000000e-12
4.96200000000000e-12
4.96700000000000e-12
4.95200000000000e-12
4.96200000000000e-12
4.97800000000000e-12
5.02100000000000e-12
5.03100000000000e-12
5.05500000000000e-12
5.06200000000000e-12
5.07600000000000e-12
5.09100000000000e-12
5.10200000000000e-12
5.11400000000000e-12
5.13300000000000e-12
5.15000000000000e-12
5.15900000000000e-12
5.18000000000000e-12
5.19300000000000e-12
5.20600000000000e-12
5.22500000000000e-12
5.19200000000000e-12
5.23500000000000e-12
5.25500000000000e-12
5.26900000000000e-12
5.29000000000000e-12
5.30400000000000e-12
5.31900000000000e-12
5.33900000000000e-12
5.35300000000000e-12
5.36700000000000e-12
5.38800000000000e-12
5.42200000000000e-12
5.42200000000000e-12
5.44800000000000e-12
5.46600000000000e-12
5.47800000000000e-12
5.50300000000000e-12
5.52000000000000e-12
5.54000000000000e-12
5.56300000000000e-12
5.58500000000000e-12
5.60400000000000e-12
5.63700000000000e-12
5.65400000000000e-12
5.67600000000000e-12
5.70200000000000e-12
5.72600000000000e-12
5.74200000000000e-12
5.77600000000000e-12
5.79700000000000e-12
5.81600000000000e-12
5.84700000000000e-12
5.86500000000000e-12
5.88800000000000e-12
5.91300000000000e-12
5.93900000000000e-12
5.96700000000000e-12
5.99600000000000e-12
6.02300000000000e-12
6.05200000000000e-12
6.08100000000000e-12
6.10800000000000e-12
6.09100000000000e-12
6.12100000000000e-12
6.14700000000000e-12
6.18200000000000e-12
6.21000000000000e-12
6.23500000000000e-12
6.27800000000000e-12
6.30500000000000e-12
6.34700000000000e-12
6.37900000000000e-12
6.41800000000000e-12
6.46000000000000e-12
6.49300000000000e-12
6.53100000000000e-12
6.60700000000000e-12
6.65300000000000e-12
6.69100000000000e-12
6.73700000000000e-12
6.78200000000000e-12
6.82900000000000e-12
6.86500000000000e-12
6.91400000000000e-12
6.96000000000000e-12
7.01300000000000e-12
7.06300000000000e-12
7.11500000000000e-12
7.17300000000000e-12
7.22400000000000e-12
7.28000000000000e-12
7.34100000000000e-12
7.40100000000000e-12
7.46600000000000e-12
7.53200000000000e-12
7.59800000000000e-12
7.67100000000000e-12
7.74500000000000e-12
7.81400000000000e-12
7.89500000000000e-12
7.97900000000000e-12
8.05900000000000e-12
8.11800000000000e-12
8.20900000000000e-12
8.30600000000000e-12
8.41100000000000e-12
8.53900000000000e-12
8.62900000000000e-12
8.76400000000000e-12
8.88700000000000e-12
8.99100000000000e-12
9.13700000000000e-12
9.28600000000000e-12
9.45000000000000e-12
9.62000000000000e-12
9.79700000000000e-12
9.99300000000000e-12
1.02000000000000e-11
1.04290000000000e-11
1.06980000000000e-11
1.09840000000000e-11
1.12850000000000e-11]
CJ_fittype = fittype('11.8.*8.85e-12.*area./((((m+2).*11.8.*8.85e-12)./(1.602e-19.*beta).*(Vbi-Va)).^(1./(m+2)))',...
'coefficients',{'Vbi','area','beta','m'},'independent',{'Va'})
CJ_fitoptions = fitoptions(CJ_fittype)
CJ_fitoptions.StartPoint = [0.7 5.2e-5 1e19 1];
CJ_fitoptions.Lower = [0.2 5.2e-9 1e10 0];
CJ_fitoptions.Upper = [1.2 5.2e-3 1e24 3];
[curveFit1,curveGOF1] = fit(datax,datay,CJ_fittype,CJ_fitoptions)
As I stated earlier, the fit function runs once with the initial guess, and provides a 95% confidence bound for m, but does not for Vbi, area, or beta. I have attempted to change the other fitoptions tolerances and robust settings. I have verified my equation is input correctly. I believe the remaining "coefficients" should be unique. But I need to run through this process about 100 more times, and not having to manually iterate each fit would be nice. Any help or suggestions would be appreciated.
Thank you,
George
4 件のコメント
Alex Sha
2021 年 7 月 31 日
The result is not bad:
Root of Mean Square Error (RMSE): 1.63940860716371E-14
Sum of Squared Residual: 3.78960141955188E-26
Correlation Coef. (R): 0.999942423834309
R-Square: 0.999884850983632
Parameter Best Estimate
---------- -------------
vbi 0.533035313889232
area 1185.68913752864
beta 0.00136089634095781
m 0.9485721118
回答 (1 件)
Matt J
2021 年 7 月 30 日
編集済み: Matt J
2021 年 7 月 30 日
You should adjust your units for both the x,y data and for the parameters so that the datay are not so uniformly close to 0 and so you don't have such disparate orders of magnitudes among your parameters like 0.2 versus 1e24. Note that double floating point arithemetic can only keep track of 16 different orders of mangitude.
It would be best if all the data and all the parameters were within 6 orders of magnitude of each other or so.
5 件のコメント
Matt J
2021 年 8 月 3 日
編集済み: Matt J
2021 年 8 月 6 日
The reason it is not iterating is because, over a very broad neighborhood of your StartPoint, your rmse=2.2836e-13 is miniscule and also changes in your parameters result in similarly miniscule changes in rmse. With, default stopping tolerances like CJ_fitoptions.TolFun=1e-6, the code interprets this to mean that you are already at an optimum point and no iterations need be done.
The reason your rmse and its gradients are (artificially) miniscule is, in part, because they are scaled to be on the order of 1e-12. If you take even the simplest step of changing the scale of your datay, as I have been suggesting, you will see the iterations start to move. Below, all I have done is scale both your datay and your model function by 1e11, and as you can see 17 iterations are executed:
load data
CJ_fittype = fittype('1e11*11.8.*8.85e-12.*area./((((m+2).*11.8.*8.85e-12)./(1.602e-19.*beta).*(Vbi-Va)).^(1./(m+2)))',...
'coefficients',{'Vbi','area','beta','m'},'independent',{'Va'});
CJ_fitoptions = fitoptions(CJ_fittype);
CJ_fitoptions.StartPoint = [0.7 5.2e-5 1e19 1];
CJ_fitoptions.Lower = [0.2 5.2e-9 1e10 0];
CJ_fitoptions.Upper = [1.2 5.2e-3 1e24 3];
[curveFit1,curveGOF1,output] = fit(datax,1e11*datay,CJ_fittype,CJ_fitoptions)
参考
カテゴリ
Help Center および File Exchange で Fit Postprocessing についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!