主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

複素数値データへのモデルの当てはめ

この例では,複素数値データの非線形な当てはめを実行する方法を示します。ほとんどの优化工具箱™のソルバーとアルゴリズムは実数値データのみを処理しますが,最小二乗法ソルバーと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 = -log(rand(n,1));%指数分布noisedata = randn (N, 1)。* exp((我* randn (N - 1)));%复杂噪声cplxdata = v0(1) + v0(2).*exp(v0(3)*xdata) +噪声数据;

係数ベクトルを復元するためのモデルの当てはめ

データモデルで予測された応答と観測値($ x $に対してはxdata$ y $に対してはcplxydata)との差は次のとおりです。

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

lsqnonlinまたはlsqcurvefitを使用してモデルをデータに当てはめます。この例では,まず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によって,複素数係数ベクトルがほぼ有効数字1桁まで復元されます。残差のノルムが大きく,ノイズのためにモデルですべての観測値を当てはめられないことが示されています。1次の最適性の尺度が約1 e - 3で,1 e-6未満ではないため,終了フラグは望ましい1ではなく3.になっています。

代替方法: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);

このコードをMATLAB®パス上のcplxreal.mファイルとして保存します。

応答データを実数部と虚数部に分割します。

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

系数ベクトルvが6つの次元をもつようになります。系数ベクトルをすべて1として初期化し、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

6要素のベクトルvestimatedを3要素の複素数ベクトルとして解釈します。この解は以前の解と基本的に同じであることがわかります。

関連するトピック