このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
GPSアルゴリズムを使用して最適化する
この例では、patternsearch
ソルバーのデフォルトである GPS アルゴリズムを使用して最適化問題を解決する方法を示します。この例では、Optimize
ライブ エディター タスクを使用して、視覚的なアプローチで最適化を完了します。
目的関数
この例では、この例を実行するときに含まれる目的関数 ps_example
を使用します。関数のコードを表示します。
type ps_example
function f = ps_example(x) %PS_EXAMPLE objective function for patternsearch. % Copyright 2003-2021 The MathWorks, Inc. f = zeros(1,size(x,1)); for i = 1:size(x,1) if x(i,1) < -5 f(i) = (x(i,1)+5)^2 + abs(x(i,2)); elseif x(i,1) < -3 f(i) = -2*sin(x(i,1)) + abs(x(i,2)); elseif x(i,1) < 0 f(i) = 0.5*x(i,1) + 2 + abs(x(i,2)); elseif x(i,1) >= 0 f(i) = .3*sqrt(x(i,1)) + 5/2 +abs(x(i,2)); end end
関数をプロットします。
fsurf(@(x,y)reshape(ps_example([x(:),y(:)]),size(x)),... [-6 2 -4 4],'LineStyle','none','MeshDensity',300) colormap 'jet' view(-26,43) xlabel('x(1)') ylabel('x(2)') title('ps\_example(x)')
関数の最小値を求める
Optimize
ライブ エディター タスクを使用して ps_example
の最小値を見つけるには、次の手順を実行します。
[ホーム] タブの [ファイル] セクションで [新規ライブ スクリプト] ボタンをクリックして、新しいライブ スクリプトを作成します。
Optimize
ライブ エディター タスクを挿入します。[挿入] タブをクリックしてから、[コード] セクションで、[タスク]、[最適化] を選択します。
ソルバーベースタスクをクリックします。
問題データの入力に使用するには、[挿入] タブの [セクション区切り] ボタンをクリックして新しいセクションを挿入します。新しいセクションがタスクの上と下に表示されます。
タスクの上の新しいセクションで、次のコードを入力して、初期ポイントと目的関数を定義します。
x0 = [2.1 1.7]; fun = @ps_example;
これらの変数をワークスペースに配置するには、Ctrl + Enter を押してセクションを実行します。
タスクの 問題タイプの指定 セクションで、 目的 > 非スムーズ ボタンをクリックします。
選択したソルバーが
patternsearch
であることを確認します。タスクの 問題データの選択 セクションで、 目的関数 > 関数ハンドル を選択し、次に
fun
を選択します。[初期点 (x0)]、[x0] を選択します。
タスクの 進行状況の表示 セクションで、 最適値 および メッシュ サイズ プロットを選択します。
ソルバーを実行するには、タスク ウィンドウの右上にあるオプション ボタン [⁝] をクリックして、[セクションの実行] を選択します。プロットは別の図ウィンドウとタスク出力領域に表示されます。
上のグラフは、各反復における最良点の目的関数値を示しています。通常、目的関数の値は初期の反復で急速に改善され、最適値に近づくにつれて安定します。
下のグラフは各反復におけるメッシュ サイズを示しています。メッシュ サイズは、反復が成功するたびに増加し、反復が失敗するたびに減少します。詳細については、パターン検索ポーリングの仕組み を参照してください。
メッシュ サイズが MeshTolerance
オプションで定義されたメッシュ サイズ許容値よりも小さくなるため、最適化が停止します。関数の最小値はおよそ –2 です。
解と目的関数の値を確認するには、タスクの上部を確認します。
Optimize
タスクは、変数 solution
と objectiveValue
をワークスペースに配置します。これらの値を表示するには、タスクの下に新しいセクションを配置し、このコードを含めます。
disp(solution) disp(objectiveValue)
Ctrl+Enter を押してセクションを実行します。
次に、ライブ エディターの最適化タスクが最終状態で表示されます。
patternsearch stopped because the mesh size was less than options.MeshTolerance.
disp(solution)
-4.7124 -0.0000
disp(objectiveValue)
-2.0000