在c ++中寻找线性方程组的最优解

时间:2014-02-22 17:39:35

标签: c++ performance algorithm matrix equation

问题在于:

我目前正在尝试创建一个控制系统,该系统需要在没有唯一解决方案的情况下找到一系列复杂线性方程的解。

我的问题出现了,因为只有六个方程,而可能有超过20个未知数(通常超过六个未知数)。当然,这不会通过标准高斯消元法或通过在矩阵中将它们更改为减少的行梯形形式来产生精确解。

但是,我认为我可能能够进一步优化并获得更准确的解决方案,因为我知道每个未知数都不能具有小于零或大于一的值,但它可以自由采取任何他们之间的价值。

当然,我正在尝试创建能够找到正确解决方案的代码,但是如果有多种组合可以产生令人满意的结果,我希望最小化Sum of (value of unknown * efficiency constant) over all unknowns,即Sigma [x I * e I ]从I = 0到n,但找到准确的解决方案的优先级更高。

性能也很重要,因为这个算法可能需要每秒运行几次。

那么,有没有人有任何想法可以帮助我实现这个目标?

2 个答案:

答案 0 :(得分:2)

编辑:你可能只想坚持使用相等和不等式约束的线性规划,但这里有一个有趣的精确解决方案,它没有包含你的未知数在0和1之间的约束。

以下是讨论您的问题的powerpoint:http://see.stanford.edu/materials/lsoeldsee263/08-min-norm.pdf

我会将你的问题转化为数学,以便让事情更容易理解:

你有一个6x20矩阵A和一个带有20个元素的向量x。您希望最小化(x ^ T)e受Ax = y。根据幻灯片,如果你只是最小化x的总和,那么答案是A ^ T(AA ^ T)^( - 1)y。一旦我有机会,我会再看看这个,看看最小化(x ^ T)e的解决方案是什么(即你的具体问题)。

编辑:我更多地查看了powerpoint,并且接近结尾处有一张标题为“具有相等约束的一般规范最小化”的幻灯片。我要切换符号以匹配幻灯片:

你的问题是你想要最小化|| Ax-b ||,其中b = 0,A是你的e向量,x是20个未知数。这取决于Cx = d。显然答案是:

x =(A ^ TA)^ - 1(A ^ T b -C ^ T(C(A ^ TA)^ - 1 C ^ T)^ - 1(C(A ^ TA)^ - 1 A ^ Tb - d))

它并不漂亮,但并不像你想象的那么糟糕。实际上没有那么多计算。例如(A ^ TA)^ - 1只需要计算一次,然后您可以重复使用答案。而你的矩阵并不是那么大。

请注意,我没有包含x的元素在[0,1]范围内的约束。

答案 1 :(得分:0)

看起来我正在做的解决方案是线性编程。它开始回到我身边,但如果我有其他问题,我会将它们发布在他们自己的专门问题中,而不是把它变成一本百科全书。

相关问题