ドキュメンテーション

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

fgoalattain

多目的ゴール到達問題を解く

説明

fgoalattain はゴール到達問題を解きます。これは多目的最適化問題を最小化するための定式化です。

fgoalattain は、以下で指定された問題の最小値を求めます。

minimizex,γ γ such that {F(x)weightγgoalc(x)0ceq(x)=0AxbAeqx=beqlbxub.

weightgoal、b および beq はベクトル、A および Aeq は行列、F(x)、c(x) および ceq(x) はベクトルを返す関数です。F(x)、c(x)、ceq(x) を非線形関数にすることもできます。

x、lb および ub はベクトルまたは行列として渡すことができます。行列引数を参照してください。

x = fgoalattain(fun,x0,goal,weight)weight で指定する重みで、x0 から始めて、x を変化させることによって fun で設定した目的関数が goal で指定したゴールに到達するように試みます。

メモ

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

x = fgoalattain(fun,x0,goal,weight,A,b) は不等式 A*x ≤ b を制約とするゴール到達問題を解きます。

x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq) は等式 Aeq*x = beq を制約とするゴール到達問題を解きます。不等式が存在しない場合は A = [] および b = [] と設定してください。

x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub) は範囲 lb  x  ub を制約とするゴール到達問題を解きます。等式が存在しない場合には Aeq = []beq = [] を設定してください。x(i) が下に非有界の場合は lb(i) = -Inf を設定してください。x(i) が上に非有界の場合は ub(i) = Inf を設定してください。

メモ

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

メモ

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

x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon) は、nonlcon で定義された非線形不等式 c(x) または非線形等式 ceq(x) を制約とするゴール到達問題を解きます。fgoalattain は、c(x) ≤ 0 および ceq(x) = 0 の下で最適化を行います。範囲が存在しない場合は、lb = [] または ub = []、あるいはその両方を設定します。

x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options) は、options で指定された最適化オプションでゴール到達問題を解きます。optimoptions を使用してこれらのオプションを設定してください。

x = fgoalattain(problem) は、problem についてゴール到達問題を解きます。ここで、problemproblem に記述されている構造体です。作業のエクスポートで説明されているように、最適化アプリから問題をエクスポートして problem 構造体を作成します。

[x,fval] = fgoalattain(___) は、どの構文でも、解 x での fun で計算された目的関数の値を返します。

[x,fval,attainfactor,exitflag,output] = fgoalattain(___) は上記に加え、解 x における到達因子、fgoalattain の終了条件を記述する値 exitflag、および最適化プロセスに関する情報を含む構造体 output を返します。

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

すべて折りたたむ

2 つの目的を持つ次の関数を考えます。

F(x)=[2+(x-3)25+x2/4]

この関数は、F1(x)x=3 で最小値 2 となり、F2(x)x=0 で最小値 5 となることが明らかです。

ゴール [3,6] および重み [1,1] を設定し、x0 = 1 から始めてゴール到達問題を解きます。

fun = @(x)[2+(x-3)^2;5+x^2/4];
goal = [3,6];
weight = [1,1];
x0 = 1;
x = fgoalattain(fun,x0,goal,weight)
Local minimum possible. Constraints satisfied.

fgoalattain stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 2.0000

解での F(x) の値を求めます。

fun(x)
ans = 2×1

    3.0000
    6.0000

fgoalattain がゴールを正確に達成します。

目的関数は次のとおりです。

F(x)=[2+x-p125+x-p22/4]

ここで、p_1 = [2,3] および p_2 = [4,1] です。ゴールは [3,6]、重みは [1,1]、線形制約は x1+x24 です。

目的関数、ゴール、および重みを作成します。

p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

A*x <= b を表す線形制約行列 A および b を作成します。

A = [1,1];
b = 4;

初期点 [1,1] を設定し、ゴール到達問題を解きます。

x0 = [1,1];
x = fgoalattain(fun,x0,goal,weight,A,b)
Local minimum possible. Constraints satisfied.

fgoalattain stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    2.0694    1.9306

解での F(x) の値を求めます。

fun(x)
ans = 2×1

    3.1484
    6.1484

fgoalattain はゴールを満たしていません。重みが等しいため、ソルバーは各ゴールに対して同じ量だけ劣到達になります。

目的関数は次のとおりです。

F(x)=[2+x-p125+x-p22/4]

ここで、p_1 = [2,3] および p_2 = [4,1] です。ゴールは [3,6]、重みは [1,1]、範囲は 0x13, 2x25 です。

