Keyword: 非線形計画
概要
本サンプルは非線形計画を行うサンプルプログラムです。 本サンプルは以下に示される非線形関数を最小化する解を求めて出力します。
※本サンプルはnAG Toolbox for MATLAB®が提供する関数 e04uc() のExampleコードです。実行にはMATLAB®本体(他社製品)とnAG Toolbox for MATLAB®が必要です。
本サンプル及び関数の詳細情報は e04uc のマニュアルページをご参照ください。
Mファイル e04uc_confun.m
function [mode, c, cjac, user] = ...
e04uc_confun(mode, ncnln, n, ldcj, needc, x, cjac, nstate, user)
c = zeros(ncnln, 1);
if (nstate == 1)
% first call to confun. set all jacobian elements to zero.
% note that this will only work when 'derivative level = 3'
% (the default; see section 11.2).
cjac=zeros(ldcj, n);
end
if (needc(1) > 0)
if (mode == 0 || mode == 2)
c(1) = x(1)^2 + x(2)^2 + x(3)^2 + x(4)^2;
end
if (mode == 1 || mode == 2)
cjac(1,1) = 2*x(1);
cjac(1,2) = 2*x(2);
cjac(1,3) = 2*x(3);
cjac(1,4) = 2*x(4);
end
end
if (needc(2) > 0)
if (mode == 0 || mode == 2)
c(2) = x(1)*x(2)*x(3)*x(4);
end
if (mode == 1 || mode == 2)
cjac(2,1) = x(2)*x(3)*x(4);
cjac(2,2) = x(1)*x(3)*x(4);
cjac(2,3) = x(1)*x(2)*x(4);
cjac(2,4) = x(1)*x(2)*x(3);
end
end
- このMファイルでは関数 e04uc_confun を定義します。この関数は非線形制約関数のベクトルを計算します。
Mファイル e04uc_objfun.m
function [mode, objf, objgrd, user] = e04uc_objfun(mode, n, x, objgrd, nstate, user)
if (mode == 0 || mode == 2)
objf = x(1)*x(4)*(x(1)+x(2)+x(3)) + x(3);
else
objf = 0;
end
if (mode == 1 || mode == 2)
objgrd(1) = x(4)*(2*x(1)+x(2)+x(3));
objgrd(2) = x(1)*x(4);
objgrd(3) = x(1)*x(4) + 1;
objgrd(4) = x(1)*(x(1)+x(2)+x(3));
end
- このMファイルでは関数 e04uc_objfun を定義します。この関数は目的関数(非線形関数)を計算します。
入力データ
a = [1, 1, 1, 1];
bl = [1; 1; 1; 1; -10e+24; -10e+24; 25];
bu = [5; 5; 5; 5; 20; 40; 10e+24];
istate = zeros(7, 1, 'int32');
cjac = zeros(2, 4);
clamda = zeros(7, 1);
r = zeros(4, 4);
x = [1; 5; 5; 1];
[cwsav,lwsav,iwsav,rwsav,ifail] = e04wb('e04uc');
[iter, istate, c, cjac, clamda, objf, objgrd, r, x] = ...
e04uc(a, bl, bu, 'e04uc_confun', 'e04uc_objfun', istate, cjac, clamda, r, x, lwsav, iwsav, rwsav)
- a には一般線形制約の係数を指定しています。
- bl には変数の下限と制約の下限を指定しています。
- bu には変数の上限と制約の上限を指定しています。
- istate には初期値を設定しています。
- cjac には初期値を設定しています。
- clamda には初期値を設定しています。
- r には初期値を設定しています。
- x には初期推定値を指定しています。
- 9行目には初期化のため関数 e04wb を呼び出しています。
- 最後に本関数を呼び出す構文を指定しています。
出力結果
iter =
5
istate =
1
0
0
0
0
2
1
c =
40.0000
25.0000
cjac =
2.0000 9.4860 7.6423 2.7588
25.0000 5.2709 6.5425 18.1237
clamda =
1.0879
0
0
0
0
-0.1615
0.5523
objf =
17.0140
objgrd =
14.5723
1.3794
2.3794
9.5641
r =
1.0873 -0.4651 0.1012 0.8275
0 -1.0442 -0.6506 0.7922
0 0 0.7357 -0.8520
0 0 0 1.0000
x =
1.0000
4.7430
3.8211
1.3794
- iter は大きい反復の反復数を示しています。
- istate はxで返された点におけるワーキングセットの制約の状態を示しています。
- c は非線形制約関数の値を示しています。
- cjac は最後の反復の非線形制約関数のヤコビ行列を示しています。
- clamda は最後のQP子問題(subproblem)からのQP乗数の値を示しています。
- objf は最後の反復の目的関数の値を示しています。
- objgrd は最後の反復の目的関数の勾配を示しています。
- r は変換され並べ替えされたラグランジュのヘッセ行列の上三角コレスキー因子Rを示しています。
- x は解の最終推定値を示しています。
