このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
問題構造を作成する
問題構造について
GlobalSearch
または MultiStart
ソルバーを使用するには、まず問題構造を作成する必要があります。問題構造を作成するための推奨方法は、createOptimProblem
関数を使用することです。構造を手動で作成することもできますが、そうするとエラーが発生しやすくなります。
createOptimProblem
関数を使用する
createOptimProblem
関数を使用して問題構造を作成するには、次の手順に従います。
目的関数をファイルまたは匿名関数として定義します。詳細については、目的関数を計算する を参照してください。ソルバーが
lsqcurvefit
またはlsqnonlin
の場合は、目的関数がスカラーではなくベクトルを返すことを確認してください。必要に応じて、境界や非線形制約関数などの制約を作成します。詳細については、制約の作成 を参照してください。
開始点を作成します。たとえば、3 次元のランダム開始点
xstart
を作成するには、次のようにします。xstart = randn(3,1);
(オプション)
optimoptions
を使用してオプションを作成します。以下に例を示します。options = optimoptions(@fmincon,'Algorithm','interior-point');
Enter
problem = createOptimProblem(solver,
ここで、
solver
はローカル ソルバーの名前です。GlobalSearch
の場合:'fmincon'
MultiStart
の場合、選択肢は次のとおりです。'fmincon'
'fminunc'
'lsqcurvefit'
'lsqnonlin'
選択については、最適化の意思決定表を参照してください。
'x0'
パラメータを使用して初期点を設定します。初期点がxstart
でソルバーがfmincon
の場合、エントリは次のようになります。problem = createOptimProblem('fmincon','x0',xstart,
目的関数の関数ハンドルを
objective
に含めます。problem = createOptimProblem('fmincon','x0',xstart, ... 'objective',@objfun,
必要に応じて境界やその他の制約を設定します。
制約 名前 下限 'lb'
上限 'ub'
線形不等式 Aineq x
≤bineq
の行列Aineq
'Aineq'
線形不等式 Aineq x
≤bineq
のベクトルbineq
'bineq'
線形等式の行列 Aeq
Aeq x
=beq
'Aeq'
線形等式 Aeq x
=beq
のベクトルbeq
'beq'
非線形制約関数 'nonlcon'
lsqcurvefit
ローカル ソルバーを使用する場合は、それぞれ'xdata'
と'ydata'
という名前の入力データと応答データのベクトルを含めます。ベスト プラクティス: 問題の構造に対してソルバーを実行して、問題の構造を検証します。たとえば、ローカル ソルバーが
fmincon
の場合:[x,fval,exitflag,output] = fmincon(problem);
例: createOptimProblem
で問題構造を作成する
この例では、制約 x1 + 2x2 ≥ 4 に従って、 ソルバーを実行する からの関数を最小化します。目的は
6分 = 4 x2 – 2.1 x4 + x6/3 + xy – 4 y2 + 4 y4. | (1) |
fmincon
の interior-point
アルゴリズムを使用し、開始点を [2;3]
に設定します。
目的関数の関数ハンドルを記述します。
sixmin = @(x)(4*x(1)^2 - 2.1*x(1)^4 + x(1)^6/3 ... + x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4);
線形制約行列を記述します。制約を「より小さい」形式に変更します。
A = [-1,-2]; b = -4;
interior-point
アルゴリズムを使用するためのローカル オプションを作成します。opts = optimoptions(@fmincon,'Algorithm','interior-point');
createOptimProblem
を使用して問題構造を作成します。problem = createOptimProblem('fmincon', ... 'x0',[2;3],'objective',sixmin, ... 'Aineq',A,'bineq',b,'options',opts)
結果として得られる構造:
problem = struct with fields: objective: @(x)(4*x(1)^2-2.1*x(1)^4+x(1)^6/3+x(1)*x(2)-4*x(2)^2+4*x(2)^4) x0: [2x1 double] Aineq: [-1 -2] bineq: -4 Aeq: [] beq: [] lb: [] ub: [] nonlcon: [] solver: 'fmincon' options: [1x1 optim.options.Fmincon]
ベストプラクティス: 問題の構造を検証するには、構造に対してソルバーを実行します。
[x,fval,exitflag,output] = fmincon(problem);