目的関数、ゴール、および重みを作成します。

p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

範囲を作成します。

lb = [0,2];
ub = [3,5];

初期点を [1,4] に設定し、ゴール到達問題を解きます。

x0 = [1,4];
A = []; % no linear constraints
b = [];
Aeq = [];
beq = [];
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
Local minimum possible. Constraints satisfied.

fgoalattain stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    2.6667    2.3333

解での F(x) の値を求めます。

fun(x)
ans = 2×1

    2.8889
    5.8889

fgoalattain はゴールを満たし過ぎています。重みが等しいため、ソルバーは各ゴールに対して同じ量だけ過到達になります。

目的関数は次のとおりです。

F(x)=[2+x-p125+x-p22/4]

ここで、p_1 = [2,3] および p_2 = [4,1] です。ゴールは [3,6]、重みは [1,1]、非線形制約は x24 です。

目的関数、ゴール、および重みを作成します。

p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

非線形制約関数は norm4.m ファイルにあります。

type norm4
function [c,ceq] = norm4(x)
ceq = [];
c = norm(x)^2 - 4;

線形制約と範囲のために空の入力引数を作成します。

A = [];
Aeq = [];
b = [];
beq = [];
lb = [];
ub = [];

初期点を [1,1] に設定し、ゴール到達問題を解きます。

x0 = [1,1];
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,@norm4)
Local minimum possible. Constraints satisfied.

fgoalattain stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    1.1094    1.6641

解での F(x) の値を求めます。

fun(x)
ans = 2×1

    4.5778
    7.1991

fgoalattain はゴールを満たしていません。重みが等しいにもかかわらず、F1(x) は 3 というゴールから約 1.58 離れており、F2(x) は 6 というゴールから約 1.2 離れています。非線形制約により、解 x はゴールに等しく到達しません。

反復表示を返すようにオプションを設定して、ゴール到達の求解プロセスを監視します。

options = optimoptions('fgoalattain','Display','iter');

目的関数は次のとおりです。

F(x)=[2+x-p125+x-p22/4]

ここで、p_1 = [2,3] および p_2 = [4,1] です。ゴールは [3,6]、重みは [1,1]、線形制約は x1+x24 です。

目的関数、ゴール、および重みを作成します。

p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

A*x <= b を表す線形制約行列 A および b を作成します。

A = [1,1];
b = 4;

線形等式制約、範囲、および非線形制約のために空の入力引数を作成します。

Aeq = [];
beq = [];
lb = [];
ub = [];
nonlcon = [];

初期点 [1,1] を設定し、ゴール到達問題を解きます。

x0 = [1,1];
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options)
                 Attainment        Max     Line search     Directional 
 Iter F-count        factor    constraint   steplength      derivative   Procedure 
    0      4              0             4                                            
    1      9             -1           2.5            1          -0.535     
    2     14     -1.115e-08        0.2813            1           0.883     
    3     19         0.1452      0.005926            1           0.883     
    4     24         0.1484     2.868e-06            1           0.883     
    5     29         0.1484     6.747e-13            1           0.883    Hessian modified  

Local minimum possible. Constraints satisfied.

fgoalattain stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    2.0694    1.9306

報告された到達因子が正の値である場合、fgoalattain によってゴールを満たす解が見つからないことを示します。

目的関数は次のとおりです。

F(x)=[2+x-p125+x-p22/4]

ここで、p_1 = [2,3] および p_2 = [4,1] です。ゴールは [3,6]、重みは [1,1]、線形制約は x1+x24 です。

目的関数、ゴール、および重みを作成します。

p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

A*x <= b を表す線形制約行列 A および b を作成します。

A = [1,1];
b = 4;

初期点 [1,1] を設定し、ゴール到達問題を解きます。目的関数の値を要求します。

x0 = [1,1];
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)
Local minimum possible. Constraints satisfied.

fgoalattain stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    2.0694    1.9306

fval = 2×1

    3.1484
    6.1484

目的関数値がゴールより大きくなっています。つまり、fgoalattain はゴールを満たしていません。

目的関数は次のとおりです。

F(x)=[2+x-p125+x-p22/4]

ここで、p_1 = [2,3] および p_2 = [4,1] です。ゴールは [3,6]、重みは [1,1]、線形制約は x1+x24 です。

目的関数、ゴール、および重みを作成します。

p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

A*x <= b を表す線形制約行列 A および b を作成します。

