1

我目前正在开发一个处理水中添加化学物质的 iOS 应用程序。为了找到尽可能少的加法,我正在求解 Ax=B,其中 A 是 6x6 矩阵,B 是一列。据我一直在阅读,加速框架中的 LAPACK 是处理此问题的最佳方法。我已经能够使用 DGESV_ 使它适用于小的添加,但较大的添加对 x 有一些负值。这是一个问题,因为您不能添加负量的化学物质。

所以我需要知道的是 LAPACK 中是否有一个函数可以让我找到 Ax=B 的最小解,其中 x 总是大于或等于 0?如果没有,是否有替代解决方案(除了自己做数学)?

谢谢

4

1 回答 1

5

除非 A 秩不足,否则 AAx = B平方的解是唯一的。所以没有办法摆脱答案中的负面成分。

如果您假设 A 和 B 可能包含导致负分量的错误,但希望找到包含所有非负分量的“附近”解决方案,那么您可以将其转换为:

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

这是一个二次程序。有一些库可以解决这些问题,但 LAPACK 不是其中之一。

编辑

你的矩阵是满秩的。 Wolfram Alpha非常适合解决这样的小问题。你的 6x6 的行列式是 5x10^11,所以它的条件很好。

我不是 QP 方面的专家,但是这个有特殊的结构。对于标准形式(参见维基百科的符号),重写为:

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

这里的二次系数矩阵Q = A'A是对称正定的,这(如果我正确地回忆了我的矩阵代数)使系统凸出并且更容易解决:保证了一个单一的全局解决方案。注意c = -2b'A

这是 QP 库的页面,一些在 C 中,一些针对凸情况进行了优化。也许其中之一会为您工作。

于 2012-10-14T22:48:48.533 回答