Main Content

このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。

createOptimProblem

最適化問題構造を作成する

説明

problem = createOptimProblem(solverName) は、solverName ソルバー用の空の最適化問題構造を作成します。

problem = createOptimProblem(solverName,Name,Value) は、1 つ以上の名前と値の引数を使用して追加のオプションを指定します。

すべて折りたたむ

次の仕様で問題構造を作成します。

  • fmincon ソルバー

  • "interior-point" アルゴリズム

  • ランダム 2 次元初期点 x0

  • ローゼンブロックの目的としての機能

  • –2の下限

  • 2の上限

2 次元変数 x に対する Rosenbrock 関数は f(x)=100(x2-x12)2+(1-x1)2 です (詳細については、[最適化] ライブ エディター タスクまたはソルバーを使用した制約付き非線形問題 を参照してください)。「interior-point" アルゴリズムを指定するには、optimoptions を使用してオプションを作成します。

anonrosen = @(x)(100*(x(2) - x(1)^2)^2 + (1-x(1))^2);
opts = optimoptions(@fmincon,Algorithm="interior-point");
rng default % For reproducibility
problem = createOptimProblem("fmincon",...
    x0=randn(2,1),...
    objective=anonrosen,...
    lb=[-2;-2],...
    ub=[2;2],...
    options=opts);

problem.x0 から始めて fmincon を呼び出して問題を解決します。

[x,fval] = fmincon(problem)
Local minimum possible. Constraints satisfied.

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

    1.0000
    1.0000

fval = 2.0603e-11

GlobalSearch を呼び出して、より良い解決策を探してください。

gs = GlobalSearch;
[x2,fval2] = run(gs,problem)
GlobalSearch stopped because it analyzed all the trial points.

All 16 local solver runs converged with a positive local solver exit flag.
x2 = 2×1

    1.0000
    1.0000

fval2 = 2.1093e-11

この場合、fminconGlobalSearch は両方とも同じ解に到達します。

入力引数

すべて折りたたむ

最適化ソルバー。次のいずれかとして指定します。

  • GlobalSearch には、"fmincon" または @fmincon を指定します。

  • MultiStart の場合は、"fmincon" または @fmincon"fminunc" または @fminunc"lsqnonlin" または @lsqnonlin、または "lsqcurvefit" または @lsqcurvefit を指定します。

例: "fmincon"

データ型: char | string | function_handle

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

例: createOptimProblem("fmincon","x0",x0,"objective",fun,"lb",zeros(size(x0)))

線形等式制約。実数行列として指定されます。AeqMenvars 列の行列で、Me は等式の数です。

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

Aeq*x = beq,

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

例えば、

x1 + 2 x2 + 3 x3 = 10
2 x1 + 4 x2 + x3 = 20,

次の制約を与えます:

Aeq = [1,2,3;2,4,1];
beq = [10;20];

例: 制御変数の合計が 1 になるように指定するには、制約 Aeq = ones(1,N)beq = 1 を指定します。

データ型: double

線形不等式制約。実数行列として指定されます。AineqMnvars 列の行列で、M は不等式の数です。

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

Aineq*x <= bineq,

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

例えば、

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,

次の制約を与えます:

Aineq = [1,2;3,4;5,6];
bineq = [10;20;30];

例: 制御変数の合計が 1 以下になるように指定するには、制約 Aineq = ones(1,N)bineq = 1 を指定します。

データ型: double

実数ベクトルで指定される線形等式制約です。beq は、行列 Aeq に関連する Me 要素ベクトルです。beq を行ベクトルとして渡す場合、ソルバーは beq を列ベクトル beq(:) に内部的に変換します。

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

Aeq*x = beq,

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

例えば、

x1 + 2 x2 + 3 x3 = 10
2 x1 + 4 x2 + x3 = 20,

次の制約を与えます:

Aeq = [1,2,3;2,4,1];
beq = [10;20];

例: 制御変数の合計が 1 になるように指定するには、制約 Aeq = ones(1,N)beq = 1 を指定します。

データ型: double