A = [1,1];
b = 4;

初期点 [1,1] を設定し、ゴール到達問題を解きます。目的関数、到達因子、終了フラグ、出力構造体、およびラグランジュ乗数の値を要求します。

x0 = [1,1];
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(fun,x0,goal,weight,A,b)
Local minimum possible. Constraints satisfied.

fgoalattain stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    2.0694    1.9306

fval = 2×1

    3.1484
    6.1484

attainfactor = 0.1484
exitflag = 4
output = struct with fields:
         iterations: 6
          funcCount: 29
       lssteplength: 1
           stepsize: 4.1442e-13
          algorithm: 'active-set'
      firstorderopt: []
    constrviolation: 6.7468e-13
            message: '...'

lambda = struct with fields:
         lower: [2x1 double]
         upper: [2x1 double]
         eqlin: [0x1 double]
      eqnonlin: [0x1 double]
       ineqlin: 0.5394
    ineqnonlin: [0x1 double]

attainfactor が正の値である場合、ゴールに到達していないことを示します。これは、fvalgoal と比較することによっても確認できます。

lambda.ineqlin の値が非ゼロです。これは、線形不等式によって解が制約を受けていることを示します。

目的関数は次のとおりです。

F(x)=[2+x-p125+x-p22/4]

ここで、p_1 = [2,3] および p_2 = [4,1] です。ゴールは [3,6]、初期重みは [1,1] です。

目的関数、ゴール、および初期重みを作成します。

p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

線形制約 x1+x24 を設定します。

A = [1 1];
b = 4;

x0 = [1 1] から始めてゴール到達問題を解きます。

x0 = [1 1];
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)
Local minimum possible. Constraints satisfied.

fgoalattain stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    2.0694    1.9306

fval = 2×1

    3.1484
    6.1484

fval の各成分が goal の対応する成分より大きくなっています。これは、ゴールに到達していないことを示します。

weight(1) をより小さい値に設定して、最初のゴールを満たす重要度を高めます。

weight(1) = 1/10;
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)
Local minimum possible. Constraints satisfied.

fgoalattain stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    2.0115    1.9885

fval = 2×1

    3.0233
    6.2328

fval(1) の値は goal(1) にかなり近くなっていますが、fval(2)goal(2) から離れています。

goal(2) を、現在の解より大きい 7 に変更します。解が変化します。

goal(2) = 7;
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)
Local minimum possible. Constraints satisfied.

fgoalattain stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    1.9639    2.0361

fval = 2×1

    2.9305
    6.3047

fval の両方の成分が goal の対応する成分より小さくなっています。しかし、fval(2)goal(2) に比べて、fval(1)goal(1) はかなり近くなっています。重みを小さくすると、ゴールに到達できない場合にはその成分がほぼ満たされる可能性が高くなり、ゴールに到達できる場合には過到達の程度が低くなります。

重みが等しくなるように変更します。fval の結果は、ゴールからの距離が等しくなります。

weight(2) = 1/10;
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)
Local minimum possible. Constraints satisfied.

fgoalattain stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    1.7613    2.2387

fval = 2×1

    2.6365
    6.6365

制約によって、結果として得られる fval がゴールに等しく近くならないことがあります。たとえば、x(2) の上限を 2 に設定します。

ub = [Inf,2];
lb = [];
Aeq = [];
beq = [];
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
Local minimum possible. Constraints satisfied.

fgoalattain stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    2.0000    2.0000

fval = 2×1

    3.0000
    6.2500

この場合、fval(1) はそのゴールを正確に満たしますが、fval(2) はゴールより小さくなります。

入力引数

すべて折りたたむ

目的関数。関数ハンドルまたは関数名として指定します。fun は、ベクトル x を受け入れ、ベクトル F (x で評価される目的関数) を返す関数です。関数 fun は関数ファイルの関数ハンドルとして指定することができます。

x = fgoalattain(@myfun,x0,goal,weight)

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

function F = myfun(x)
F = ...         % Compute function values at x.

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

x = fgoalattain(@(x)sin(x.*x),x0,goal,weight);

xF のユーザー定義の値が配列である場合、fgoalattain は線形インデックスを使用してベクトルに変換します (配列インデックス付け (MATLAB)を参照)。

目的関数を可能な限りゴールに近づけるには (すなわち、大きくもなく小さくもなくするには) optimoptions を使用して EqualityGoalCount オプションをゴール値の近傍にあることが必要な目的関数の数に設定してください。このような目的関数を fun が返すベクトル F の最初の要素に割り当て "なければなりません"。

