ドキュメンテーション

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

fseminf

半無限制約付き多変数非線形関数の最小値を計算する

以下で指定された問題の最小値を見つけます。

minxf(x) such that {Axb,Aeqx=beq,lbxub,c(x)0,ceq(x)=0,Ki(x,wi)0, 1in.

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 はベクトルまたは行列として渡すことができます。行列引数を参照してください。

構文

x = fseminf(fun,x0,ntheta,seminfcon)
x = fseminf(fun,x0,ntheta,seminfcon,A,b)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub,options)
x = fseminf(problem)
[x,fval] = fseminf(...)
[x,fval,exitflag] = fseminf(...)
[x,fval,exitflag,output] = fseminf(...)
[x,fval,exitflag,output,lambda] = fseminf(...)

説明

fseminf は複数変数の半無限制約付きスカラー関数の最小値を初期推定を使って探索します。目的は wi∈ℜ1 (または wi∈ℜ2) のすべての可能な値に対して、制約が満足された状態で f(x) を最小化することです。Ki(x,wi) のすべての可能な値を計算することは不可能であるため、wi に対する領域を選択して、その上で適切にサンプリングした値の集合を計算しなければなりません。

メモ

追加パラメーターの受け渡し は、必要に応じて他のパラメーターを目的関数と非線形制約関数に渡す方法を説明します。

x = fseminf(fun,x0,ntheta,seminfcon) は、x0 を開始値として、seminfcon に定義する半無限制約 ntheta により制約を受けた関数 fun の最小値を求めます。

x = fseminf(fun,x0,ntheta,seminfcon,A,b) はまた、線形不等式 A*x ≤ b も満たすように試みます。

x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq) は線形等式 Aeq*x = beq を制約とした最小化も行います。不等式が存在しない場合は A = [] および b = [] と設定してください。

x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub) は、解が常に lb  x  ub の範囲に存在するように、設計変数 x に上限と下限を定義します。

メモ

詳細は、反復は制約に違反する可能性ありを参照してください。

x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub,options) は、options で指定された最適化オプションを使って最小化します。optimoptions を使用してこれらのオプションを設定してください。

x = fseminf(problem) は、problem の最小値を求めます。ここで、problem入力引数に説明されている構造体です。

作業のエクスポートで説明されているように、最適化アプリから問題をエクスポートして problem 構造体を作成します。

[x,fval] = fseminf(...) は、解 x において、目的関数 fun の値を返します。

[x,fval,exitflag] = fseminf(...) は、終了条件を記述する値 exitflag を返します。

[x,fval,exitflag,output] = fseminf(...) は最適化の情報を含む構造体 output を返します。

[x,fval,exitflag,output,lambda] = fseminf(...) は、解 x におけるラグランジュ乗数をフィールドに含む、構造体 lambda を返します。

メモ

問題の指定された入力範囲が矛盾する場合、出力 xx0、出力 fval[] です。

入力引数

fseminf に渡す引数の一般的な説明は 関数入力引数 にあります。この節では、funnthetaoptionsseminfconproblem の各関数に固有な詳細を示します。

fun

最小化される関数。fun はベクトル x を受け、x で計算した目的関数のスカラー f を返す関数です。関数 fun はファイルの関数ハンドルとして指定することができます。

x = fseminf(@myfun,x0,ntheta,seminfcon)

ここで myfun は次のような MATLAB® 関数です。

function f = myfun(x)
f = ...            % Compute function value at x

fun は無名関数の関数ハンドルにもなります。

fun = @(x)sin(x''*x);

またfun の勾配を計算することもでき、"さらに" 次のように SpecifyObjectiveGradient オプションが true である場合、

options = optimoptions('fseminf','SpecifyObjectiveGradient',true)

関数 fun は 2 番目の出力引数に x での勾配値ベクトル g を返さなければなりません。

ntheta

半無限制約の数。

options

オプションoptions の値の関数固有の詳細を示します。

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 the nonlinear equalities at x

S は推奨サンプリング区間です。この区間を使用するかどうかは任意です。このような制約が存在しない場合には c および ceq に対して [] を返してください。

