私は 3D サーフェス メッシュに取り組んでおり、各頂点近傍に二次多項式を当てはめることでガウス曲率値を取得しようとしています。多項式係数を取得するために、Eigen パッケージ (C++) に含まれる標準のコレスキー分解 (LL^T) を使用して、システム Ax = b を解きます。ここで、A は対称正定行列です。
システムを解くとき、解の 1 つだけで最も奇妙な値が得られます (約 2000 の頂点の中で!)。これは、私の対称正定行列の逆になるもののサンプルです。
Vertex 85:
288.413 6.45563 3.95006 -48.7131 -17.8428 -30.1609
6.45563 0.199845 0.103744 -1.09986 -0.409136 -0.673235
3.95006 0.103744 0.0979785 -0.666895 -0.241934 -0.41527
-48.7131 -1.09986 -0.666895 8.24633 3.03219 5.09083
-17.8428 -0.409136 -0.241934 3.03219 1.14272 1.8648
-30.1609 -0.673235 -0.41527 5.09083 1.8648 3.16057
Vertex 86:
496411 2072.94 -8090.48 -48680.5 23267.4 -88125.4
2072.94 8.69566 -33.8001 -203.285 97.1605 -367.998
-8090.48 -33.8001 131.916 793.391 -379.213 1436.27
-48680.5 -203.285 793.391 4773.85 -2281.71 8641.99
23267.4 97.1605 -379.213 -2281.71 1090.6 -4130.56
-88125.4 -367.998 1436.27 8641.99 -4130.56 15644.5
Vertex 87:
523.131 -1.91535 -7.666 -49.6631 17.1292 -96.191
-1.91535 0.0430769 0.0135821 0.181351 -0.061675 0.352979
-7.666 0.0135821 0.174082 0.72835 -0.249803 1.41043
-49.6631 0.181351 0.72835 4.72212 -1.62466 9.12386
17.1292 -0.061675 -0.249803 -1.62466 0.58246 -3.16276
-96.191 0.352979 1.41043 9.12386 -3.16276 17.7163
各行列の最初の要素を比較するだけで、違いがわかります: 288 (頂点 85)、496411 (頂点 86)、頂点 87 の通常の値: 523.131...
これが私が使用しているコードの一部です(Bは私の対称正定行列です):
MatrixXd B = A.adjoint()*A;
MatrixXd x = B.llt().solve(A.adjoint()*b)
何か不足しているかどうかはわかりません...不安定な問題である可能性があります。丸めエラーでしょうか? これらの予期しない結果を取り除くにはどうすればよいですか? ありがとう、ミゲル