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,但没有别的。鉴于u1,u2并且w2我可以计算w1和w4。等等……
目前我正在以一种相当直接的方式(伪代码)处理这个问题:
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)
只需获取 SymPy 并将整个线性方程组填充到sympy.solvers.solveset.linsolve. 它将为您提供整个解空间,包括具有确定值的变量值,其形式取决于系统是否具有 0、1 或无限解。
可能还有一种 NumPy/SciPy 方法来获得未确定系统的解决方案集,但无论哪种方式,我都不知道。谷歌建议奇异值分解会很有用,但我还没有弄清楚你如何获得解决方案的基础。
如果不清楚,“整个线性方程组”包括将已知变量值制定为方程。例如,如果您知道u2 = 5,那么u2 = 5将是线性方程之一。你会表示为u2 - 5在eqns列表中。
| 归档时间: |
|
| 查看次数: |
1041 次 |
| 最近记录: |