また目的関数の勾配を計算することもでき、"さらに" 次のように SpecifyObjectiveGradient オプションが true であるとします。

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

この場合、関数 fun は 2 番目の出力引数に x での勾配値 G (行列) を返さなければなりません。勾配は点 x における各 F の偏導関数 dF/dx です。F が長さ m のベクトルであり、x の長さが n で、nx0 の長さである場合、F(x) の勾配 Gnm 列の行列です。ここで G(i,j)F(j)x(i) に関する偏導関数です (すなわち、G の第 j 番目の列が j 番目の目的関数 F(j) の勾配です)。

メモ

SpecifyObjectiveGradienttrue に設定することは、問題に非線形制約がない場合と、問題の非線形制約の SpecifyConstraintGradienttrue の場合のみ有効です。内部的に目的関数が制約に含まれるため、ソルバーは、勾配推定を避けるために両方の勾配 (目的関数と制約) が指定されていることを必要とします。

データ型: char | string | function_handle

初期点。実数ベクトルまたは実数配列として指定されます。ソルバーは、x0 の要素数および x0 のサイズを使用して、fun が受け入れる変数の数およびサイズを決定します。

例: x0 = [1,2,3,4]

データ型: double

到達するゴール。実数ベクトルとして指定します。fgoalattain は、解 x で i のすべての値に対してこれらの不等式を満足する最小乗数 γ を求めようとします。

Fi(x)goaliweightiγ.

weight が正のベクトルであると仮定します。

  • ソルバーによってすべてのゴールに同時に到達する点 x が見つかる場合、到達因子 γ は負であり、ゴールは過到達になります。

  • ソルバーによってすべてのゴールに同時に到達する点 x が見つからない場合、到達因子 γ は正であり、ゴールは劣到達になります。

例: [1 3 6]

データ型: double

相対到達因子。実数ベクトルとして指定します。fgoalattain は、解 x で i のすべての値に対してこれらの不等式を満足する最小乗数 γ を求めようとします。

Fi(x)goaliweightiγ.

goal の値が "すべて非ゼロ" であるとき、有効な目的関数の劣到達または過到達が同じ割合になるように、weightabs(goal) に設定してください (アクティブな目的関数は、解におけるゴールのさらなる改良に対する障害になる目的関数の集合です)。

メモ:

weight ベクトルの成分をゼロへ設定すると、ゴール制約としてではなく厳しい制約として、対応するゴール到達は処理されます。厳しい制約を設定する代わりの方法は、入力引数 nonlcon を使用することです。

weight が正であるとき、fgoalattain は目的関数がゴール値より小さくなるようにします。目的関数がゴール値より大きくなるようにするには、weight を正ではなく負に設定してください。重みが解に与えるいくつかの影響については、ゴール到達での重み、ゴール、および制約の影響を参照してください。

目的関数が可能な限りゴール値に近づくようにするには、EqualityGoalCount オプションを使用して、この目的関数を fun が返すベクトルの最初の要素として指定してください (fun および options を参照)。例については、多目的ゴール到達の最適化を参照してください。

例: abs(goal)

データ型: double

実数行列として指定される線形不等式制約です。AMN 列の行列で、M は不等式の数、N は変数の数 (x0 の要素数) です。大規模な問題の場合は、A をスパース行列として渡します。

AM 個の線形不等式を符号化します。

A*x <= b

ここで、xN 個の変数 x(:) の列ベクトル、bM 個の要素をもつ列ベクトルです。

たとえば、次を指定します。

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 は、行列 A に関連する M 要素ベクトルです。b を行ベクトルとして渡す場合、ソルバーは b を列ベクトル b(:) に内部的に変換します。大規模な問題の場合は、b をスパース ベクトルとして渡します。

bM 個の線形不等式を符号化します。

A*x <= b

ここで、xN 個の変数 x(:) の列ベクトル、AMN 列の行列です。

たとえば、次を指定します。

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

実数行列として指定される線形等式制約です。AeqMeN 列の行列で、Me は等式の数、N は変数の数 (x0 の要素数) です。大規模な問題の場合は、Aeq をスパース行列として渡します。

AeqMe 個の線形等式を符号化します。

Aeq*x = beq

ここで、xN 個の変数 x(:) の列ベクトル、beqMe 個の要素をもつ列ベクトルです。

