2012-04-01 10 views
0

私はデバッグ最適化ルーチンです。私は最適化ルーチンの各反復で目的関数の値を追跡するログ・テキスト・ファイルを生成します。ここでC++、非常に予期しない-1#INF

は文脈である:私は4つのパラメータで線形であるモデルで、カーブフィッティング問題で動作し、Xデータに

Y = PARAM1*X^3+PARAM2*X^2+PARAM3*X+PARAM4 

を多項式と私はunnoised公平なデータに最適化ルーチンを実行しますアルゴリズムをテストするためにこのモデルから生成される。

ログファイルでは、最初の最適化手順は問題ありません。関数の評価には2倍の値があります。各反復で、5つの関数値が計算されます(ログファイルに表示されます)。与えられた反復から、事態は悪化します。目的関数がこの時点(!)で既に正常に評価されていますが、1つの関数評価は-1#INFになります。次の反復では、「悪い点」は-1#INFで評価され続け、1つの他の点も-1#INFで評価されます。これらの点でのYの計算は、公式を前提にして、以前に適切に評価されたという事実を考慮すると、苦労はありません。

また、メモリ管理のような別の原因が考えられます。あなたはこれについて何か考えているのでしょうか、あるいは問題をより近づけるためのアドバイスはありますか?


編集

私は、ログファイルに-1#INFの最初の出現を参照してください。関数は各繰り返しで5点で評価されますが、その5点のうちの1点のみが「新しい点」です。 -1#INFが最初に表示されると、この時点で関数は既に正常に評価されています。

ITERATION Nでのみf3が新しい点での関数の評価であり、f1はITERATION N-1でF1よりも、同じポイントでの関数の評価ここでは

ITERATION N-1 
f1 559.011 
f2 560.034 
f3 562.034 
f4 560.342 
f5 560.344 

ITERATION N 
f1 -1#INF 
f2 560.034 
f3 558.034 
f4 560.342 
f5 560.344 

のように見えます。

+0

「正常に評価されました」とまったく同じ意味ですか?オーバーフローもゼロによる除算も起こっていないと確信していますか? – celtschk

+0

メモリ管理が疑問の余地があります。あなたの反復アルゴリズムは発散しています。 INFを生成する最初の計算を試してみてください。 – Potatoswatter

+1

デバッガを使用して(または印刷ステートメントを追加して)、エラーを引き起こすコードの正確な行を追跡します。 –

答えて

2

無限大が計算で伝搬します。最大のオッズは、多項式が-Infを生成したことです。なぜなら、Xは既に-Infだったからです。これは、ゼロで割ったXの計算によって引き起こされる最大の不確実性を伴います。あなたの方法を取り戻し、部門内のゼロをチェックするコードを追加します。

+0

ありがとうございます。しかし、使用されるベクトルXは、最初から各計算で同じです。したがって、ポリゴン内の任意のオペランドとの闘いがどこから始まるのかが分かります。変数のみが数式の乗法定数です。 – octoback

+0

次に、チェックをパラメータ値を生成するコードに移動します。あなたのスニペットは、正確な答えを与えるにはあまりにも簡単です。 –

+0

反復ソルバーは、分裂することなく指数関数的な発散によって無限に到達することができると思われるようです。 – Potatoswatter

関連する問題