このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
問題構造を作成する
問題構造について
GlobalSearch または MultiStart ソルバーを使用するには、まず問題構造を作成する必要があります。問題構造を作成するための推奨方法は、createOptimProblem 関数を使用することです。構造を手動で作成することもできますが、そうするとエラーが発生しやすくなります。
createOptimProblem関数を使用する
createOptimProblem 関数を使用して問題構造を作成するには、次の手順に従います。
目的関数をファイルまたは匿名関数として定義します。詳細は、目的関数を計算するを参照してください。ソルバーが
lsqcurvefitまたはlsqnonlinの場合は、目的関数がスカラーではなくベクトルを返すことを確認してください。必要に応じて、境界や非線形制約関数などの制約を作成します。詳細は、制約の作成を参照してください。
開始点を作成します。たとえば、3 次元のランダム開始点
xstartを作成するには、次のようにします。xstart = randn(3,1);
(オプション)
optimoptionsを使用してオプションを作成します。以下に例を示します。options = optimoptions(@fmincon,'Algorithm','interior-point');
入力
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'線形等式の行列 AeqAeq 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);