たとえば、次を指定します。

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 は、行列 Aeq に関連する Me 要素ベクトルです。beq を行ベクトルとして渡す場合、ソルバーは beq を列ベクトル beq(:) に内部的に変換します。大規模な問題の場合は、beq をスパース ベクトルとして渡します。

beqMe 個の線形等式を符号化します。

Aeq*x = beq

ここで、xN 個の変数 x(:) の列ベクトル、AeqMeN 列の行列です。

たとえば、次を指定します。

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

下限。実数ベクトルまたは実数配列として指定されます。x0 の要素数と lb の要素数が等しい場合、lb は次を指定します。

x(i) >= lb(i) (すべての i について)

numel(lb) < numel(x0) の場合、lb は次を指定します。

x(i) >= lb(i) (1 <= i <= numel(lb))

x0 より lb の要素数が少ない場合、ソルバーは警告を生成します。

例: x のすべての成分が正であることを指定するには、lb = zeros(size(x0)) を使用します。

データ型: double

実数ベクトルまたは実数配列として指定される上限です。x0 の要素数と ub の要素数が等しい場合、ub は次を指定します。

x(i) <= ub(i) (すべての i について)

numel(ub) < numel(x0) の場合、ub は次を指定します。

x(i) <= ub(i) (1 <= i <= numel(ub))

x0 より ub の要素数が少ない場合、ソルバーは警告を生成します。

例: x のすべての成分が 1 未満であることを指定するには、ub = ones(size(x0)) を使用します。

データ型: double

非線形制約。関数ハンドルまたは関数名として指定されます。nonlcon は、ベクトルまたは配列 x を受け、2 つの配列 c(x) および ceq(x) を返す関数です。

  • c(x) は、x での非線形不等式制約の配列です。fgoalattain は次の条件を満たそうとします。

    c のすべてのエントリに対して c(x) <= 0

  • ceq(x) は、x での非線形等式制約の配列です。fgoalattain は次の条件を満たそうとします。

    ceq のすべてのエントリに対して ceq(x) = 0

たとえば、

x = fgoalattain(@myfun,x0,...,@mycon)

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

function [c,ceq] = mycon(x)
c = ...     % Compute nonlinear inequalities at x.
ceq = ...   % Compute nonlinear equalities at x.

また制約関数の勾配を計算することができ、"さらに" 次のように SpecifyConstraintGradient オプションが true であるとします。

options = optimoptions('fgoalattain','SpecifyConstraintGradient',true)

この場合、関数 nonlcon は 3 番目および 4 番目の出力引数に c(x) の勾配 GC および ceq(x) の勾配 GCeq を返さなければなりません。与えられた勾配を受け付けないソルバーに使用する勾配を条件付ける方法の説明は、非線形制約を参照してください。

nonlconm 成分のベクトル c を返し、x の長さが n で、nx0 の長さである場合、c(x) の勾配 GCnm 列の行列です。ここで GC(i,j)c(j)x(i) に関する偏導関数です (すなわち、GC の第 j 列が j 番目の不等式制約 c(j) の勾配です)。ceqp 個の成分をもち、ceq(x) の勾配 GCeqnp 列の行列である場合も同様です。このとき、GCeq(i,j)ceq(j)x(i) に関する偏導関数です (すなわち、GCeq の第 j 列が j 番目の等式制約 ceq(j) の勾配です)。

メモ

SpecifyConstraintGradienttrue への設定は SpecifyObjectiveGradienttrue に設定されている場合のみ効果的です。内部的に目的関数が制約に含まれるため、ソルバーは、勾配推定を避けるために両方の勾配 (目的関数と制約) が指定されていることを必要とします。

メモ:

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

必要に応じて非線形制約関数 nonlcon をパラメーター化する方法については、追加パラメーターの受け渡しを参照してください。

データ型: char | function_handle | string

最適化オプション。optimoptions の出力、または optimset などによって返される構造体として指定されます。

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

optimset の名前が異なるオプションの詳細は、オプション名の新旧対照表を参照してください。

オプション説明
ConstraintTolerance

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

optimset の場合、名前は TolCon です。

Diagnostics

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

DiffMaxChange

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

DiffMinChange

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

Display

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

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

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

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

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

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

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

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

EqualityGoalCount

目的関数 fun がゴール goal (非負の整数) と等しくなるために必要な目的関数の数。目的関数は F の最初の数要素に割り当てなければなりません。既定値は 0 です。例については、多目的ゴール到達の最適化を参照してください。

