【问题标题】:How can I solve system of linear equations in SymPy?如何在 SymPy 中求解线性方程组?
【发布时间】:2015-10-11 09:57:39
【问题描述】:

抱歉,总的来说,我对 sympy 和 python 还是很陌生。

我想求解以下欠定线性方程组:

x + y + z = 1 
x + y + 2z = 3

【问题讨论】:

  • 到目前为止你尝试过什么?你的研究成果是什么?网络搜索似乎提供了很多示例。请告诉我您在询问之前阅读了文档并进行了搜索。
  • 我试过这个:solve_linear_system(M, (x, y, z)),其中 M = Matrix(((1, 1, 1, - 1), (1, 1, 2, - 3))),它给了我一个 IndexError。
  • 这里的方程比未知数少。当您有相等数量的方程和未知数时,您需要一个 SVD 求解器,而不是通常的线性求解器。无法保证唯一的解决方案。

标签: python math sympy


【解决方案1】:

SymPy 最近有了一个新的线性系统求解器:linsolve in sympy.solvers.solveset,您可以按如下方式使用它:

In [38]: from sympy import *

In [39]: from sympy.solvers.solveset import linsolve

In [40]: x, y, z = symbols('x, y, z')

方程式列表:

In [41]: linsolve([x + y + z - 1, x + y + 2*z - 3 ], (x, y, z))
Out[41]: {(-y - 1, y, 2)}

增广矩阵形式:

In [59]: linsolve(Matrix(([1, 1, 1, 1], [1, 1, 2, 3])), (x, y, z))
Out[59]: {(-y - 1, y, 2)}

A*x = b 形式

In [59]: M = Matrix(((1, 1, 1, 1), (1, 1, 2, 3)))

In [60]: system = A, b = M[:, :-1], M[:, -1]

In [61]: linsolve(system, x, y, z)
Out[61]: {(-y - 1, y, 2)}

注意:解的顺序与给定符号的顺序相对应。

【讨论】:

  • 应该注意的是,linsolve 尚未在任何版本中可用。目前只能通过开发版本访问。
  • 我使用的是 sympy 0.7.6,首先我无法得到 linsolve,所以使用了求解,其次,增广矩阵和 Ax = b 形式给出了 EMPTY LIST [] 答案,只有第一种方法给出了像上面一样的解决方案,我们该如何解决这个问题?
【解决方案2】:

除了@AMiT Kumar 和@Scott 给出的出色答案之外,SymPy 1.0 还添加了更多功能。对于未定线性方程组,我在下面尝试并使其工作,而无需深入了解sympy.solvers.solveset。话虽如此,如果好奇心引导你去那里。

from sympy import *
x, y, z = symbols('x, y, z')
eq1 = x + y + z
eq2 = x + y + 2*z
solve([eq1-1, eq2-3], (x, y,z))

这给了我{z: 2, x: -y - 1}。 再次,伟大的包,SymPy 开发者!

【讨论】:

    【解决方案3】:
    import sympy as sp
    x, y, z = sp.symbols('x, y, z')
    eq1 = sp.Eq(x + y + z, 1)             # x + y + z  = 1
    eq2 = sp.Eq(x + y + 2 * z, 3)         # x + y + 2z = 3
    ans = sp.solve((eq1, eq2), (x, y, z))
    

    这类似于@PaulDong 的回答,只是做了一些小改动

    1. 习惯于不使用import * 是一个好习惯(numpy 有许多类似的功能)
    2. sp.Eq() 定义方程会在以后产生更清晰的代码

    【讨论】:

    • 添加进一步的解释有助于读者理解为什么你的答案比其他人更好,并让他们投票给你。使用edit 函数扩展您的答案。
    【解决方案4】:

    另一个关于矩阵线性系统方程的例子,假设我们正在求解这个系统:

    SymPy 中,我们可以这样做:

    >>> import sympy as sy
    ... sy.init_printing()
    
    >>> a, b, c, d = sy.symbols('a b c d')
    ... A = sy.Matrix([[a-b, b+c],[3*d + c, 2*a - 4*d]])
    ... A
    
    ⎡ a - b     b + c  ⎤
    ⎢                  ⎥
    ⎣c + 3⋅d  2⋅a - 4⋅d⎦
    
    
    >>> B = sy.Matrix([[8, 1],[7, 6]])
    ... B
    
    ⎡8  1⎤
    ⎢    ⎥
    ⎣7  6⎦
    
    
    >>> A - B
    
    ⎡ a - b - 8     b + c - 1  ⎤
    ⎢                          ⎥
    ⎣c + 3⋅d - 7  2⋅a - 4⋅d - 6⎦
    
    
    >>> sy.solve(A - B, (a, b, c, d))
    {a: 5, b: -3, c: 4, d: 1}
    

    【讨论】:

      【解决方案5】:

      您可以以矩阵形式求解Ax=b(在这种情况下是一个欠定系统,但我们可以使用solve_linear_system):

      from sympy import Matrix, solve_linear_system
      
      x, y, z = symbols('x, y, z')
      A = Matrix(( (1, 1, 1, 1), (1, 1, 2, 3) ))
      solve_linear_system(A, x, y, z)
      
      {x: -y - 1, z: 2}
      

      或者改写为(我的编辑,不是同情):

      [x]=  [-1]   [-1]
      [y]= y[1]  + [0]
      [z]=  [0]    [2]
      

      对于正方形A,我们可以定义b 并使用A.LUsolve(b)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        • 1970-01-01
        相关资源
        最近更新 更多