【发布时间】:2016-10-27 05:56:57
【问题描述】:
我有一组几百个简单的求和方程。例如这里有 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:错误,已删除
EDIT 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})
【问题讨论】:
-
你能用你的数据结构发布一些代码吗?有很多方法可以表示这些东西,我希望能够使用您自己的设置来回答。
-
@Prune - 当然,我今天不在办公室,但今晚会举个例子
-
@Prune - 根据我的示例添加了一些代码。
-
听起来你应该把它扔到
sympy.solvers.solveset.linsolve并收工。这将为您提供解决方案集的完整基础,包括可以确定其值的任何变量的值。你的蛮力解决方案不会找到所有东西。 -
(Reduced Row Echelon Form) 谷歌搜索“RREF”应该可以帮到你……如果你没有线性代数的背景,那么你可能需要做一点背景阅读,但应该是光,我见过的大多数文本都是第 1 章或第 2 章。
标签: python performance recursion sympy