ベクトルまたは行列 K1, K2, ..., Kntheta は、独立変数 w1, w2, ..., wntheta に個々にサンプリングした値の集合に対して計算した半無限制約を含みます。2 列行列 SK1, K2, ..., Kntheta の評価に使用する値 w1, w2, ..., wntheta に対する推奨サンプリング区間を含みます。Si 番目の行は Ki を計算するための推奨サンプリング区間を含みます。Ki がベクトルである場合、S(i,1) のみを使用してください (2 列目をすべてゼロにすることができます)。Ki が行列である場合、Ki 行のサンプリングに S(i,2) を使用し、Ki の列のサンプリング区間に S(i,1) が使用されます (2 次元の半無限制約 を参照)。最初の反復で SNaN です。そのため seminfcon により任意の初期サンプリング区間を決める必要があります。

メモ

Optimization Toolbox™ の関数がタイプ double の入力のみを受け入れるため、ユーザーが指定した目的関数と非線形制約関数はタイプ double の出力を返さなければなりません。

追加パラメーターの受け渡し必要に応じて seminfcon をパラメーター化する方法を説明します。サンプリング点の作成例は 1 次元と 2 次元のサンプリング点の例を含んでいます。

problem

objective

目的関数

x0

x の初期点
ntheta半無限制約の数
seminfcon半無限制約関数

Aineq

線形不等式制約の行列

bineq

線形不等式制約のベクトル

Aeq

線形等式制約の行列

beq

線形等式制約のベクトル
lb下限のベクトル
ub上限のベクトル

solver

'fseminf'

options

optimoptions で作成されたオプション

出力引数

fseminf が返す引数の一般的な説明は 関数入力引数 にあります。この節では、exitflaglambdaoutput の各関数に固有な詳細を示します。

exitflag

アルゴリズムが停止した理由を示す整数。以下の表は exitflag の値とそれに対応したアルゴリズムが終了した理由を示します。

1

関数が解 x に収束したことを示します。

4

探索方向の大きさが指定した許容誤差より小さく、制約違反が options.ConstraintTolerance より小さいことを示します。

5

方向導関数の大きさが指定した許容誤差より小さく、制約違反が options.ConstraintTolerance より小さいことを示します。

0

反復回数が options.MaxIterations を超過、または関数評価の回数が options.MaxFunctionEvaluations を超過しています。

-1

アルゴリズムが出力関数により停止したことを示します。

-2

実行可能な点が見つかりません。

lambda

x でのラグランジュ乗数を含む構造体 (制約タイプにより分類) です。構造体のフィールドは以下のようになります。

lower

下限 lb

upper

上限 ub

ineqlin

線形不等式

eqlin

線形等式

ineqnonlin

非線形不等式

eqnonlin

非線形等式

output

最適化に関する情報を含む構造体。構造体のフィールドは以下のようになります。

iterations

実行した反復回数

funcCount

関数評価の回数

lssteplength

探索方向に対するライン探索ステップ サイズ

stepsize

x の最終変位

algorithm

使用される最適化アルゴリズム

constrviolation

制約関数の最大値

firstorderopt

1 次の最適性の尺度

message

終了メッセージ

オプション

fseminf により使用される最適化オプションです。options を設定または変更するには optimoptions を使用します。詳細は、最適化オプション リファレンスを参照してください。

一部のオプションは、optimoptions に表示されません。このようなオプションは、次の表ではイタリックで示されています。詳細は、表示オプションを参照してください。

CheckGradients

ユーザー設定の導関数 (目的関数または制約の勾配) と有限差分による導関数とを比較します。選択肢は true または false (既定の設定) です。

optimset の場合、名前は DerivativeCheck で、値は 'on' または 'off' です。詳細は、オプション名の新旧対照表を参照してください。

ConstraintTolerance

制約違反に関する終了許容誤差 (正のスカラー)。既定の設定は 1e-6 です。詳細は、許容誤差と停止条件を参照してください。

optimset の場合、名前は TolCon です。詳細は、オプション名の新旧対照表を参照してください。

Diagnostics

最小化または計算する関数に関する情報を表示します。選択肢は 'on' または 'off' (既定の設定) です。

DiffMaxChange

有限差分勾配を計算する場合に変数内で生じる最大変化量です (正のスカラー)。既定値は Inf です。

DiffMinChange

有限差分勾配を計算する場合に変数内で生じる最小変化量です (正のスカラー)。既定値は 0 です。

Display

表示レベル (反復表示を参照):

  • 'off' または 'none' — 出力を表示しない。

  • 'iter' — 各反復の出力を表示し、既定の終了メッセージを与える。

  • 'iter-detailed' — 各反復の出力を表示し、技術的な終了メッセージを与える。

  • 'notify' — 関数が収束しない場合にのみ出力を表示し、既定の終了メッセージを与える。

  • 'notify-detailed' — 関数が収束しない場合にのみ出力を表示し、技術的な終了メッセージを与える。

  • 'final' (既定の設定) — 最終出力を表示し、既定の終了メッセージを返す。

  • 'final-detailed' — 最終出力のみを表示し、技術的な終了メッセージを与える。

