C ++で通常の方程式システムを解く
-
14-10-2019 - |
質問
線形方程式のシステムを解きたいです。
Ax = b
Aはaです n x m
マトリックス(正方形ではない)、bとxは両方とも n x 1
ベクトル。 AとBがわかっている場合、Nは50-100のオーダーから、Mは約2です(つまり、Aは最大[100x2]になる可能性があります)。
の解決策を知っています x
: $x = \inv(A^T A) A^T b$
それを解決する方法はほとんどありませんでした:ublas(boost)、lapack、eigenなど。しかし、それらのパッケージを使用して「x」のCPU計算時間がどれくらい速いかわかりません。これが数値的に「x」を解決する理由があるかどうかもわかりません
私の重要なのは、CPUの計算時間が可能な限り短く、私が初心者であるため、良いドキュメントがあることです。
通常の方程式を解決した後 Ax = b
退行して、近似を改善したいと思います 多分後で カルマンフィルターの適用。
私の質問は、どのC ++ライブラリがロブスターであり、上記のニーズに向けてより速いのかということです。
解決
これは、方程式よりも未知のものがあるため、最小二乗ソリューションです。 mが実際に2に等しい場合、それはあなたにとって単純な線形最小二乗で十分であることを教えてくれます。式は閉じた形で書き出すことができます。ライブラリは必要ありません。
mが1桁の場合でも、(transoppes)*a*x = a(transpose)*bを使用してこれを簡単に解くことができると私は言う。係数を解決するための簡単なLU分解で十分です。それはあなたがそれをするよりもはるかに簡単な問題であるべきです。
他のヒント
UBLASは、最適化されたBLASバインディングで使用しない限り、最適化されていません。
以下は、マルチスレッドとSIMDに最適化されています。
- Intel MKL。 Cインターフェイスを備えたFortranライブラリ。自由ではありませんが、とても良いです。
- 固有。 真のC ++ライブラリ。無料でオープンソース。使いやすく、良い。
- アトラス。 FortranとC.フリーとオープンソース。窓にやさしくではありませんが、そうでなければ良いです。
ところで、私はあなたが何をしているのか正確にはわかりませんが、原則として、通常の方程式は線形回帰を行う適切な方法ではありません。マトリックスが十分に条件付けられていない限り、QRまたはSVDを優先する必要があります。
リスケンシングが問題でない場合は、GNU科学ライブラリを試すことができます
http://www.gnu.org/software/gsl/
後で必要な場合は、最適化されたライブラリ(Intel、Atlas、またはACML(AMDチップ)ライブラリ)に交換できるBLASライブラリが付属しています。
Matlabにアクセスできる場合は、Cライブラリを使用することをお勧めします。
本当に専門化する必要がある場合は、スキル方法を使用して(任意の精度に)マトリックスの反転を近似できます。順序(n^2)操作のみを使用します(通常のマトリックス反転 - lu分解などの順序n^3ではなく)。
ここにリンクされているギブスの論文に記載されています(27ページ前後):