ドキュメンテーション

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

Optimization Toolbox 関数の並列計算

並列最適化機能

並列計算は 1 つの問題に対して複数のプロセッサを使用する手法です。並列計算を使用する利点は計算速度にあります。

以下に挙げる Optimization Toolbox™ のソルバーは、目的関数と非線形制約関数の数値的な勾配推定を複数のプロセッサへ自動的に分配します。

  • fmincon

  • fminunc

  • fgoalattain

  • fminimax

  • fsolve

  • lsqcurvefit

  • lsqnonlin

これらのソルバーは以下の条件の下で並列の勾配推定を行います。

  • Parallel Computing Toolbox™ のライセンスを所有している

  • オプション SpecifyObjectiveGradientfalse に設定されている、または非線形制約関数がある場合に、オプション SpecifyConstraintGradientfalse に設定されている場合。false はこれらのオプションの既定値であるため、設定する必要はありません。ただし、両方を true には設定しないでください。

  • 並列計算が Parallel Computing Toolbox の関数 parpool により有効化されている

  • オプション UseParalleltrue に設定されている場合。このオプションの既定値は false です。

これらの条件を満たすとき、ソルバーは並列処理で推定勾配を計算します。

    メモ:   並列で実行する場合でも、ソルバーはホスト マシンで目的関数と非線形制約関数を逐次的に呼び出すことがあります。このため、関数が逐次的または並列のいずれで評価されるのかについて、仮定がなされていないことを確認してください。

勾配の並列推定

1 つのソルバー サブルーチンは自動的に並列計算されます。このサブルーチンは、目的関数と制約関数の勾配を推定します。この計算は現在位置 x のまわりの点の関数値計算も行います。基本的に計算は以下になります。

f(x)[f(x+Δ1e1)f(x)Δ1,f(x+Δ2e2)f(x)Δ2,,f(x+Δnen)f(x)Δn],

ここで、

  • f は目的関数または制約関数

  • ei は単位方向ベクトル

  • Δi は ei 方向のステップ サイズ

並列で ∇f(x) を推定するために、Optimization Toolbox のソルバーは (f(x + Δiei) – f(x))/Δi の評価計算を追加のプロセッサへ分配します。

並列の中央差分

既定の前方有限差分の代わりに、中央有限差分によって勾配を推定することもできます。基本的な中央有限差分式は以下になります。

f(x)[f(x+Δ1e1)f(xΔ1e1)2Δ1,,f(x+Δnen)f(xΔnen)2Δn].

中央有限差分は前方有限差分の 2 倍の回数の関数評価を必要としますが、一般に精度がよくなります。中央有限差分は前方有限差分とまったく同じ様に並列処理されます。

optimoptions を使用して FiniteDifferenceType オプションを 'central' に設定し、中央有限差分法を有効にします。前方有限差分法を使用するには、FiniteDifferenceType オプションを 'forward' に設定します。

入れ子形式の並列関数

ソルバーは Parallel Computing Toolbox の関数 parfor を使用して勾配の並列推定を実行します。parfor は他の parfor ループから呼び出されると並列に処理されません。そのため目的関数と制約関数内で並列勾配推定と並列機能を同時に使用することはできません。

たとえば、目的関数 userfcnparfor を呼び出し、ループ内で fmincon を呼び出す場合を考えてみましょう。また、並列最適化機能で示されている fmincon の並列勾配推定の条件が満たされているものとします。parfor を並列で実行した場合は 3 つのケースを示します。

  1. 最も外側のループは parfor です。そのループのみを並列に実行します。

  2. 最も外側の parfor ループは fmincon 内にあります。fmincon のみを並列に実行します。

  3. 最も外側の parfor ループは userfcn 内にあります。userfcn は並列に parfor を使用することができます。

parfor を並列で実行した場合

この情報は役に立ちましたか?