【发布时间】:2011-07-22 12:19:39
【问题描述】:
我想求解一个包含三个或更多变量的线性方程。 python中有没有好的库可以做到这一点?
【问题讨论】:
标签: python
我想求解一个包含三个或更多变量的线性方程。 python中有没有好的库可以做到这一点?
【问题讨论】:
标签: python
是的,非常流行的NumPy 包有a function to do this。他们的例子:
求解方程组
3 * x0 + x1 = 9和x0 + 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
【讨论】:
您可以在 python 中使用最小二乘法来求解方程组 例如求解方程 3x+4y=7 和 5x+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]))
【讨论】:
使用@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。
【讨论】:
您可以编写一个求解线性方程组的简单函数。
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
【讨论】:
您还可以使用 lsq_linear 在 x 上添加约束(上限和下限): scipy.optimize.lsq_linear
【讨论】: