主要内容

对复值数据拟合模型

这个例子说明了如何进行复值数据的非线性拟合。虽然大多数最优化工具箱™求解器和算法只对实值数据进行操作,但最小二乘求解器和最小二乘算法fsolve能够处理无约束问题的实值和复值数据。目标函数必须是复函数意义上的解析函数。

不要设置FunValCheck选择“上”当使用复杂数据时。解决错误。

数据模型

数据模型是一个简单的指数:

$y(x) = v_1 + v_2 e^{v_3 x}.$

$x$输入数据,$y$答案是,和$v$是系数的复数向量。目标是估计$v$从…起$x$和嘈杂的观测$y$。数据模型是分析性的,因此您可以在复杂的解决方案中使用它。

含噪声的人工数据

为模型生成人工数据。取复系数向量$v$作为[2, 3 + 4我;闲置+ .4i]. 接受观察$x$指数分布。在响应中添加复数噪声$y$

rng默认的%的再现性N = 100;%观察次数v0 =[2, 3 + 4我;闲置+ .4i];%系数向量扩展数据=-log(rand(N,1));%指数分布noisedata = randn (N, 1)。* exp((我* randn (N - 1)));%复杂噪声cplxdata = v0(1) + v0(2).*exp(v0(3)*xdata) +噪声数据;

拟合模型以恢复系数向量

数据模型预测的响应与观测值之间的差异(xdata$x$及回应cplxydata$y$)是:

objfcn=@(v)v(1)+v(2)*exp(v(3)*扩展数据)-cplxydata;

使用其中一个lsqnonlinlsqcurvefit使模型与数据相符。本示例首先使用lsqnonlin

选择= optimoptions (@lsqnonlin,“显示”“关”);x0 = (1 + 1) * (1, 1, 1);%任意初始猜测[vestimated, resnorm,残差、exitflag、输出]= lsqnonlin (x0, objfcn[],[],选择);vestimated、resnorm exitflag output.firstorderopt
Vestimated = 2.1582 + 0.1351i 2.7399 + 3.8012i -0.5338 + 0.4660i resnorm = 100.9933 exitflag = 3 ans = 0.0018

lsqnonlin恢复复系数向量到一个有效的数字。残差的范数相当大,表明噪声使模型无法拟合所有的观测值。退出标志是3.,而不是更可取的1,因为一阶最优性度量是1 e - 3,不低于1 e-6

替代方案:用lsqcurvefit

适合使用lsqcurvefit,编写模型只给出响应,而不是响应减去响应数据。

xdata objfcn = @ (v) v (1) + (2) * exp (v (3) * xdata);

使用lsqcurvefit选项和语法。

opts=最佳选项(@lsqcurvefit,opts);%重用选项[vestimated, resnorm] = lsqcurvefit (x0, objfcn xdata, cplxydata,[],[],选择)
vestimate = 2.1582 + 0.1351i 2.7399 + 3.8012i -0.5338 + 0.4660i resnorm = 100.9933

结果与来自美国的数据相符lsqnonlin,因为底层算法是相同的。使用任何你觉得更方便的解算器。

可选方案:分割实部和虚部

要包含边界,或者只是完全保持在实值内,可以将系数的实数部分和复数部分拆分为单独的变量。对于此问题,按如下方式拆分系数:

$$\begin{array}{l}
;y={v_1}+i{v_2}+({v_3}+i{v_4})\exp\left({v_5}+i{v_6})x}\right)\&\xA;\=\左({v_1}+{v_3}\exp({v_5}x)\cos({v_6}x){v_4}\exp({v_5}x)\sin({v_6}x)}\right)\&\xA左({v_2}+{v_4}\exp({v_5}x)\cos({v_6}x)+{v_3}\exp({v_5}x)\sin({v_6}x)}\右)\结束{array}$$

为其编写响应函数lsqcurvefit

作用yout=cplxreal(v,扩展数据)yout=0(长度(扩展数据),2);%分配你expcoef = exp (v (5) * xdata (:));%量级coscoef = cos (v (6) * xdata (:));实余弦项sincoef =罪(v (6) * xdata (:));虚正弦项你(:1)= v (1) + expcoef。* (v (3) * coscoef - v (4) * sincoef);你(:,2)= v (2) + expcoef。* * coscoef + v (v (4) (3) * sincoef);

将此代码保存为文件cplxreal.m在您的MATLAB®路径。

将响应数据拆分为实部和虚部。

ydata2 =[真实(cplxydata),图像放大(cplxydata)];

的系数向量v现在有六个维度。初始化为所有的,并使用lsqcurvefit

x0 = 1 (6,1);[vestimated, resnorm,残差、exitflag、输出]=...lsqcurvefit (x0, @cplxreal xdata ydata2);vestimated、resnorm exitflag output.firstorderopt
局部最小值。Lsqcurvefit停止是因为相对于初始值的平方和的最终变化小于函数公差的值。Vestimated = 2.1582 0.1351 2.7399 3.8012 -0.5338 0.4660 resnorm = 100.9933 exitflag = 3 ans = 0.0018

解释六元素向量vestimated作为一个三元素复向量,你会发现它的解实际上和之前的解是一样的。万博 尤文图斯

相关话题