我目前正在开发一款iOS应用程序,该应用程序可以处理添加到水中的化学物质。为了找到可能的最小加法,我求解Ax=B,其中A是一个6x6矩阵,B是一列。据我所读,Accelerate框架中的LAPACK是处理这一问题的最佳方式。我已经能够使用DGESV_使其适用于小的添加,但较大的添加对x有一些负值。这是一个问题,因为你不能添加负量的化学物质。
所以我需要知道的是,LAPACK中是否有一个函数可以让我找到Ax=B的最小解,其中x总是大于或等于0?如果没有,有没有其他解决方案(除了自己计算)?
谢谢
除非A是秩亏的,否则具有A平方的Ax = 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语言的,有些是针对凸情况优化的。也许其中一个会为你工作。