如何在python中求解5x5矩阵中的未知数

Posted

技术标签:

【中文标题】如何在python中求解5x5矩阵中的未知数【英文标题】:How to solve for unknowns in a 5x5 matrix in python 【发布时间】:2021-09-15 08:01:26 【问题描述】:

这是一个 5x5 矩阵,所有单元格都未知,它看起来像这样:

A1+B1+C1+D1+E1| 1
A2+B2+C2+D2+E2| 0
A3+B3+C3+D3+E3| 1
A4+B4+C4+D4+E4| 3
A5+B5+C5+D5+E5| 2
_______________
2  1  2  1  1

所以,右侧可以看到行的总和,底部可以看到列的总和。解决方案只能是 0 或 1,例如这里是我上面输入的特定解决方案:

0+0+1+0+0| 1
0+0+0+0+0| 0
1+0+0+0+0| 1
1+1+0+0+1| 3
0+0+1+1+0| 2
____________
2 1 2 1 1

如您所见,对行和列求和会得到右侧和底部的结果。 我的问题:您将如何输入带有未知数的原始矩阵并让 python 用 0 或 1 迭代每个单元格,直到拼图完成?

【问题讨论】:

我会先阅读有关通过消元法求解方程组的内容。这是一个参考:ocw.mit.edu/courses/mathematics/… 【参考方案1】:

您实际上并不需要矩阵 - 只需使用长度为 25 的向量(元组)。它们可以根据以下方案表示 5x5 矩阵:

0  1  2  3  4
5  6  7  8  9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24

这些是此类元组的索引。注意索引的行列可以从函数divmod获取。

您可以使用 itertools 中的 product 来迭代 2**25 种可能的矩阵填充方式。

这些想法导致了以下代码:

from itertools import product

#nxn matrices will be represented by tuples of length n**2,
#in row-major order
#the following function caluculates row and column sums:

def all_sums(array,n):
    row_sums = [0]*n
    col_sums = [0]*n
    for i,x in enumerate(array):
        q,r = divmod(i,n)
        row_sums[q] += x
        col_sums[r] += x
    return row_sums, col_sums

#in what follows, row_sums, col_sums are lists of target values

def solve_puzzle(row_sums, col_sums):
    n = len(row_sums)
    for p in product(range(2),repeat = n*n):
        if all_sums(p,n) == (row_sums, col_sums):
            return p
    return "no solution"

solution = solve_puzzle([1,0,1,3,2],[2,1,2,1,1])
for i in range(0,25,5):
    print(solution[i:i+5])

输出:

(0, 0, 0, 0, 1)
(0, 0, 0, 0, 0)
(0, 0, 0, 1, 0)
(1, 1, 1, 0, 0)
(1, 0, 1, 0, 0)

在这种情况下,蛮力是可行的。如果远远超出 5x5,它将不再可行,需要更复杂的算法。

【讨论】:

太棒了!感谢您花时间回答我的问题。【参考方案2】:

这是integer linear programming 问题的特例。不幸的是,0-1 整数线性规划的特殊情况仍然是 NP 完全的,尽管存在许多算法,包括启发式算法。您可以使用内置库为您执行此操作。

【讨论】:

以上是关于如何在python中求解5x5矩阵中的未知数的主要内容,如果未能解决你的问题,请参考以下文章

增广矩阵有未知数如何化简

求矩阵方程

如何仅使用矩阵运算创建这个精确的 5x5 矩阵?

求解非方阵中的线性方程组

Python之Numpy:线性代数/矩阵运算

如何仅使用 for 循环创建这个精确的 5x5 矩阵?