6

Mathematicaの "ブラックボックス"関数の数値最適化を試みている。しかし、私が試みた最小機能の全てを直ちに提供しないように見えるMathematica:ブラックボックス関数の数値最適化時の評価順序

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]; 
]; 

:櫛[X、Y、Z]がこれに同様に定義される

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

:概略的には、このように書きprint [x、y、z]も記号的に評価されるため、簡単に検証されるFindMaximumをx、y、zの記号値で評価しようとします。したがってFindmaximumは失敗します(FindMaximum :: nrnum:関数の値は実数ではありません)ので、最小化は失敗します。

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

+1

NMinimizeでのシンボリックな前処理のため、もう1つ(もっと微妙な)問題は[最近他のスレッドで解決されました](http://stackoverflow.com/questions/6971536/nminimize-eats-all-memory-不必要な象徴的な仕事/ 6975501#6975501)by Daniel Lichtblau。 –

+0

こんにちは、ありがとう、私はそれをチェックします。私はMathematica 8でこの問題が発生していないことにも気付きました(以前は7つでした)。 –

答えて

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の変更について? FindMinimumFindMaximumFindRootFindFitため

+1

Nahは役に立たない。私の関数は実際にそれを実際に行ったので、私はこの質問をする目的でこれらのビットを削除しました。 –

+1

@Benは、 'print'はシンボリックな値も表示するのは奇妙です。シンボリックな値を持つ' comb [x、y、z] 'は私が与えた定義と一致しないからです。これを実行する前に '[comb]'をクリアしましたか?おそらく、それは 'NumericQ'ビットなしの定義と一致しています。 – acl

+0

@aclこれは最初は私のためには機能しませんでしたが、それをクリアした後にそれはトリックでした。 –

5

評価順序はtutorial/UnconstrainedOptimizationSymbolicEvaluationドキュメント・ページに記述されています。私は非常に似た何かがNMinimize機能に当てはまると思います。説明はので、私はここでそのページからのみ提案されたソリューションを引用します非常に長いです:

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

は、それを防ぐために特別な機能を定義する必要があるため、象徴的な評価はちょっと気になるようです。しかし、 象徴的な評価がなければ、Mathematicaは数値と象徴的な力のユニークな組み合わせの の利点を取るのは難しいです。 シンボリック評価とは、コマンドが のアルゴリズム解析の結果である アルゴリズムの決定、派生物の自動計算、自動最適化とコンパイル、構造解析などのシンボリック解析の利点を一貫して受け入れることができることを意味します。