仅给定几个变量,求解一组简单的方程

jpr*_*lly 2 python recursion performance sympy

我有一组几百个简单的求和方程。例如这里有3个:

 w1 - u1 - u2 = 0 
 w1 + w2 - w3 - u3 = 0
 w1 - w2 - w4 = 0
Run Code Online (Sandbox Code Playgroud)

我试图找到一种方法来解决尽可能多的问题,只给出少数几个值。例如,在上面的方程组中,如果我有u1并且u2我可以计算w1,但没有别的。鉴于u1u2并且w2我可以计算w1w4。等等……

目前我正在以一种相当直接的方式(伪代码)处理这个问题:

while there are new results:
     for each equation:
         try to solve equation:
             if solved update result set
Run Code Online (Sandbox Code Playgroud)

这有效,但感觉笨拙且效率低下。

有没有更好的办法?(如果相关,则使用 Python)

编辑:我知道这可以作为一系列线性方程来解决,如果我知道足够的值。我正在寻找一种方法,当我不知道作为线性方程组求解时使用的方法(或者可能有一种奇特的方法可以以某种方式减少问题)

编辑 2:错误,已删除

编辑 3:对于使用 sympy 对我的解决方案感兴趣的任何人:

from sympy import linsolve, symbols, linear_eq_to_matrix
w1, w2, w3, w4, u1, u2, u3 = symbols("w1, w2, w3, w4, u1, u2, u3", integer=True)
variables = [w1, w2, w3, w4, u1, u2, u3]

def my_solver(known_vals):

    eqns = [w1 - u1 - u2, 
            w1 + w2 - w3 - u3,
            w1 - w2 - w4]

    #add the known variables to equation list
    for x in known_vals.keys():
        eqns.append(x - (known_vals[x]))

    A, b = linear_eq_to_matrix(eqns, variables)
    solution = linsolve((A, b), variables)

    return solution


my_solver({w1:2, u2:-2})
Run Code Online (Sandbox Code Playgroud)

use*_*ica 5

只需获取 SymPy 并将整个线性方程组填充到sympy.solvers.solveset.linsolve. 它将为您提供整个解空间,包括具有确定值的变量值,其形式取决于系统是否具有 0、1 或无限解。

可能还有一种 NumPy/SciPy 方法来获得未确定系统的解决方案集,但无论哪种方式,我都不知道。谷歌建议奇异值分解会很有用,但我还没有弄清楚你如何获得解决方案的基础。


如果不清楚,“整个线性方程组”包括将已知变量值制定为方程。例如,如果您知道u2 = 5,那么u2 = 5将是线性方程之一。你会表示为u2 - 5eqns列表中。