6

Mathematica で「ブラック ボックス」関数の数値最適化を実行しようとしています。概略的には、次のようになります。

NMinimize[{comb[x,y,z], x > 0}, {x,y,z}]

ここで、comb[x,y,z] は次のように定義されます。

comb[x_,y_,z_] := Module[{},
  Print[x,y,z];
  M = FindMaximum[SkewNormal[a,x,y,z], {a,x}] // First;
  val = f[x,y,z,M];
  Return[val];
];

ただし、私が試したすべての最小化関数は、comb[x,y,z] に数値をすぐには提供しないようで、最終的に x、y、z の記号値で FindMaximum を評価しようとします (これは簡単に検証できます)。 Print[x,y,z] も記号的に評価されるため)。したがって、Findmaximum は失敗し (FindMaximum::nrnum: 関数値の何とか何とかは実数ではありません)、最小化は失敗します。

櫛のサブ関数が数値で評価されるように評価順序を修正するにはどうすればよいですか?

4

2 に答える 2

5

FindMinimumFindMaximumFindRootおよびの評価順序は、チュートリアル/UnconstrainedOptimizationSymbolicEvaluationドキュメント ページFindFitに記載されています。関数に非常によく似たものが適用できると思います。説明は非常に長いので、そのページから提案されたソリューションのみをここに引用します。NMinimize

関数が、シンボリック評価によって関数が意図したとおりに維持されない、または非常に遅くなるようなものである場合は、変数の数値のみを評価するように関数を定義する必要があります。これを行う最も簡単な方法は、f[x_?NumberQ]:=definition のように、PatternTest (?) を使用して関数を定義することです。

それを防ぐために関数を特別に定義する必要があるため、シンボリック評価は単に煩わしさを生み出すように見えるかもしれません。しかし、記号評価がなければ、Mathematica が数値と記号の力の独自の組み合わせを利用することは困難です。シンボリック評価とは、アルゴリズムの決定、導関数の自動計算、自動最適化とコンパイル、構造解析など、シンボリック解析から得られる利点をコマンドが一貫して利用できることを意味します。

于 2011-08-11T03:35:40.337 に答える
4

combに変えてみてはどうですか

comb[x_?NumericQ, y_?NumericQ, z_?NumericQ] := 
 Module[{}, Print[x, y, z];
 M = FindMaximum[SkewNormal[a, x, y, z], {a, x}] // First;
 val = f[x, y, z, M];
 Return[val];];

comb引数が数値の場合にのみの定義が評価されるのはどれですか?

于 2011-08-09T01:04:41.997 に答える