我正在尝试使用lsqcurvefit
linked with来拟合函数MultiStart
。问题是获得的结果与训练数据高度不一致。
整个问题与串联连接的两个 RC 并联电路的频率响应(通过实验获得 -xdata,ydata-)以及通过拟合适当的阻抗方程计算 R、C 值有关。
我遵循的步骤是(根据 mathworks 教程):
第一步(创建目标函数)
function [Ztotal] = RQRQ_test(c,omega)
% c = [Rs CPE1 n1 Rct1 CPE2 n2 Rct2];
% τCPE1
YCPE1 = c(2)*(1i*omega).^c(3);
Y1 = YCPE1 + c(4).^-1;
Z1 = 1./Y1;
% τCPE2
YCPE2 = c(5)*(1i*omega).^c(6);
Y2 = YCPE2 + c(7).^-1;
Z2 = 1./Y2;
% Ztotal
Ztotal = (abs(Z1 + Z2 + c(1)))';
第二步(创建训练数据)
omega = logspace(5,-1,120); %xdata
Zexp = xlsread('(RQ)(RQ)_test.xlsx', 'D2:D121'); %ydata
c0 = [3 1e-04 0.9 20 1e-06 0.9 100]; %initial values of c
第三步(设定界限)
lb = [2 1e-05 0.9 10 1e-06 0.9 50];
ub = [8 1e-01 1 100 1e-03 1 200];
第四步(设置问题)
problem = createOptimProblem('lsqcurvefit','x0',c0,'objective',@RQRQ_test,...
'lb',lb,'ub',ub,'xdata',omega,'ydata',Zexp);
第五步(运行MultiStart
)
[xmulti,errormulti] = run(ms,problem,50)
运行上述过程后,我得到的结果如下:
MultiStart completed the runs from all start points.
All 50 local solver runs converged with a positive local solver exit flag.
xmulti =
8.0000 0.0083 1.0000 100.0000 0.0008 0.9000 85.1574
errormulti =
1.3146e+04
在线下方附加的图中,空心圆圈分别对应于 c 初始值和优化值。
我无法理解为什么错误如此之大。我的代码或我处理问题的方式有问题吗?这可能是由于我的小 matlab 经验,但我一直在努力寻找解决方案。
任何帮助将不胜感激。
提前感谢您的宝贵时间。