fseminf
半無限制約付き多変数非線形関数の最小値を計算する
構文
説明
fseminf
は、以下で指定された問題の最小値を見つける非線形計画法ソルバーです。
b と beq はベクトルです。
A と Aeq は行列です。
c(x)、ceq(x)、および Ki(x,wi) はベクトルを返す関数です。
f(x) はスカラーを返す関数です。
f(x)、c(x)、および ceq(x) は非線形関数とすることができます。ベクトル (または行列) Ki(x,wi) ≤ 0 は x および変数 w1,w2,...,wn の付加的な集合から成る連続関数です。変数 w1,w2,...,wn は長くても長さ 2 のベクトルです。
x、lb および ub はベクトルまたは行列として渡すことができます。行列引数を参照してください。
例
半無限制約のある関数の最小化
次の関数を最小化します。
,
以下の制約に従います。
(すべての について)
制約なしの目的関数は で最小化されます。ただし、次の制約
(すべての について)
は、 を意味します。つまり、 であることから、
.
したがって次のようになります。
のとき
fseminf
を使用してこの問題を解くには、無名関数として目的関数を記述します。
objfun = @(x)(x-1)^2;
非線形制約 [ ]、 の初期サンプリング間隔 (0 から 1 まで 0.01 間隔) および半無限制約関数 を含む、半無限制約関数 seminfcon
を記述します。関数 seminfcon
のコードは、この例の終わりに掲載しています。
初期点 x0 = 0.2
を設定します。
x0 = 0.2;
半無限制約を 1 つ指定します。
ntheta = 1;
fseminf
を呼び出して問題を解き、結果を表示します。
x = fseminf(objfun,x0,ntheta,@seminfcon)
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
x = 0.5000
次のコードは関数 seminfcon
を作成します。
function [c, ceq, K1, s] = seminfcon(x,s) % No finite nonlinear inequality and equality constraints c = []; ceq = []; % Sample set if isnan(s) % Initial sampling interval s = [0.01 0]; end t = 0:s(1):1; % Evaluate the semi-infinite constraint K1 = (x - 0.5) - (t - 0.5).^2; end
fseminf
出力の検証
次の関数を最小化します。
,
以下の制約に従います。
(すべての について)
この問題は、例半無限制約のある関数の最小化で定式化して解きます。解および解法プロセスに関する詳細は、この例にまとめています。
fseminf
を使用してこの問題を解くには、無名関数として目的関数を記述します。
objfun = @(x)(x-1)^2;
非線形半無限制約関数 seminfcon
のコードは、この例の終わりに掲載しています。
初期点 x0 = 0.2
を設定します。
x0 = 0.2;
半無限制約を 1 つ指定します。
ntheta = 1;
fseminf
を呼び出して問題を解き、結果を表示します。
A = [];
b = [];
Aeq = [];
beq = [];
lb = 0;
ub = 2;
[x,fval,exitflag,output,lambda] = fseminf(objfun,x0,ntheta,@seminfcon,...
A,b,Aeq,beq,lb,ub)
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
x = 0.5000
fval = 0.2500
exitflag = 1
output = struct with fields:
iterations: 2
funcCount: 4
lssteplength: 1
stepsize: 4.6841e-12
algorithm: 'active-set'
firstorderopt: 9.3682e-12
constrviolation: 4.6841e-12
message: 'Local minimum found that satisfies the constraints....'
lambda = struct with fields:
lower: 0
upper: 0
eqlin: [0x1 double]
eqnonlin: [0x1 double]
ineqlin: [0x1 double]
ineqnonlin: [1x0 double]
返された情報から次のことがわかります。
問題の解は において得られた。
目的関数 値は である。
ソルバーは反復を 2 回行い、関数評価を 4 回行ったところで解に到達した。
半無限制約以外の制約は範囲のみであるため、
lambda
構造体は線形値も非線形値ももたない。解がどちらの境界にもないため、範囲に対応するlambda.lower
フィールドとlambda.upper
フィールドは空ではなく、ゼロ値をもつ。
次のコードは関数 seminfcon
を作成します。
function [c, ceq, K1, s] = seminfcon(x,s) % No finite nonlinear inequality and equality constraints c = []; ceq = []; % Sample set if isnan(s) % Initial sampling interval s = [0.01 0]; end t = 0:s(1):1; % Evaluate the semi-infinite constraint K1 = (x - 0.5) - (t - 0.5).^2; end
入力引数
fun
— 最小化する関数
関数ハンドル | 関数名
最小化する関数。関数ハンドルまたは関数名として指定されます。fun
は、ベクトルまたは配列 x
を受け、x
で評価される目的関数の実数スカラー f
を返す関数です。
fseminf
は、目的関数および任意の非線形制約関数に x0
引数の形式で x
を渡します。たとえば、x0
が 5 行 3 列の配列の場合、fseminf
は 5 行 3 列の配列として x
を fun
に渡します。ただし、fseminf
は、x
を列ベクトル x(:)
に変換してから、線形制約行列 A
または Aeq
を x
と乗算します。
fun
をファイルの関数ハンドルとして指定します。
x = fseminf(@myfun,...)
ここで myfun
は次のような MATLAB® 関数です。
function f = myfun(x) f = ... % Compute function value at x
fun
は、無名関数の関数ハンドルとして指定することもできます。
x = fseminf(@(x)norm(x)^2,...);
fun
の勾配を計算することができ、"さらに" 次のように SpecifyObjectiveGradient
オプションが true
に設定されている場合、
options = optimoptions('fseminf','SpecifyObjectiveGradient',true);
fun
は 2 番目の出力引数に勾配ベクトル g(x)
を出力しなければなりません。
例: fun = @(x)sin(x(1))*cos(x(2))
データ型: char
| function_handle
| string
x0
— 初期点
実数ベクトル | 実数配列
初期点。実数ベクトルまたは実数配列として指定されます。ソルバーは、x0
の要素数および x0
のサイズを使用して、fun
が受け入れる変数の数およびサイズを決定します。
例: x0 = [1,2,3,4]
データ型: double
ntheta
— 半無限制約の数
正の整数
半無限制約の数。正の整数として指定します。
例: 4
データ型: double
seminfcon
— 非線形制約および半無限制約を計算する関数
関数ハンドル | 関数名
非線形不等式制約のベクトル c
、非線形等式制約のベクトル ceq
および点 x
において区間 S
で計算される K1
, K2
,...
, Kntheta
である ntheta
個の半無限制約 (ベクトルあるいは行列) を演算する関数です。seminfcon
は関数ハンドルとして指定できます。
x = fseminf(@myfun,x0,ntheta,@myinfcon)
ここで myinfcon
は次のような MATLAB 関数です。
function [c,ceq,K1,K2,...,Kntheta,S] = myinfcon(x,S) % Initial sampling interval if isnan(S(1,1)), S = ...% S has ntheta rows and 2 columns end w1 = ...% Compute sample set w2 = ...% Compute sample set ... wntheta = ... % Compute sample set K1 = ... % 1st semi-infinite constraint at x and w K2 = ... % 2nd semi-infinite constraint at x and w ... Kntheta = ...% Last semi-infinite constraint at x and w c = ... % Compute nonlinear inequalities at x ceq = ... % Compute nonlinear equalities at x
S
は推奨サンプリング区間です。関数が使用しない場合があります。このような制約が存在しない場合には c
および ceq
に対して []
を返してください。
ベクトルまたは行列 K1
, K2
, ...
, Kntheta
は、独立変数 w1
, w2
, ...
, wntheta
に個々にサンプリングした値の集合に対して計算した半無限制約を含みます。2 列行列 S
は K1
, K2
, ...
, Kntheta
の評価に使用する値 w1
, w2
, ...
, wntheta
に対する推奨サンプリング区間を含みます。S
の i
番目の行は K
i
を計算するための推奨サンプリング区間を含みます。K
i
がベクトルである場合、関数は S(i,1)
のみを使用します (2 列目をすべてゼロにすることができます)。K
i
が行列である場合、関数は K
i
行のサンプリングに S(i,2)
を使用し、K
i
の列のサンプリング区間に S(i,1)
を使用します (2 次元の半無限制約を参照)。最初の反復で S
は NaN
であるため、seminfcon
により任意の初期サンプリング区間を決める必要があります。
メモ
Optimization Toolbox™ の関数が double
型の入力のみを受け入れるため、ユーザーが指定した目的関数と非線形制約関数は double
型の出力を返さなければなりません。
seminfcon
をパラメーター化する方法については、必要に応じて追加パラメーターの受け渡しを参照してください。1 次元と 2 次元のサンプリング点の例については、サンプリング点の作成例を参照してください。
A
— 線形不等式制約
実数行列
実数行列として指定される線形不等式制約です。A
は M
行 N
列の行列で、M
は不等式の数、N
は変数の数 (x0
の要素数) です。大規模な問題の場合は、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
は変数の数 (x0
の要素数) です。大規模な問題の場合は、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
— 下限
実数ベクトル | 実数配列
下限。実数ベクトルまたは実数配列として指定されます。x0
の要素数と lb
の要素数が等しい場合、lb
は次を指定します。
x(i) >= lb(i)
(すべての i
について)
numel(lb) < numel(x0)
の場合、lb
は次を指定します。
x(i) >= lb(i)
(1 <= i <= numel(lb)
)
lb
の要素数が x0
より少ない場合、ソルバーは警告を生成します。
例: x のすべての成分が正であることを指定するには、lb = zeros(size(x0))
を使用します。
データ型: double
ub
— 上限
実数ベクトル | 実数配列
実数ベクトルまたは実数配列として指定される上限です。x0
の要素数と ub
の要素数が等しい場合、ub
は次を指定します。
x(i) <= ub(i)
(すべての i
について)
numel(ub) < numel(x0)
の場合、ub
は次を指定します。
x(i) <= ub(i)
(1 <= i <= numel(ub)
)
ub
の要素数が x0
より少ない場合、ソルバーは警告を生成します。
例: x のすべての成分が 1 未満であることを指定するには、ub = ones(size(x0))
を使用します。
データ型: double
options
— 最適化オプション
optimoptions
の出力 | optimset
などによって返される構造体
最適化オプション。optimoptions
の出力、または optimset
などによって返される構造体として指定されます。詳細は、最適化オプション リファレンスを参照してください。
一部のオプションは、optimoptions
に表示されません。このようなオプションは、次の表ではイタリックで示されています。詳細は、最適化オプションの表示を参照してください。
オプション | 説明 |
---|---|
| ユーザー設定の導関数 (目的関数または制約の勾配) と有限差分による導関数とを比較します。選択肢は
|
ConstraintTolerance | 制約違反に関する終了許容誤差 (正のスカラー)。既定値は
|
Diagnostics | 最小化または計算する関数に関する情報を表示します。選択肢は |
DiffMaxChange | 有限差分勾配を計算する場合に変数内で生じる最大変化量です (正のスカラー)。既定値は |
DiffMinChange | 有限差分勾配を計算する場合に変数内で生じる最小変化量です (正のスカラー)。既定値は |
Display | 表示レベル (反復表示を参照):
|
FiniteDifferenceStepSize | 有限差分のスカラーまたはベクトルのステップ サイズ ファクター。
sign′(0) = 1 を除き sign′(x) = sign(x) です。中心有限差分法では
FiniteDifferenceStepSize はベクトルに拡張します。既定値は、前進有限差分法では sqrt(eps) 、中心有限差分法では eps^(1/3) です。
|
FiniteDifferenceType | 勾配推定に使用される有限差分は アルゴリズムは有限差分の両方のタイプを推定するとき、範囲に注意深く従います。たとえば、範囲外の点を計算しないようにするため、アルゴリズムは forward 差分ではなく backward 差分を選択する場合があります。
|
FunctionTolerance | 関数値に関する終了許容誤差 (正のスカラー)。既定の設定は
|
FunValCheck | 目的関数値および制約値が正しいかどうかチェックします。 |
MaxFunctionEvaluations | 可能な関数評価の最大回数 (正の整数)。既定の設定は
|
MaxIterations | 可能な反復の最大数 (正の整数)。既定値
|
MaxSQPIter | SQP 反復の最大数 (正の整数)。既定値は |
OptimalityTolerance | 1 次の最適性に関する終了許容誤差 (正のスカラー)。既定値は
|
OutputFcn | 各反復で最適化関数に呼び出されるユーザー定義の関数を 1 つ以上指定します。関数ハンドルか、関数ハンドルの cell 配列を渡します。既定の設定はなし ( |
PlotFcn | アルゴリズムが実行中のさまざまな進行状況の測定値をプロットします。事前定義されたプロットから選択するか、独自のコードを記述してください。名前、関数ハンドル、または名前か関数ハンドルの cell 配列を渡します。カスタム プロット関数の場合は、関数ハンドルを渡します。既定の設定はなし (
カスタムのプロット関数は、出力関数と同じ構文を使用します。詳細は、Optimization Toolbox の出力関数と出力関数とプロット関数の構文を参照してください。
|
RelLineSrchBnd |
|
RelLineSrchBndDuration |
|
SpecifyObjectiveGradient | ユーザーが定義する目的関数の勾配。
|
StepTolerance |
|
TolConSQP | 内部反復 SQP 制約違反に関する終了許容誤差。正のスカラーです。既定値は |
TypicalX | 典型的な |
例: options = optimoptions('fseminf','PlotFcn','optimplotfval')
problem
— 問題構造体
構造体
次のフィールドをもつ構造体として指定される問題構造体です。
フィールド名 | エントリ |
---|---|
| 目的関数 |
| x の初期点 |
| 半無限制約の数 |
| 半無限制約関数 |
| 線形不等式制約の行列 |
| 線形不等式制約のベクトル |
| 線形等式制約の行列 |
| 線形等式制約のベクトル |
lb | 下限のベクトル |
ub | 上限のベクトル |
| 'fmseminf' |
| optimoptions で作成されたオプション |
problem
構造体では、少なくとも objective
、x0
、seminfcon
、solver
、および options
フィールドを指定しなければなりません。
データ型: struct
出力引数
x
— 解
実数ベクトル | 実数配列
実数ベクトルまたは実数配列として返される解です。x
のサイズは、x0
のサイズと同じです。通常、exitflag
が正の場合、x
は問題に対する局所的な解になります。解の質に関する詳細は、ソルバーが成功する場合 を参照してください。
fval
— 解での目的関数値
実数
解での目的関数値。実数として返されます。一般的に、fval
= fun(x)
になります。
exitflag
— fseminf
の停止理由
整数
fseminf
の停止理由。整数として返されます。
フラグ | 説明 |
---|---|
| 関数が解 |
| 探索方向の大きさが指定した許容誤差より小さく、制約違反が |
| 方向導関数の大きさが指定した許容誤差より小さく、制約違反が |
| 反復回数が |
| 出力関数またはプロット関数によって停止したことを示します。 |
| 実行可能な点が見つかりません。 |
output
— 最適化プロセスに関する情報
構造体
最適化プロセスに関する情報。次のフィールドをもつ構造体として返されます。
フィールド名 | 説明 |
---|---|
iterations | 実行した反復回数 |
funcCount | 関数評価の回数 |
lssteplength | 探索方向に対する直線探索ステップ サイズ |
stepsize |
|
algorithm | 使用される最適化アルゴリズム |
constrviolation | 制約関数の最大値 |
firstorderopt | 1 次の最適性の尺度 |
message | 終了メッセージ |
iterations | 実行した反復回数 |
funcCount | 関数評価の回数 |
制限
最小化する関数、制約、半無限制約は、
x
およびw
の連続関数でなければなりません。fseminf
は局所解のみを出力する可能性があります。
アルゴリズム
fseminf
は三次と二次の内挿法を使用して、半無限制約のピーク値を推定します。アルゴリズムは、このピーク値を使用して、関数 fmincon
の場合と同様に SQP 法に与える制約の集合を形成します。制約数が変わる場合は、新しい制約集合に対して、ラグランジュ乗数の再割り当てを行います。
推奨サンプリング間隔の計算では、より多くの点が必要なのか、より少ない点が必要なのかを推定するために、データセット中のピーク値と内挿されたピーク値との間の差が使用されます。関数は、内挿の効率を、曲線を外挿し、それを曲線の他の点と比較することによっても調べることができます。ピーク値が制約境界、すなわち、ゼロに近づく際には、推奨サンプリング区間が狭くなります。
問題が実行不可能である場合、fseminf
は最大制約値を最小化しようと試みます。
使用アルゴリズム、および optimoptions
で Display
オプションを 'iter'
に設定したときに Procedures
見出しの下に表示されるプロシージャのタイプについての詳細は、SQP 法の実装を参照してください。fseminf
アルゴリズムについての詳細は fseminf の問題の定式化とアルゴリズム を参照してください。
バージョン履歴
R2006a より前に導入
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)