复值数据的模型拟合
这个例子展示了如何对复值数据进行非线性拟合。虽然大多数优化工具箱™求解器和算法只对实值数据操作,但最小二乘求解器和fsolve
可以在无约束问题的实值和复值数据上工作。目标函数必须是复函数意义上的解析函数。
不要设置FunValCheck
选项“上”
当使用复杂数据时。解算器错误。
数据模型
数据模型是一个简单的指数:
的是输入数据,响应,和是系数的复值向量。我们的目标是估算从还有噪声观测.数据模型是分析性的,因此您可以在复杂的解决方案中使用它。
带噪声的人工数据
为模型生成人工数据。取复系数向量作为[2, 3 + 4我;闲置+ .4i]
.以观察为例呈指数分布。在响应中加入复值噪声.
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) +噪声数据;
拟合模型恢复系数向量
由数据模型预测的响应与观测结果(xdata
为和响应cplxydata
为)是:
objfcn = @ (v) v (1) + (2) * exp (v (3) * xdata) - cplxydata;
使用lsqnonlin
或lsqcurvefit
使模型与数据相匹配。本例首先使用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
,因为底层算法是相同的。使用你认为更方便的求解器。
可供选择:分割实部和虚部
为了包含边界,或者仅仅是完全保持在实值内,可以将系数的实数部分和复数部分分割为单独的变量。对于这个问题,将系数拆分如下:
的响应函数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
作为一个三元复向量,你可以看到它的解实际上和前面的解是一样的。金宝搏官方网站