主要内容

对复值数据拟合模型

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

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

数据模型

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

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

x美元输入数据,y美元答案是,和五美元是一个复值系数向量。目标是估计五美元x美元和嘈杂的观察y美元.数据模型是分析的,所以您可以在复杂的解决方案中使用它。

带有噪声的人工数据

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

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

拟合模型,恢复系数向量

数据模型预测的响应与观测结果(xdatax美元和响应cplxydatay美元)是:

objfcn = @ (v) v (1) + (2) * exp (v (3) * xdata) - 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选项和语法。

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

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

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

为了包含界限,或者仅仅是为了完全保持在实值内,您可以将系数的实和复杂部分分割成单独的变量。对于这个问题,分解系数如下:

数组$ $ \开始{}{1}& # xA; y = {v_1} +我{v_2} + ({v_3} + i{两者})\ exp \离开({({v_5} + i {v_6}) x} \) \ \ & # xA; \ \ = \离开({{v_1} + {v_3} \ exp ({v_5} x) \ cos (x) {v_6} -{两者}\ exp ({v_5} x) \ sin (x) {v_6}} \) \ \ & # xA; \ \ + i \离开({{v_2} +{两者}\ exp ({v_5} x) \ cos (x {v_6}) + {v_3} \ exp ({v_5} x) \ sin (x) {v_6}} \右)强生# xA; \{数组}$ $

的响应函数lsqcurvefit

函数Yout = cplxreal(v,xdata) Yout = 0 (length(xdata),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作为一个三元素复向量,你会发现它的解实际上和之前的解是一样的。金宝搏官方网站

相关的话题