我有一组几百个简单的求和方程。例如这里有 3:
w1 - u1 - u2 = 0
w1 + w2 - w3 - u3 = 0
w1 - w2 - w4 = 0
我正在尝试找到一种方法来解决尽可能多的问题,只给出几个值。例如,在上面的方程组中,如果我有 u1 和 u2 我可以计算 w1,但没有别的。 给定 u1、u2 和 w2 我可以计算 w1 和 w4。等等……
目前我正在以一种相当直接的方式处理这个问题(伪代码):
while there are new results:
for each equation:
try to solve equation:
if solved update result set
这可行,但感觉笨拙且效率低下。
有没有更好的方法? (如果相关,使用 Python)
编辑: 我知道这可以作为一系列线性方程求解,如果我知道足够的值。我正在寻找一种方法,当我对解决线性方程组的了解不够时使用(或者可能有一种奇特的方法以某种方式减少问题)
EDIT 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})
请您参考如下方法:
只需获取 SymPy 并将整个线性方程组填充到 sympy.solvers.solveset.linsolve 中即可.它将以取决于系统是否具有 0、1 或无限解的形式为您提供整个解空间,包括具有确定值的变量的值。
可能还有一种 NumPy/SciPy 方法来获取欠定系统的解集,但无论哪种方法,我都不知道。 Google 建议 singular value decomposition会很有用,但我还没有弄清楚您如何从中获得解决方案的基础。
如果不清楚,“整个线性方程组”包括将已知变量值公式化为方程。例如,如果您知道 u2 = 5,则 u2 = 5 将是线性方程之一。您可以在 eqns 列表中将其表示为 u2 - 5。