実数ベクトルで指定される線形不等式制約です。bineq は、行列 Aineq に関連する M 要素ベクトルです。bineq を行ベクトルとして渡す場合、ソルバーは bineq を列ベクトル bineq(:) に内部的に変換します。

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

Aineq*x <= bineq,

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

例えば、

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,

次の制約を与えます:

Aineq = [1,2;3,4;5,6];
bineq = [10;20;30];

例: 制御変数の合計が 1 以下になるように指定するには、制約 Aineq = ones(1,N)bineq = 1 を指定します。

データ型: double

下限。実数ベクトルまたは倍精度浮動小数点配列として指定します。lb は、 lb x ub 内の要素ごとの下限を表します。

createOptimProblem は配列 lb をベクトル lb(:) に内部的に変換します。

例: lb = [0;-Inf;4]x(1) ≥ 0, x(3) ≥ 4 を意味します。

データ型: double

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

  • c(x) は、 x における非線形不等式制約の配列です。ソルバーは、c のすべてのエントリに対して c(x) <= 0 を満たそうとします。

  • ceq(x) は、 x における非線形等式制約の配列です。ソルバーは、ceq のすべてのエントリに対して ceq(x) = 0 を満たそうとします。

たとえば、nonlcon は次のような MATLAB® 関数です。

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

詳細については、非線形制約を参照してください。

データ型: char | string | function_handle

関数ハンドルまたは関数名として指定される目的関数。

  • lsqnonlinlsqcurvefit を除くすべてのソルバーの場合、目的関数は配列 x を受け入れ、スカラーを返す必要があります。SpecifyObjectiveGradient オプションが true の場合、目的関数は 2 番目の出力、つまり目的の勾配を表すベクトルを返す必要があります。詳細については、fun を参照してください。

  • lsqnonlin の場合、目的関数はベクトル x を受け入れ、ベクトルを返す必要があります。SpecifyObjectiveGradient オプションが true の場合、目的関数は 2 番目の出力、つまり目的のヤコビアンを表す行列を返す必要があります。詳細については、fun を参照してください。

  • lsqcurvefit の場合、目的関数は 2 つの入力 xxdata を受け入れ、ベクトルを返す必要があります。SpecifyObjectiveGradient オプションが true の場合、目的関数は 2 番目の出力、つまり目的のヤコビアンを表す行列を返す必要があります。詳細については、fun を参照してください。

例: @sin

例: "sin"

データ型: char | string | function_handle

最適化オプション。optimoptions の出力として指定されます。

例: optimoptions("fmincon","SpecifyObjectiveGradient",true)

上限は、実数ベクトルまたは倍精度浮動小数点数の配列として指定されます。ub は、 lb x ub 内の要素ごとの上限を表します。

createOptimProblem は配列 ub をベクトル ub(:) に内部的に変換します。

例: ub = [Inf;4;10]x(2) ≤ 4, x(3) ≤ 10 を意味します。

データ型: double

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

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

データ型: double

実数ベクトルまたは実数配列として指定されたモデルの入力データ。モデルは次のとおりです。

ydata = fun(x,xdata),

ここで、xdata および ydata は固定配列、x は二乗和の最小値の探索のために lsqcurvefit によって変更されるパラメーターの配列です。

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

データ型: double

モデルの応答データ。実数ベクトルまたは実数配列として指定されます。モデルは次のとおりです。

ydata = fun(x,xdata),

ここで、xdata および ydata は固定配列、x は二乗和の最小値の探索のために lsqcurvefit によって変更されるパラメーターの配列です。

ydata 配列のサイズおよび形状は、配列 fun(x0,xdata) と同じでなければなりません。

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

データ型: double

出力引数

すべて折りたたむ

最適化問題。構造体として返されます。次の例のように、problemrun の 2 番目の入力引数として使用します。

x = run(gs,problem)
x = run(ms,problem,k)

問題に対して名前付きソルバーを呼び出すことによって、問題を解決することもできます。たとえば、fminconに対してproblemを作成する場合は、次のように入力します。

x = fmincon(problem)

バージョン履歴

R2010a で導入