数値解析ルーチンをテストするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/16434

  •  08-06-2019
  •  | 
  •  

質問

数値解析コードのテスト ルーチンの作成、保守、記述方法についての適切なオンライン リソースはありますか?

行列の乗算のテストなどについて私が感じている制限の 1 つは、明らかなテスト (1 つの行列を単位とするなど) ではコードの機能を完全にはテストできない可能性があることです。

また、通常は大規模なデータ構造も扱っているという事実もあります。これにアプローチする方法について何か良いアイデアを持っている人、または参照すべき良い場所へのヒントを持っている人はいますか?

役に立ちましたか?

解決

少なくとも 2 つの異なる方法でテストについて考える必要があるように思えます。

  1. 数値手法の中には、メタ思考を可能にするものもあります。たとえば、可逆操作を使用すると、結果が元の許容誤差範囲内にあるかどうかを確認するテスト ケースを設定できます。たとえば、行列 M-逆数 行列の倍 M * ランダムなベクトル V 結果は次のとおりになるはずです V 繰り返しますが、許容できる誤差の範囲内に収まります。
    明らかに、この例では逆行列、行列の乗算、および行列とベクトルの乗算を実行します。私がこのようなチェーンが好きなのは、非常に多くのランダムなテスト ケースを生成し、手動で記述するには大変な統計的カバレッジを取得できるからです。ただし、単一の操作を単独で実行するわけではありません。

  2. 一部の数値手法では、誤差が閉じた形式で表現されます。既知の解を使用して状況を設定できる場合は、解と計算結果の差を比較し、既知の範囲を超える差を探すことができます。

基本的に、この質問は、複雑なメソッドを適切にテストするには非常に多くのドメイン知識が必要であるという問題を示しています。特定の参照には、テスト対象についてもう少し具体的な情報が必要になります。少なくとも持っていることを間違いなくお勧めします Steve Yegge のおすすめ本リスト 手元に。

他のヒント

行列計算を行う場合は、LAPACK を使用してください。これは非常によくテストされたコードです。非常に賢い人々が何十年にもわたってそれに取り組んできました。彼らは、初心者が決して考えることのない問題について深く考えてきました。

一般に、次の 2 種類のテストをお勧めします。系統的かつランダム。体系的とは、エッジケースなどを探索することを意味します。ソースコードが読めると助かります。多くの場合、アルゴリズムには分岐点があります。この範囲の数値についてはこの方法で計算し、別の範囲の数値についてはこの方法で計算する、などです。近似誤差が最も大きくなることが多いため、どちらかの側の分岐点に近い値をテストします。

ランダムな入力値も重要です。すべてのテスト ケースを合理的に選択すると、問題であることに気づいていないものを体系的に回避できる可能性があります。テスト対象となる正確な値がない場合でも、ランダムな入力値を有効に利用できる場合があります。たとえば、関数とその逆関数を計算するコードがある場合、1,000 個のランダムな値を生成し、関数とその逆関数を適用することで開始点に近づくかどうかを確認できます。

~の本をチェックしてください デビッド・グリーズ 呼ばれた プログラミングの科学. 。プログラムの正しさを証明することです。プログラムが正しいことを確認したい場合 (その正しさを証明するところまで)、この本から始めるのが良いでしょう。

おそらくあなたが探しているものとは正確には異なりますが、これはソフトウェア エンジニアリングの質問に対するコンピューター サイエンスの答えです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top