主要内容

复值数据的模型拟合

这个例子展示了如何对复值数据进行非线性拟合。虽然大多数优化工具箱™求解器和算法只对实值数据操作,但最小二乘求解器和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+4i;-.5+.4i];%系数向量xdata = -log(rand(N,1));%指数分布noisedata = randn(N,1).*exp((1i*randn(N,1)));复噪声%Cplxydata = v0(1) + v0(2).*exp(v0(3)*xdata) +噪声数据;

拟合模型恢复系数向量

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

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

使用lsqnonlinlsqcurvefit使模型与数据相匹配。本例首先使用lsqnonlin

Opts = optimoptions(@lsqnonlin,“显示”“关闭”);X0 = (1+1i)*[1;1;1];%任意初始猜测[vestimated,resnorm,residuals,exitflag,output] = lsqnonlin(objfcn,x0,[],[],opts);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,将模型写成只给出响应,而不是响应减去响应数据。

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

使用lsqcurvefit选项和语法。

Opts = optimoptions(@lsqcurvefit, Opts);%重复使用选项[vestimated,resnorm] = lsqcurvefit(objfcn,x0,xdata,cplxydata,[],[],opts)
Vestimated = 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);%分配youtexp(v(5)*xdata(:));%级Coscoef = cos(v(6)*xdata(:));%实余弦项Sincoef = sin(v(6)*xdata(:));虚sin项你(:1)= v (1) + expcoef。* (v (3) * coscoef - v (4) * sincoef);你(:,2)= v (2) + expcoef。* * coscoef + v (v (4) (3) * sincoef);

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

将响应数据分成实部和虚部。

Ydata2 = [real(cplxydata),imag(cplxydata)];

系数向量v现在有六个维度。将其初始化为全1,并使用lsqcurvefit

X0 = ones(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作为一个三元复向量,你可以看到它的解实际上和前面的解是一样的。金宝搏官方网站

相关的话题