【问题标题】:Is there a python module to solve linear equations?是否有解决线性方程组的python模块?
【发布时间】:2011-07-22 12:19:39
【问题描述】:

我想求解一个包含三个或更多变量的线性方程。 python中有没有好的库可以做到这一点?

【问题讨论】:

标签: python


【解决方案1】:

是的,非常流行的NumPy 包有a function to do this。他们的例子:

求解方程组3 * x0 + x1 = 9x0 + 2 * x1 = 8

>>> import numpy as np
>>> a = np.array([[3,1], [1,2]])
>>> b = np.array([9,8])
>>> x = np.linalg.solve(a, b)
>>> x
array([ 2.,  3.]) 

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.linalg.solve.html

【讨论】:

  • 我可以使用 np.linalg.solve(a, b) 函数求解模 2 的方程组(在伽罗瓦域上)吗?或者,如果您知道另一个可以解决该问题的软件包,那将非常有帮助:)
  • numpy 的“求解”不会求解方程组多于变量的方程组(我的用例)。为此,请改用 sympy。
【解决方案2】:
【解决方案3】:

您可以在 python 中使用最小二乘法来求解方程组 例如求解方程 3x+4y=75x+6y=8

>>> import numpy
>>> a=[[3,4],[5,6]]
>>> b=[7,8]
>>> numpy.linalg.lstsq(a,b)
(array([-5. ,  5.5]), array([], dtype=float64), 2, array([ 9.27110906,  0.21572392]))

【讨论】:

    【解决方案4】:

    使用@Jeremy 的例子:

    from sympy import *
    x0, x1 = symbols(['x0', 'x1'])
    sol = solve([3 * x0 + x1 - 9, x0 + 2 * x1 - 8], [x0, x1])
    print(sol)
    

    输出:

    {x0: 2, x1: 3}

    使用@004 示例,符号略有不同:

    from sympy import *
    x, y = symbols(['x', 'y'])
    system = [
        Eq(3*x + 4*y, 7),
        Eq(5*x + 6*y, 8)
    ]
    soln = solve(system, [x, y])
    print(soln)
    

    {x: -5, y: 11/2}

    注意: 有时人们可能会看到以下符号表示法:x, y = symbols('x, y'),这似乎不那么 Pythonic。

    【讨论】:

      【解决方案5】:

      您可以编写一个求解线性方程组的简单函数。

      def solve(equations):
           #the constants of a system of linear equations are stored in a list for each equation in the system
           """
           for example the system below:
                2x+9y-3z+7w+8=0
                7x-2y+6z-1w-10=0
                -8x-3y+2z+5w+4=0
                0x+2y+z+w+0=0
           is expressed as the list:
                [[2,9,-3,7,8],[7,-2,6,-1,-10],[-8,-3,2,5,4],[0,2,1,1,0]]
           """
           lists=[] # I failed to name it meaningfully
           for eq in range(len(equations)):
                #print "equations 1", equations
                #find an equation whose first element is not zero and call it index
                index=0
                for i in range(len(equations)):
                     if equations[i][0]<>0:
                          index=i;
                          break;
                #print "index "+str(eq)+": ",index
                #for the equation[index] calc the lists next itam  as follows
                lists.append([-1.0*i/equations[index][0] for i in equations[index][1:]])
                #print "list"+str(eq)+": ", lists[-1]
                #remve equation[index] and modify the others
                equations.pop(index)
                for i in equations:
                     for j in range(len(lists[-1])):
                          i[j+1]+=i[0]*lists[-1][j]
                     i.pop(0)
      
           lists.reverse()
      
           answers=[lists[0][0]]
           for i in range(1,len(lists)):
                tmpans=lists[i][-1]
                for j in range(len(lists[i])-1):
                     tmpans+=lists[i][j]*answers[-1-j]
                answers.append(tmpans)
           answers.reverse()
           return answers
      

      【讨论】:

        【解决方案6】:

        您还可以使用 lsq_linear 在 x 上添加约束(上限和下限): scipy.optimize.lsq_linear

        【讨论】:

          猜你喜欢
          • 2021-05-27
          • 1970-01-01
          • 2017-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多