optimset の場合、名前は GoalsExactAchieve です。

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-6 です。詳細は、許容誤差と停止条件を参照してください。

optimset の場合、名前は TolFun です。

FunValCheck

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

MaxFunctionEvaluations

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

optimset の場合、名前は MaxFunEvals です。

MaxIterations

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

optimset の場合、名前は MaxIter です。

MaxSQPIter

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

MeritFunction

このオプションを 'multiobj' (既定の設定) に設定した場合、ゴール到達メリット関数を使用します。このオプションを 'singleobj' に設定した場合、メリット関数 fmincon を使用します。

OptimalityTolerance

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

optimset の場合、名前は TolFun です。

OutputFcn

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

PlotFcn

アルゴリズム実行時における、進行状態の各種測定値を示すプロット。定義済みのプロットから選択するか、自身で記述します。名前、関数ハンドル、または名前か関数ハンドルの cell 配列を渡します。カスタム プロット関数の場合は、関数ハンドルを渡します。既定の設定はなし ([]) です。

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

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

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

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

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

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

optimset の場合、名前は PlotFcns です。

RelLineSrchBnd

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

RelLineSrchBndDuration

RelLineSrchBnd で範囲を指定された反復数が有効になります。既定値は 1 です。

SpecifyConstraintGradient

ユーザーにより定義される非線形制約関数に対する勾配。nonlcon で説明されているように、このオプションが true に設定されている場合、fgoalattain では制約関数に 4 つの出力を求めるようになります。このオプションを false (既定の設定) に設定すると、fgoalattain は有限差分を使用して非線形制約の勾配を推定します。

optimset の場合、名前は GradConstr で、値は 'on' または 'off' です。

SpecifyObjectiveGradient

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

optimset の場合、名前は GradObj で、値は 'on' または 'off' です。

StepTolerance

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

optimset の場合、名前は TolX です。

TolConSQP

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

TypicalX

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

UseParallel

並列計算の指標。true の場合、fgoalattain は並列で勾配を推定します。既定値は false です。詳細は、並列計算を参照してください。

例: optimoptions('fgoalattain','PlotFcn','optimplotfval')

問題構造体。次の表のフィールドをもつ構造体として指定します。

フィールド名エントリ

objective

目的関数 fun

x0

x の初期点

goal

到達するゴール

weight

相対的に重要なゴール因子

Aineq

線形不等式制約の行列

bineq

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

Aeq

線形等式制約の行列

beq

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

nonlcon

非線形制約関数

solver

'fgoalattain'

options

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

problem 構造体では、少なくとも objectivex0goalweightsolver、および options フィールドを指定しなければなりません。

problem 構造体を取得する最も簡単な方法は、最適化アプリから問題をエクスポートすることです。

データ型: struct

出力引数

すべて折りたたむ

実数ベクトルまたは実数配列として返される解です。x のサイズは、x0 のサイズと同じです。通常、exitflag が正の場合、x は問題に対する局所的な解になります。解の質に関する詳細は、ソルバーが成功する場合 を参照してください。

解での目的関数値。実数配列として返されます。一般的に、fval = fun(x) になります。

到達因子。実数として返されます。attainfactor は解での γ の値を含みます。attainfactor が負である場合、ゴールは過到達になります。attainfactor が正である場合、ゴールは劣到達になります。詳細は、goal を参照してください。

fgoalattain の停止理由。整数として返されます。

1

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

4

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

5

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

0

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

-1

出力関数またはプロット関数によって停止したことを示します。

-2

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

最適化プロセスに関する情報。次の表のフィールドをもつ構造体として返されます。

iterations

実行した反復回数

funcCount

関数評価の回数

lssteplength

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

constrviolation

制約関数の最大値

stepsize

x の最終ステップ サイズ

algorithm

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

firstorderopt

1 次の最適性の尺度

message

終了メッセージ

解におけるラグランジュ乗数。次の表のフィールドをもつ構造体として返されます。

lower

lb に対応する下限

upper

ub に対応する上限

ineqlin

A および b に対応する線形不等式

eqlin

Aeq および beq に対応する線形等式

ineqnonlin

nonlconc に対応する非線形不等式

eqnonlin

nonlconceq に対応する非線形等式

アルゴリズム

fgoalattain アルゴリズムの説明およびゴール到達の概念の詳細は、アルゴリズムを参照してください。

拡張機能

R2006a より前に導入