1

私は現在、水への化学物質の添加を処理するiOSアプリに取り組んでいます。可能な限り最小の追加を見つけるために、Ax = Bを解いています。ここで、Aは6x6の行列で、Bは1つの列です。私が読んでいる限り、AccelerateFrameworkのLAPACKはこれを処理するための最良の方法です。DGESV_を使用して小さな追加で機能させることができましたが、大きな追加ではxに負の値がいくつかあります。負の量の化学物質を追加することはできないため、これは問題です。

だから私が知る必要があるのは、Ax = Bの最小解を見つけることを可能にする関数がLAPACKにあるかどうかです。ここで、xは常に0以上です。そうでない場合は、(自分で数学を行う以外に)別の解決策はありますか?

ありがとうございました

4

1 に答える 1

5

Aがランク不足でない限りAx = B、Aの正方形を使用した解は一意です。したがって、答えの中の否定的な要素を取り除く方法はありません。

AとBに負の成分を引き起こすエラーが含まれている可能性があるが、すべての非負の成分を含む「近くの」解を見つけたい場合は、次のようにキャストできます。

minimize |Ax - b|  subject to x >= 0

これは二次計画法です。このような問題を解決するためのライブラリはありますが、LAPACKはその1つではありません。

編集

あなたのマトリックスはフルランクです。 Wolfram Alphaは、このような小さな問題で遊ぶのにとても便利です。6x6の行列式は5x10^11なので、非常によく調整されています。

私はQPの専門家ではありませんが、これは特別な構造を持っています。標準形(表記についてはウィキペディアを参照)の場合は、次のように書き直します。

minimize ( x'(A'A)x + (-2b'A)x )  subject to x >= 0

ここで、2次係数行列Q = A'Aは対称正定値であり、(行列代数を正しく思い出すと)システムが凸になり、解きやすくなります。単一のグローバル解が保証されます。注c = -2b'A

これはQPライブラリのページです。一部はCで、一部は凸型の場合に最適化されています。おそらくそのうちの1つがあなたのために働くでしょう。

于 2012-10-14T22:48:48.533 に答える