加速SymPy方程求解器

Alg*_*lgo 5 python sympy numerical-methods

我正在尝试使用以下python代码解决一组方程式(当然使用SymPy):

def Solve(kp1, kp2):
    a, b, d, e, f = S('a b d e f'.split())
    equations = [
      Eq(a+b, 2.6),
      Eq(2*a + b + d + 2*f, 7),
      Eq(d + e, 2),
      Eq(a*e,kp2*b*d),
      Eq( ((b * (f**0.5))/a)*((a+b+d+e+f+13.16)**-0.5), kp1)
    ]
    return solve(equations)
Run Code Online (Sandbox Code Playgroud)

该代码成功地解决了方程,但是大约35秒后.该Solve()函数在另一个文件中的迭代块(大约2000次迭代)中使用,因此速度对我来说非常重要.

有没有办法加速求解器?如果没有,你能推荐另一种方法来解决使用python的方程组吗?

syn*_*nym 5

你只需要解决一次方程式.之后,您将获得表单的等式:

  • a = f_1(kp1,kp2)
  • b = f_2(kp1,kp2)
  • ...

所以你可以简单地计算a,...,e依赖于kp1和kp2.例如,求解第一,第三和第四方程给出:

  • b:-a + 2.6
  • e:2.0*kp2*(5.0*a - 13.0)/(5.0*a*kp2 - 5.0*a - 13.0*kp2),
  • d:10.0*a /( - 5.0*a*kp2 + 5.0*a + 13.0*kp2)

在我的电脑上解决所有五个方程式太慢了,但是如果它给你一个表达式,你只需要插入(替换)kp1和kp2的值,你就不必再次求解方程式了.有关替换,请查看sympy文档.

所以你的循环应该是这样的:

solutions = sympy.solve(eqs, exclude=[kp1, kp2])
for data_kp1, data_kp2 in data:
    for key, eq in solutions:
        solution = eq.subs([(kp1, data_kp1), (kp2, data_kp2)])
        final_solutions.append("{key}={solution}".format(key=key, solution=solution))
Run Code Online (Sandbox Code Playgroud)

  • 那没关系.您可以象征性地求解方程,这意味着方程将对所有**kp1和kp2保持**.例如,你有方程a + 2 = b/2和a + b = k,那么你可以求解a和b依赖于k:b =(k - 2)+(2/3)和a = [ ((k - 2)+(2/3))/ 2] - 2.然后你只需要替换k为你的数据点,你得到b和a. (2认同)