coneprog
構文
説明
coneprog
関数は、以下で指定された問題の最小値を見つける 2 次錐計画法ソルバーです。
以下の制約に従います。
f、x、b、beq、lb、ub はベクトル、A と Aeq は行列です。i ごとに、行列 Asc(i)、ベクトルの dsc(i) と bsc(i)、およびスカラー γ(i) が、secondordercone
を使用して作成された 2 次錐制約に含まれています。
錐制約の詳細については、2 次錐制約を参照してください。
は、次のようにエンコードされた x
= coneprog(f
,socConstraints
)socConstraints
内の制約を使用して 2 次錐計画問題を解きます。
Asc(i) =
socConstraints(i).A
bsc(i) =
socConstraints(i).b
dsc(i) =
socConstraints(i).d
γ(i) =
socConstraints(i).gamma
例
単一の錐制約
1 つの 2 次錐制約を含む問題を設定するには、2 次錐制約オブジェクトを作成します。
A = diag([1,1/2,0]); b = zeros(3,1); d = [0;0;1]; gamma = 0; socConstraints = secondordercone(A,b,d,gamma);
目的関数ベクトルを作成します。
f = [-1,-2,0];
この問題には、線形制約がありません。これらの制約用の空行列を作成します。
Aineq = []; bineq = []; Aeq = []; beq = [];
x(3)
の上限と下限を設定します。
lb = [-Inf,-Inf,0]; ub = [Inf,Inf,2];
coneprog
関数を使用して問題を解きます。
[x,fval] = coneprog(f,socConstraints,Aineq,bineq,Aeq,beq,lb,ub)
Optimal solution found.
x = 3×1
0.4851
3.8806
2.0000
fval = -8.2462
解の要素 x(3)
は上限値です。錐制約は次の解においてアクティブです。
norm(A*x-b) - d'*x % Near 0 when the constraint is active
ans = -2.5677e-08
複数の錐制約
複数の 2 次錐制約を含む問題を設定するには、制約オブジェクトの配列を作成します。時間とメモリを節約するために、最初に、最もインデックスの高い制約を作成します。
A = diag([1,2,0]); b = zeros(3,1); d = [0;0;1]; gamma = -1; socConstraints(3) = secondordercone(A,b,d,gamma); A = diag([3,0,1]); d = [0;1;0]; socConstraints(2) = secondordercone(A,b,d,gamma); A = diag([0;1/2;1/2]); d = [1;0;0]; socConstraints(1) = secondordercone(A,b,d,gamma);
線形目的関数ベクトルを作成します。
f = [-1;-2;-4];
coneprog
関数を使用して問題を解きます。
[x,fval] = coneprog(f,socConstraints)
Optimal solution found.
x = 3×1
0.4238
1.6477
2.3225
fval = -13.0089
線形制約を使用した錐計画法
目的関数ベクトルと単一の 2 次錐制約を指定します。
f = [-4;-9;-2]; Asc = diag([1,4,0]); b = [0;0;0]; d = [0;0;1]; gamma = 0; socConstraints = secondordercone(Asc,b,d,gamma);
線形不等式制約を指定します。
A = [1/4,1/9,1]; b = 5;
問題を解きます。
[x,fval] = coneprog(f,socConstraints,A,b)
Optimal solution found.
x = 3×1
3.2304
0.6398
4.1213
fval = -26.9225
既定ではないオプションを使用した錐計画法
coneprog
ソルバーの反復を観察するには、Display
オプションを 'iter'
に設定します。
options = optimoptions('coneprog','Display','iter');
2 次錐計画問題を作成し、それを options
を使用して解きます。
Asc = diag([1,1/2,0]); b = zeros(3,1); d = [0;0;1]; gamma = 0; socConstraints = secondordercone(Asc,b,d,gamma); f = [-1,-2,0]; Aineq = []; bineq = []; Aeq = []; beq = []; lb = [-Inf,-Inf,0]; ub = [Inf,Inf,2]; [x,fval] = coneprog(f,socConstraints,Aineq,bineq,Aeq,beq,lb,ub,options)
Iter Fval Primal Infeas Dual Infeas Duality Gap Time 1 0.000000e+00 0.000000e+00 5.714286e-01 1.250000e-01 0.01 2 -7.558066e+00 0.000000e+00 7.151114e-02 1.564306e-02 0.02 3 -7.366973e+00 2.775558e-17 1.075440e-02 2.352525e-03 0.02 4 -8.243432e+00 1.387779e-17 5.191882e-05 1.135724e-05 0.02 5 -8.246067e+00 0.000000e+00 2.430813e-06 5.317403e-07 0.02 6 -8.246211e+00 1.387779e-17 6.154504e-09 1.346298e-09 0.02 Optimal solution found.
x = 3×1
0.4851
3.8806
2.0000
fval = -8.2462
問題構造体を使用した錐計画法
2 次錐計画問題の要素を作成します。時間とメモリを節約するために、最初に、最もインデックスの高い制約を作成します。
A = diag([1,2,0]); b = zeros(3,1); d = [0;0;1]; gamma = -1; socConstraints(3) = secondordercone(A,b,d,gamma); A = diag([3,0,1]); d = [0;1;0]; socConstraints(2) = secondordercone(A,b,d,gamma); A = diag([0;1/2;1/2]); d = [1;0;0]; socConstraints(1) = secondordercone(A,b,d,gamma); f = [-1;-2;-4]; options = optimoptions('coneprog','Display','iter');
problemで説明されているように、必須フィールドを含む問題構造体を作成します。
problem = struct('f',f,... 'socConstraints',socConstraints,... 'Aineq',[],'bineq',[],... 'Aeq',[],'beq',[],... 'lb',[],'ub',[],... 'solver','coneprog',... 'options',options);
coneprog
を呼び出して問題を解きます。
[x,fval] = coneprog(problem)
Iter Fval Primal Infeas Dual Infeas Duality Gap Time 1 0.000000e+00 0.000000e+00 5.333333e-01 5.555556e-02 0.10 2 -9.696012e+00 5.551115e-17 7.631901e-02 7.949897e-03 0.12 3 -1.178942e+01 3.700743e-17 1.261803e-02 1.314378e-03 0.12 4 -1.294426e+01 1.850372e-17 1.683078e-03 1.753206e-04 0.12 5 -1.295217e+01 9.251859e-18 8.994595e-04 9.369370e-05 0.12 6 -1.295331e+01 9.251859e-18 4.748841e-04 4.946709e-05 0.13 7 -1.300753e+01 9.251859e-18 2.799942e-05 2.916606e-06 0.13 8 -1.300671e+01 9.251859e-18 2.366136e-05 2.464725e-06 0.13 9 -1.300850e+01 9.251859e-18 8.222244e-06 8.564838e-07 0.13 10 -1.300843e+01 1.850372e-17 7.318333e-06 7.623264e-07 0.13 11 -1.300865e+01 9.251859e-18 2.636568e-06 2.746425e-07 0.13 12 -1.300892e+01 1.850372e-17 3.407939e-08 3.549936e-09 0.13 Optimal solution found.
x = 3×1
0.4238
1.6477
2.3225
fval = -13.0089
coneprog
解法プロセスの検証
2 次錐計画問題を作成します。時間とメモリを節約するために、最初に、最もインデックスの高い制約を作成します。
A = diag([1,2,0]); b = zeros(3,1); d = [0;0;1]; gamma = -1; socConstraints(3) = secondordercone(A,b,d,gamma); A = diag([3,0,1]); d = [0;1;0]; socConstraints(2) = secondordercone(A,b,d,gamma); A = diag([0;1/2;1/2]); d = [1;0;0]; socConstraints(1) = secondordercone(A,b,d,gamma); f = [-1;-2;-4]; options = optimoptions('coneprog','Display','iter'); A = []; b = []; Aeq = []; beq = []; lb = []; ub = [];
解法プロセスに関する情報を要求する問題を解きます。
[x,fval,exitflag,output] = coneprog(f,socConstraints,A,b,Aeq,beq,lb,ub,options)
Iter Fval Primal Infeas Dual Infeas Duality Gap Time 1 0.000000e+00 0.000000e+00 5.333333e-01 5.555556e-02 0.09 2 -9.696012e+00 1.850372e-17 7.631901e-02 7.949897e-03 0.13 3 -1.178942e+01 9.251859e-18 1.261803e-02 1.314378e-03 0.14 4 -1.294426e+01 9.251859e-18 1.683078e-03 1.753206e-04 0.14 5 -1.295217e+01 0.000000e+00 8.994595e-04 9.369370e-05 0.14 6 -1.295331e+01 9.251859e-18 4.748841e-04 4.946709e-05 0.14 7 -1.300753e+01 1.850372e-17 2.799942e-05 2.916606e-06 0.15 8 -1.300671e+01 1.850372e-17 2.366136e-05 2.464725e-06 0.15 9 -1.300850e+01 0.000000e+00 8.204733e-06 8.546597e-07 0.15 10 -1.300843e+01 1.850372e-17 7.339071e-06 7.644866e-07 0.15 11 -1.300862e+01 9.251859e-18 2.693755e-06 2.805995e-07 0.15 12 -1.300892e+01 1.850372e-17 8.766586e-08 9.131860e-09 0.16 Optimal solution found.
x = 3×1
0.4238
1.6477
2.3225
fval = -13.0089
exitflag = 1
output = struct with fields:
iterations: 12
primalfeasibility: 1.8504e-17
dualfeasibility: 8.7666e-08
dualitygap: 9.1319e-09
algorithm: 'interior-point'
linearsolver: 'augmented'
message: 'Optimal solution found.'
反復表示と出力構造体の両方に、
coneprog
が 12 回の反復を使用して解に到達したことが示されます。終了フラグ値
1
とoutput.message
値'Optimal solution found.'
は、解が信頼できることを示します。output
構造体には、双対性ギャップと同様に、解法プロセスを通して実行不可能性が減少する傾向にあることが示されます。fval
出力は、f'*x
を乗算することによって再現できます。
f'*x
ans = -13.0089
coneprog
双対変数の取得
2 次錐計画問題を作成します。時間とメモリを節約するために、最初に、最もインデックスの高い制約を作成します。
A = diag([1,2,0]); b = zeros(3,1); d = [0;0;1]; gamma = -1; socConstraints(3) = secondordercone(A,b,d,gamma); A = diag([3,0,1]); d = [0;1;0]; socConstraints(2) = secondordercone(A,b,d,gamma); A = diag([0;1/2;1/2]); d = [1;0;0]; socConstraints(1) = secondordercone(A,b,d,gamma); f = [-1;-2;-4];
他のすべての coneprog
出力とともに解における双対変数を要求する問題を解きます。
[x,fval,exitflag,output,lambda] = coneprog(f,socConstraints);
Optimal solution found.
返された lambda
構造体を調査します。唯一の問題制約が錐制約のため、lambda
構造体内の soc
フィールドだけを調査します。
disp(lambda.soc)
1.0e-05 * 0.0543 0.1853 0.0612
制約には、解において制約が有効であることを示す非ゼロの双対値が含まれています。
入力引数
f
— 係数ベクトル
実数ベクトル | 実数配列
係数ベクトル。実数ベクトルまたは実数配列として指定されます。係数ベクトルは、目的関数 f'*x
を表します。表記では、f
が列ベクトルになっていますが、行ベクトルや配列も使用できます。coneprog
は配列 f
を列ベクトル f(:)
に内部的に変換します。
例: f = [1,3,5,-6]
データ型: double
socConstraints
— 2 次錐制約
SecondOrderConeConstraint
オブジェクトのベクトル
SecondOrderConeConstraint
オブジェクトのベクトルとして指定された、2 次錐制約secondordercone
関数を使用してこれらのオブジェクトを作成します。
socConstraints
が次の制約をエンコードします。
ここで、配列と方程式の対応付けを以下に示します。
Asc(i) =
socConstraints.A(i)
bsc(i) =
socConstraints.b(i)
dsc(i) =
socConstraints.d(i)
γ(i) =
socConstraints.gamma(i)
例: Asc = diag([1 1/2 0]); bsc = zeros(3,1); dsc = [0;0;1]; gamma = -1; socConstraints = secondordercone(Asc,bsc,dsc,gamma);
データ型: struct
A
— 線形不等式制約
実数行列
実数行列として指定される線形不等式制約です。A
は M
行 N
列の行列で、M
は不等式の数、N
は変数の数 (f
の長さ) です。大規模な問題の場合は、A
をスパース行列として渡します。
A
は M
個の線形不等式を符号化します。
A*x <= b
,
ここで、x
は N
個の変数 x(:)
の列ベクトル、b
は M
個の要素をもつ列ベクトルです。
たとえば、次の不等式を考えてみましょう。
x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30.
次の制約を入力することによって、不等式を指定します。
A = [1,2;3,4;5,6]; b = [10;20;30];
例: x 成分の和が 1 以下になるように指定するために、A = ones(1,N)
と b = 1
をとります。
データ型: double
b
— 線形不等式制約
実数ベクトル
実数ベクトルで指定される線形不等式制約です。b
は、行列 A
に関連する M
要素ベクトルです。b
を行ベクトルとして渡す場合、ソルバーは b
を列ベクトル b(:)
に内部的に変換します。大規模な問題の場合は、b
をスパース ベクトルとして渡します。
b
は M
個の線形不等式を符号化します。
A*x <= b
,
ここで、x
は N
個の変数 x(:)
の列ベクトル、A
は M
行 N
列の行列です。
たとえば、次の不等式を考えてみましょう。
x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30.
次の制約を入力することによって、不等式を指定します。
A = [1,2;3,4;5,6]; b = [10;20;30];
例: x の成分の和が 1 以下であることを指定するには、A = ones(1,N)
と b = 1
を使用します。
データ型: double
Aeq
— 線形等式制約
実数行列
実数行列として指定される線形等式制約です。Aeq
は Me
行 N
列の行列で、Me
は等式の数、N
は変数の数 (f
の長さ) です。大規模な問題の場合は、Aeq
をスパース行列として渡します。
Aeq
は Me
個の線形等式を符号化します。
Aeq*x = beq
,
ここで、x
は N
個の変数 x(:)
の列ベクトル、beq
は Me
個の要素をもつ列ベクトルです。
たとえば、次の等式を考えてみましょう。
x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20.
次の制約を入力することによって、等式を指定します。
Aeq = [1,2,3;2,4,1]; beq = [10;20];
例: x 成分の和が 1 になるように指定するために、Aeq = ones(1,N)
と beq = 1
をとります。
データ型: double
beq
— 線形等式制約
実数ベクトル
実数ベクトルで指定される線形等式制約です。beq
は、行列 Aeq
に関連する Me
要素ベクトルです。beq
を行ベクトルとして渡す場合、ソルバーは beq
を列ベクトル beq(:)
に内部的に変換します。大規模な問題の場合は、beq
をスパース ベクトルとして渡します。
beq
は Me
個の線形等式を符号化します。
Aeq*x = beq
,
ここで、x
は N
個の変数 x(:)
の列ベクトル、Aeq
は Me
行 N
列の行列です。
たとえば、次の等式を考えてみましょう。
x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20.
次の制約を入力することによって、等式を指定します。
Aeq = [1,2,3;2,4,1]; beq = [10;20];
例: x の成分の和が 1 であることを指定するには、Aeq = ones(1,N)
と beq = 1
を使用します。
データ型: double
lb
— 下限
実数ベクトル | 実数配列
下限。実数ベクトルまたは実数配列として指定されます。f
の長さが lb
の長さと等しい場合、lb
は次を指定します。
x(i) >= lb(i)
(すべての i
について)
numel(lb) < numel(f)
の場合、lb
は次を指定します。
x(i) >= lb(i)
(1 <= i <= numel(lb)
)
この場合、ソルバーによって警告が発行されます。
例: すべての x 成分が正になるように指定するには、lb = zeros(size(f))
を使用します。
データ型: double
ub
— 上限
実数ベクトル | 実数配列
実数ベクトルまたは実数配列として指定される上限です。f
の長さが ub
の長さと等しい場合、ub
は次を指定します。
x(i) <= ub(i)
(すべての i
について)
numel(ub) < numel(f)
の場合、ub
は次を指定します。
x(i) <= ub(i)
(1 <= i <= numel(ub)
)
この場合、ソルバーによって警告が発行されます。
例: すべての x 成分が 1
未満になるように指定するには、ub = ones(size(f))
を使用します。
データ型: double
options
— 最適化オプション
optimoptions
の出力
最適化オプション。optimoptions
の出力として指定されます。
オプション | 説明 |
---|---|
ConstraintTolerance | 制約の実行可能性の許容誤差で |
| 表示レベル (反復表示を参照):
|
LinearSolver | 反復における 1 ステップを解くためのアルゴリズム:
スパースの例については、coneprog アルゴリズムの速度の比較を参照してください。 |
| 可能な反復の最大数 (正の整数)。既定値 |
MaxTime | アルゴリズムを実行する秒単位の最長時間。正の数値または |
| 双対実行可能性に関する終了許容誤差 (正のスカラー)。既定値は |
例: optimoptions('coneprog','Display','iter','MaxIterations',100)
problem
— 問題構造体
構造体
次のフィールドをもつ構造体として指定される問題構造体です。
フィールド名 | エントリ |
---|---|
| 線形目的関数ベクトル f |
| 2 次錐制約の構造体配列 |
| 線形不等式制約の行列 |
| 線形不等式制約のベクトル |
| 線形等式制約の行列 |
| 線形等式制約のベクトル |
lb | 下限のベクトル |
ub | 上限のベクトル |
| 'coneprog' |
| optimoptions で作成されたオプション |
データ型: struct
出力引数
fval
— 解での目的関数値
実数
解での目的関数値。実数として返されます。一般的に、fval
= f'*x
になります。fval
の出力は、exitflag
の値が -2
、-3
、または -10
の場合に空になります。
exitflag
— coneprog
の停止理由
整数
coneprog
の停止理由。整数として返されます。
値 | 説明 |
---|---|
| 関数が解 |
| 反復回数が |
| 実行可能な点が見つかりません。 |
| 問題が非有界です。 |
| 探索方向が小さくなりすぎ、これ以上進むことができないことを示します。 |
| 問題が数値的に不安定です。 |
ヒント
終了フラグ値として 0
、-7
、または -10
を取得した場合は、LinearSolver
オプションの値を変えてみてください。
output
— 最適化プロセスに関する情報
構造体
最適化プロセスに関する情報。次のフィールドをもつ構造体として返されます。
フィールド | 説明 |
---|---|
algorithm | 使用される最適化アルゴリズム |
dualfeasibility | 双対制約違反の最大値 |
dualitygap | 双対性ギャップ |
iterations | 反復回数 |
message | 終了メッセージ |
primalfeasibility | 制約違反の最大値 |
linearsolver | 使用される内部ステップ ソルバー アルゴリズム |
output
のフィールドの dualfeasibility
、dualitygap
、および primalfeasibility
は、exitflag
の値が –2、–3、または –10 の場合に空になります。
lambda
— 解における双対変数
構造体
詳細
2 次錐制約
制約の
が 2 次錐制約と呼ばれる理由3 次元空間で x-y 平面が楕円形の断面で、直径が z 座標に直交している円錐を考えます。y 座標のスケールは ½ で、x座標のスケールは 1 です。[0,0,0] にある点でこの円錐の内部を定義する不等式は次のとおりです。
coneprog
構文では、この円錐は次の引数をとります。
A = diag([1 1/2 0]); b = [0;0;0]; d = [0;0;1]; gamma = 0;
円錐の境界をプロットします。
[X,Y] = meshgrid(-2:0.1:2); Z = sqrt(X.^2 + Y.^2/4); surf(X,Y,Z) view(8,2) xlabel 'x' ylabel 'y' zlabel 'z'
b
引数と gamma
引数によって、円錐が移動します。A
引数と d
引数によって、円錐が回転し、その形状が変化します。
アルゴリズム
アルゴリズムは内点法を使用します。詳細は、2 次錐計画法アルゴリズムを参照してください。
代替機能
アプリ
[最適化] ライブ エディター タスクが coneprog
にビジュアル インターフェイスを提供します。
バージョン履歴
R2020b で導入MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)