主要内容

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

非線形最小二乗法とヤコビアンの有無

この例では,非線形最小二乗問題を解く2つの方法を説明します。この例では,まず,ヤコビ関数を使わずに問題を解きます。次いで,ヤコビアンを含める方法と,それによる効率性の改善について説明します。

この問題には10個の項と2個の未知数があります。次を最小化する2次元ベクトルxを見つけます。

k 1 1 0 2 + 2 k - e k x 1 - e k x 2 2

これは点x0 = [0.3, 0.4]を開始点とします。

lsqnonlinは二乗和がユーザー関数で陽的に作成されていないことを想定しているため,lsqnonlinに渡す関数が以下のベクトル値関数を演算しなければなりません。

F k x 2 + 2 k - e k x 1 - e k x 2

ここで,k= 1 ~ 10です(すなわち,Fは10個の要素をもたなければなりません)。

ヤコビアンなしで問題を解く

補助関数myfunこの例の終わりで定義)は導関数情報を使用せずにベクトル値目的関数を実装します。点x0から開始して,最小化を解きます。

x0 = [0.3, 0.4];%开始猜[x, resnorm res, eflag,输出]= lsqnonlin (x0 @myfun);%调用优化器
局部最小值。Lsqnonlin停止,因为当前步长小于步长公差的值。

解と関数評価回数を検証します。

disp (x)
0.2578 - 0.2578
disp (resnorm)
124.3622
disp (output.funcCount)
72

ヤコビアンを含む問題を解く

目的関数は単純であるため,そのヤコビアンを計算できます。ベクトル関数のヤコビアンでの定義に従って,ヤコビ関数は次の行列を表現します。

J k j x F k x x j

ここで, F k x は目的関数のk番目の成分です。この例では,次のようになります。

F k x 2 + 2 k - e k x 1 - e k x 2

したがって

J k 1 x - k e k x 1 J k 2 x - k e k x 2

補助関数myfun2この例の終わりで定義)はヤコビアンをもつ目的関数を実装するものです。ソルバーがヤコビアンを使用するようにオプションを設定します。

选择= optimoptions (@lsqnonlin,“SpecifyObjectiveGradient”,真正的);

ソルバーを実行します。

磅= [];%是没有界限的乌兰巴托= [];(x2, resnorm2,它、eflag2 output2] = lsqnonlin (x0, @myfun2磅,乌兰巴托,选择);
局部最小值。Lsqnonlin停止,因为当前步长小于步长公差的值。

解は前の解と同じです。

disp (x2)
0.2578 - 0.2578
disp (resnorm2)
124.3622

ヤコビアンを使用する利点は,ソルバーによる関数評価の回数が大幅に減少することです。

disp (output2.funcCount)
24

補助関数

次のコードは,補助関数myfunを作成します。

函数F = myfun(x);F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));结束

次のコードは,補助関数myfun2を作成します。

函数[F,J] = myfun2(x) k = 1;F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));如果nargout > 1 J = 0 (10,2);J (k, 1) = - k。* exp (k * x (1));J (k, 2) = - k。* exp (k * x (2));结束结束

関連するトピック