主要内容

适合一个复数的数据模型

这个例子展示了如何执行复数数据的非线性拟合。虽然大多数优化工具箱™解决方案和算法只能按实值数据,解决最小二乘和fsolve可以工作在两个实值和复数数据无约束问题。目标函数必须复杂功能意义上的分析。

不设置FunValCheck选项“上”当使用复杂的数据。解决错误。不使用“内点”算法与lsqcurvefitlsqnonlin;该算法主要是用于处理约束和没有使用复杂的数据进行验证。

数据模型

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

$ $ 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)));%复杂噪声cplxydata = v0 (1) + v0 (2) . * exp (v0 (3) * xdata) + noisedata;

符合模型恢复系数向量

响应预测的数据模型之间的差异,观察(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.7399 + 3.8012 = 2.1582 + 0.1351我我resnorm -0.5338 + 0.4660 = 100.9933 exitflag = 3 = 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,[],[],选择)
vestimated 2.7399 + 3.8012 = 2.1582 + 0.1351我我resnorm -0.5338 + 0.4660 = 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

函数你= cplxreal (v, xdata)你= 0(长度(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 = 0.0018

解释six-element向量vestimated三元素复杂的矢量,你会发现解决方案是几乎一样的以前的解决方案。金宝搏官方网站

相关的话题