我有一个欠定线性方程组ax=b(即,比方程组更多的未知数),我希望在Matlab中求解。
我知道这通常意味着无穷多个解,但我也知道解应该是正整数,小于某个数我能找到所有满足这些附加要求的解决方案吗?
这个问题来自一个未知的矩阵,我知道每一行和每一列的和。
例如,要查找的未知矩阵

0 3 2 0
0 2 4 1
2 1 0 0

已知行和
5
7
3

列和知道
2 6 6 1

我试过lsqnonneg(a,b)函数,它只给出一个有效的解
0 0 5 0
0 6 0 1
2 0 1 0

最佳答案

你所拥有的通常被称为integer-linear programming,它是NP难的(这意味着在解决方案出来之前不要屏住呼吸)。
如果你想在没有整数的情况下求解它,你有一个线性程序,因此可以使用linprog。如果把未知矩阵看作未知项的向量,那么列和就是

col_sum = kron(eye(4),[1,1,1]);

col_sum =

     1     1     1     0     0     0     0     0     0     0     0     0
     0     0     0     1     1     1     0     0     0     0     0     0
     0     0     0     0     0     0     1     1     1     0     0     0
     0     0     0     0     0     0     0     0     0     1     1     1

同样,行和是
row_sum = repmat(eye(3),1,4);

row_sum =

     1     0     0     1     0     0     1     0     0     1     0     0
     0     1     0     0     1     0     0     1     0     0     1     0
     0     0     1     0     0     1     0     0     1     0     0     1

这些是你的等式约束,也有不等式约束,但只约束未知值linprog可以将它们绑定为额外参数然而,你没有一个目标函数,你可以把所有未知数之和最小化,或者其中一个或任何其他线性目标可以做,或者你可以把它留空,得到任何可行的结果。
Aeq = [col_sum;row_sum]
beq = [2 6 6 1 5 7 3]';

X = linprog([],[],[],Aeq,beq,zeros(12,1),10*ones(12,1))% 0 <= vars <= 10

X = reshape(X,3,4)

X =

    0.6550    2.0160    2.0160    0.3130
    1.1192    2.5982    2.5982    0.6845
    0.2258    1.3859    1.3859    0.0025


>> sum(X,1)

ans =

    2.0000    6.0000    6.0000    1.0000

>> sum(X,2)

ans =

    5.0000
    7.0000
    3.0000

如果有某些条目被保证为零等,那么可能所有的解都被强制为整数。否则,您需要具有非凸的特定整数规划求解器,例如given here

关于matlab - 在MATLAB中求解方程组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47348672/

10-12 17:33