我目前正在开发一款处理水中化学添加剂的iOS应用程序。为了找到最小可能的加法,我正在求解Ax = B,其中A是6x6矩阵,B是一列。就我一直在阅读而言,加速框架中的LAPACK是处理此问题的最佳方式。我已经能够使用DGESV_使其适用于少量添加,但较大的添加有x的负值。这是一个问题,因为您无法添加负量的化学物质。
所以我需要知道的是LAPACK中是否有一个函数可以让我找到Ax = B的最小解,其中x总是大于或等于0?如果没有,是否有替代解决方案(除了自己做数学)?
谢谢
答案 0 :(得分:4)
除非A排名不足,否则Ax = B
与A square的解是唯一的。因此,没有办法摆脱答案中的负面因素。
如果您假设A和B可能包含导致负面组件的错误但想要找到包含所有非负组件的“附近”解决方案,那么您可以将其转换为:
minimize |Ax - b| subject to x >= 0
这是一个二次方案。有解决此类问题的库,但LAPACK不是其中之一。
修改强>
您的矩阵是满级。 Wolfram Alpha非常适合玩这样的小问题。你的6x6具有5x10 ^ 11的行列式,所以它的条件非常好。
我不是QP的专家,但这个有特殊的结构。对于标准格式(请参阅Wikipedia for notation),请重写为:
minimize ( x'(A'A)x + (-2b'A)x ) subject to x >= 0
这里二次系数矩阵Q = A'A
是对称正定的,如果我正确地回想起我的矩阵代数,则使系统凸起并且更容易解决:保证单个全局解。注意c = -2b'A
。
Here is a page of QP libraries,有些在C中,有些针对凸包进行了优化。也许其中一个会为你效劳。