Main Content

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

問題構造を作成する

問題構造について

GlobalSearch または MultiStart ソルバーを使用するには、まず問題構造を作成する必要があります。問題構造を作成するための推奨方法は、createOptimProblem 関数を使用することです。構造を手動で作成することもできますが、そうするとエラーが発生しやすくなります。

createOptimProblem関数を使用する

createOptimProblem 関数を使用して問題構造を作成するには、次の手順に従います。

  1. 目的関数をファイルまたは匿名関数として定義します。詳細については、目的関数を計算する を参照してください。ソルバーが lsqcurvefit または lsqnonlin の場合は、目的関数がスカラーではなくベクトルを返すことを確認してください。

  2. 必要に応じて、境界や非線形制約関数などの制約を作成します。詳細については、制約の作成 を参照してください。

  3. 開始点を作成します。たとえば、3 次元のランダム開始点 xstart を作成するには、次のようにします。

    xstart = randn(3,1);
  4. (オプション) optimoptions を使用してオプションを作成します。以下に例を示します。

    options = optimoptions(@fmincon,'Algorithm','interior-point');
  5. Enter

    problem = createOptimProblem(solver,

    ここで、solver はローカル ソルバーの名前です。

    • GlobalSearchの場合: 'fmincon'

    • MultiStart の場合、選択肢は次のとおりです。

      • 'fmincon'

      • 'fminunc'

      • 'lsqcurvefit'

      • 'lsqnonlin'

      選択については、最適化の意思決定表を参照してください。

  6. 'x0' パラメータを使用して初期点を設定します。初期点がxstartでソルバーがfminconの場合、エントリは次のようになります。

    problem = createOptimProblem('fmincon','x0',xstart,
  7. 目的関数の関数ハンドルを objective に含めます。

    problem = createOptimProblem('fmincon','x0',xstart, ...
        'objective',@objfun,
  8. 必要に応じて境界やその他の制約を設定します。

    制約名前
    下限'lb'
    上限'ub'
    線形不等式 Aineq xbineq の行列 Aineq'Aineq'
    線形不等式 Aineq xbineq のベクトル bineq'bineq'
    線形等式の行列 Aeq Aeq x = beq'Aeq'
    線形等式 Aeq x = beq のベクトル beq'beq'
    非線形制約関数'nonlcon'
  9. lsqcurvefit ローカル ソルバーを使用する場合は、それぞれ 'xdata''ydata' という名前の入力データと応答データのベクトルを含めます。

  10. ベスト プラクティス: 問題の構造に対してソルバーを実行して、問題の構造を検証します。たとえば、ローカル ソルバーが 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)

fminconinterior-point アルゴリズムを使用し、開始点を [2;3] に設定します。

  1. 目的関数の関数ハンドルを記述します。

    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);
  2. 線形制約行列を記述します。制約を「より小さい」形式に変更します。

    A = [-1,-2];
    b = -4;
  3. interior-point アルゴリズムを使用するためのローカル オプションを作成します。

    opts = optimoptions(@fmincon,'Algorithm','interior-point');
  4. createOptimProblem を使用して問題構造を作成します。

    problem = createOptimProblem('fmincon', ...
        'x0',[2;3],'objective',sixmin, ...
        'Aineq',A,'bineq',b,'options',opts)
  5. 結果として得られる構造:

    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]
  6. ベストプラクティス: 問題の構造を検証するには、構造に対してソルバーを実行します。

    [x,fval,exitflag,output] = fmincon(problem);

関連するトピック