FiniteDifferenceStepSize

有限差分のスカラーまたはベクトルのステップ サイズ ファクター。FiniteDifferenceStepSize をベクトル v に設定すると、前方有限差分 delta

delta = v.*sign′(x).*max(abs(x),TypicalX);

ここで、sign′(0) = 1 を除き sign′(x) = sign(x) です。中心有限差分法では

delta = v.*max(abs(x),TypicalX);

スカラー FiniteDifferenceStepSize はベクトルに拡張します。既定値は、前進有限差分法では sqrt(eps)、中心有限差分法では eps^(1/3) です。

optimset の場合、名前は FinDiffRelStep です。詳細は、オプション名の新旧対照表を参照してください。

FiniteDifferenceType

勾配推定に使用される有限差分は 'forward' (既定の設定) または 'central' (中心) のいずれかです。'central' では 2 倍の関数評価が必要になりますが、正確性が増します。

アルゴリズムは有限差分の両方のタイプを推定するとき、範囲に注意深く従います。そのためたとえば、forward ではなく、backward を選択すると、範囲外の点を計算しないようにすることができます。

optimset の場合、名前は FinDiffType です。詳細は、オプション名の新旧対照表を参照してください。

FunctionTolerance

関数値に関する終了許容誤差 (正のスカラー)。既定値は 1e-4 です。詳細は、許容誤差と停止条件を参照してください。

optimset の場合、名前は TolFun です。詳細は、オプション名の新旧対照表を参照してください。

FunValCheck

目的関数値と制約値が有効であるかどうかをチェックします。'on' は目的関数または制約が complexInf、または NaN の値を返した場合にエラーを表示します。既定の 'off' ではエラーを表示しません。

MaxFunctionEvaluations

可能な関数評価の最大回数 (正の整数)。既定の設定は 100*numberOfVariables です。詳細は、許容誤差と停止条件反復と関数計算回数を参照してください。

optimset の場合、名前は MaxFunEvals です。詳細は、オプション名の新旧対照表を参照してください。

MaxIterations

可能な反復の最大数 (正の整数)。既定値 400 です。詳細は、許容誤差と停止条件反復と関数計算回数を参照してください。

optimset の場合、名前は MaxIter です。詳細は、オプション名の新旧対照表を参照してください。

MaxSQPIter

SQP 反復の最大数 (正の整数)。既定値は 10*max(numberOfVariables, numberOfInequalities + numberOfBounds) です。

OptimalityTolerance

1 次の最適性に関する終了許容誤差 (正のスカラー)。既定の設定は 1e-6 です。詳細は、1 次の最適性の尺度を参照してください。

optimset の場合、名前は TolFun です。詳細は、オプション名の新旧対照表を参照してください。

OutputFcn

各反復で最適化関数が呼び出すユーザー定義の関数を 1 つ以上指定します。関数ハンドルか、関数ハンドルの cell 配列を渡します。既定の設定はなし ([]) です。詳細は、出力関数の構文を参照してください。

PlotFcn

アルゴリズムが実行中のさまざまな進行状況の測定値をプロットします。事前定義されたプロットから選択するか、独自のコードを記述してください。名前、関数ハンドル、または名前か関数ハンドルの cell 配列を渡します。カスタム プロット関数の場合は、関数ハンドルを渡します。既定の設定はなし ([]) です。

  • 'optimplotx' は現在の点をプロットします。

  • 'optimplotfunccount' は関数計算をプロットします。

  • 'optimplotfval' は関数値をプロットします。

  • 'optimplotconstrviolation' は最大制約違反をプロットします。

  • 'optimplotstepsize' はステップ サイズをプロットします。

  • 'optimplotfirstorderopt' は 1 次の最適性尺度をプロットします。

カスタム プロット関数の記述については、プロット関数の構文を参照してください。

optimset の場合、名前は PlotFcns です。詳細は、オプション名の新旧対照表を参照してください。

RelLineSrchBnd

x の変位合計のようなライン探索ステップ長についての相対的な範囲 (実数の非負のスカラー値) は |Δx(i)| ≤ relLineSrchBnd· max(|x(i)|,|typicalx(i)|) を満たします。このオプションはソルバーが fseminf にとって大きすぎるステップを取った場合に、x の変位の大きさを制御します。既定の設定は範囲なし [] です。

