このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,複素数値データの非線形な当てはめを実行する方法を示します。ほとんどの优化工具箱™のソルバーとアルゴリズムは実数値データのみを処理しますが,最小二乗法ソルバーとfsolve
は制約なしの問題の実数値データと複素数値データの両方を扱うことができます。目的関数は複素関数の観点から解析的でなければなりません。
複素数データを使用する場合にはFunValCheck
オプションを“上”
に設定しないでください。ソルバーでエラーが発生します。
データモデルは単純な指数です。
は入力データ,は応答,目标は数量ベクトルです。目标目标,とノイズを含む観測値からを推定することです。データモデルは解析的であるため、このモデルを複素数解で使用することができます。
モデル用に人為的なデータを生成します。複素数係数ベクトルを[2, 3 + 4我;闲置+ .4i]
とします。観測値は指数分布しているとします。応答に複素数値ノイズを追加します。
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) +噪声数据;
データモデルで予測された応答と観測値(に対してはxdata
、に対しては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
を使用して当てはめるには,応答から応答データを引いた値ではなく,応答のみが得られるようなモデルを作成します。
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
どちらでも,便利だと思うソルバーをてください。
范囲を含めたり,単に単に数値の范囲内完全に收めるは,幂のの部部とを别々别々のにできますますますますますます。
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要素の複素数ベクトルとして解釈します。この解は以前の解と基本的に同じであることがわかります。