Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

解析ヤコビアンによる非線形方程式

この例では既定の Trust-region-dogleg 法 fsolve アルゴリズムの使用を示します (大規模アルゴリズムと中規模アルゴリズムを参照)。ここで、対象となる問題は以下になります。

  • 非線形方程式系が合致する、すなわち、方程式の数と未知数の数が等しい。

  • F(x) = 0 となるような 1 つの解 x が存在する。

例では fsolve を使用し、等価な非線形方程式系を導出して解くことによりバナナ (または Rosenbrock) 関数の最小値を求めます。F(x) = 0 の最小値となる Rosenbrock 関数は最適化における代表的なテスト問題です。この関数は非線形性が高く、最急降下法を使用したとしても極めて緩やかにしか収束しません。これは、次の式で表されます。

f(x)=100(x2x12)2+(1x1)2.

まず、この関数を n 次関数として一般化します。n は任意の整数の偶数値です。

f(x)=i=1n/2100(x2ix2i12)2+(1x2i1)2.

この関数を、一般 Rosenbrock 関数と呼びます。この関数は n 個の未知数を含む n 個の 2 乗項からなります。

fsolve を使用して F(x) = 0 となるような x の値を求めます。すなわち、一般 Rosenbrock 関数の最小値を求めるには、その前に次のような等価な非線形方程式系として関数を書き換えなければなりません。

F(1)=1x1F(2)=10(x2x12)F(3)=1x3F(4)=10(x4x32)F(n1)=1xn1F(n)=10(xnxn12).

この方程式系は合致しており、fsolve を使用して解くことができます。例に示されるように、この方程式系は xi = 1, i = 1,...,n で与えられる一意な解をもちます。

手順 1: 目的関数値およびヤコビアンを計算するファイル bananaobj.m を記述する

function [F,J] = bananaobj(x)
% Evaluate the vector function and the Jacobian matrix for 
% the system of nonlinear equations derived from the general 
% n-dimensional Rosenbrock function.
% Get the problem size
n = length(x);  
if n == 0, error('Input vector, x, is empty.'); end
if mod(n,2) ~= 0, 
   error('Input vector, x ,must have an even number of components.');
end
% Evaluate the vector function
odds  = 1:2:n;
evens = 2:2:n;
F = zeros(n,1);
F(odds,1)  = 1-x(odds);
F(evens,1) = 10.*(x(evens)-x(odds).^2); 
% Evaluate the Jacobian matrix if nargout > 1
if nargout > 1
   c = -ones(n/2,1);    C = sparse(odds,odds,c,n,n);
   d = 10*ones(n/2,1);  D = sparse(evens,evens,d,n,n);
   e = -20.*x(odds);    E = sparse(evens,odds,e,n,n);
   J = C + D + E;
end

手順 2: 方程式系に対するソルバー ルーチンを呼び出す

n = 64;  
x0(1:n,1) = -1.9; 
x0(2:2:n,1) = 2;
options = optimoptions(@fsolve,'Display','iter','SpecifyObjectiveGradient',true);
[x,F,exitflag,output,JAC] = fsolve(@bananaobj,x0,options);

初期の点として奇数インデックスに対して、x(i) = –1.9 を使用し、偶数インデックスに対して x(i) = 2 を使用します。ソルバーの進行状況を確認するため、Display'iter' に設定します。そして bananaobj.m に定義されたヤコビアンを使用するために、SpecifyObjectiveGradienttrue に設定します。関数 fsolve は以下を出力します。

                                         Norm of      First-order   Trust-region
 Iteration  Func-count     f(x)          step         optimality    radius
     0          1         8563.84                           615               1
     1          2         3093.71              1            329               1
     2          3         225.104            2.5           34.8             2.5
     3          4          212.48           6.25           34.1            6.25
     4          5          212.48           6.25           34.1            6.25
     5          6          212.48         1.5625           34.1            1.56
     6          7         116.793       0.390625           5.79           0.391
     7          8         109.947       0.390625          0.753           0.391
     8          9         99.4696       0.976562            1.2           0.977
     9         10         83.6416        2.44141           7.13            2.44
    10         11         77.7663        2.44141           9.94            2.44
    11         12         77.7663        2.44141           9.94            2.44
    12         13          43.013       0.610352           1.38            0.61
    13         14         36.4334       0.610352           1.58            0.61
    14         15         34.1448        1.52588           6.71            1.53
    15         16         18.0108        1.52588           4.91            1.53
    16         17         8.48336        1.52588           3.74            1.53
    17         18         3.74566        1.52588           3.58            1.53
    18         19         1.46166        1.52588           3.32            1.53
    19         20         0.29997        1.24265           1.94            1.53
    20         21               0      0.0547695              0            1.53

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.

参考

関連するトピック