我正在尝试使用与lsqcurvefit
关联的MultiStart
来填充函数。问题是获得的结果与训练数据高度不一致。
整个问题与两个串联的RC并联电路(通过实验获得-xdata,ydata-)的频率响应有关,并通过拟合适当的阻抗方程计算R,C值。
我遵循的步骤是(根据mathworks教程):
步骤I(创建目标函数)
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
步骤III(设定界限)
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经验不足,但是我一直在努力寻找解决方案。
任何帮助都不仅仅是值得赞赏的。
提前感谢您的时间。