RelLineSrchBndDuration

RelLineSrchBnd で指定された範囲の反復数は有効になります (既定値は 1 です)

SpecifyObjectiveGradient

ユーザーが定義する目的関数の勾配。fun の勾配の定義方法については、上述の fun の説明を参照してください。true に設定すると、fseminf は目的関数のユーザー定義の勾配を使用します。既定の false の場合、fseminf は有限差分を使用して勾配を推定します。

optimset の場合、名前は GradObj で、値は 'on' または 'off' です。詳細は、オプション名の新旧対照表を参照してください。

StepTolerance

x に関する許容誤差 (正のスカラー)。既定値は 1e-4 です。詳細は、許容誤差と停止条件を参照してください。

optimset の場合、名前は TolX です。詳細は、オプション名の新旧対照表を参照してください。

TolConSQP

内部反復 SQP 制約違反に関する終了許容誤差 (正のスカラー)。既定の設定は 1e-6 です。

TypicalX

典型的な x の値です。TypicalX の要素数は、開始点 x0 の要素数と等しくなります。既定値は ones(numberofvariables,1) です。fseminf では TypicalX を使用して勾配推定の有限差分をスケーリングします。

メモ:

最適化ルーチン fseminf は、seminfcon に設定された推奨のサンプリング間隔 S を計算中に変更する場合があります。これは、効率性またはロバスト性の点から推奨間隔以外の値の方が適しているためです。また Ki(x, wi) が計算される有限領域 wi は、Ki(x,wi) の局所的最小値の数に重大な変化が起こらない限り、最適化中に変わることができます。

この例は次の関数を最小化します。

(x – 1)2,

以下の制約に従います。

0 ≤ x ≤ 2
g(x, t) = (x – 1/2) – (t – 1/2)2 ≤ 0 (すべての 0 ≤ t ≤ 1 について)

制約なしの目的関数は x = 1 で最小化されます。ただし、制約

g(x, t) ≤ 0 (すべての 0 ≤ t ≤ 1 について)

は、x ≤ 1/2 を意味します。(t – 1/2)2 ≥ 0 に注目することで、以下のようになることを確認できます。

maxt g(x, t) = (x– 1/2)

そのため、x ≤ 1/2 の場合、

maxt g(x, t)) ≤ 0 です。

fseminf を使用してこの問題を解くには以下のようにします。

  1. 無名関数として目的関数を記述します。

    objfun = @(x)(x-1)^2;
  2. 非線形制約 (ここでは [ ])、t の初期サンプリング間隔 (ここでは 0 から 1 まで 0.01 間隔) および半無限制約関数 g(x, t) を含む、半無限制約関数を記述します。

    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;
  3. 初期点 0.2 で fseminf を呼び出し、結果を参照します。

    x = fseminf(objfun,0.2,1,@seminfcon)
    
    Local minimum found that satisfies the constraints.
    
    Optimization completed because the objective function is
    non-decreasing in feasible directions, to within the 
    default value of the function tolerance, and constraints
    are satisfied to within the default value of the
    constraint tolerance.
    
    Active inequalities (to within options.ConstraintTolerance = 1e-006):
      lower      upper     ineqlin   ineqnonlin
                                         1
    
    x =
        0.5000

制限

最小化する関数、制約、半無限制約は、共に x および w の連続関数でなければなりません。fseminf は局所的な解のみを出力する可能性があります。

問題が実行不可能である場合、fseminf は最大制約値を最小化しようと試みます。

アルゴリズム

fseminf は三次と二次の内挿法を使用して、半無限制約のピーク値を推定します。このピーク値を使用して、関数 fmincon の場合と同様に SQP 法に与える制約の集合を形成します。制約数が変わる場合、新しい制約集合に対して、ラグランジュ乗数の再割り当てを行います。

推奨サンプリング間隔の計算では、より多くの点が必要なのか、より少ない点が必要なのかを推定するために、データセット中に現れたピーク値と内挿されたピーク値との間の差が使用されます。関数は、内挿の効率を、曲線を外挿し、それを曲線の他の点と比較することによっても調べることができます。ピーク値が制約境界、すなわち、ゼロに近づく際には、推奨サンプリング区間を狭くします。

使用アルゴリズム、および optimoptionsDisplay オプションを 'iter' に設定したときに Procedures 見出しの下に表示されるプロシージャのタイプについての詳細は、SQP 法の実装も参照してください。fseminf アルゴリズムについての詳細は fseminf の問題の定式化とアルゴリズム を参照してください。

R2006a より前に導入