如何用参数化求解线性方程?

时间:2019-03-03 16:33:31

标签: python numpy linear-equation

我正在尝试通过以下方式解决自己的困扰:

a = np.array([[1,2,4,1,0,2],[0,1,2,0,0,1],[0,0,0,2,2,0],[0,0,0,0,14,4],[0,0,0,0,0,-2]])
b = np.array([3,0,1,0,14])
x = np.linalg.solve(a,b)

但是,由于排名不高,没有一种解决方案,而是无穷无尽的解决方案。通常,在解决此问题时,我只会插入一个参数,例如x3 = t。然后我有一个解决方案,其中x2和x1也可以包含t。但是我怎样才能告诉python这样解决呢?或者至少告诉x3是t并继续使用它?

我知道有最小二乘法,但这不是我想要的。

编辑:解决方案如下所示:x6 == -7 && x5 == 2 && x4 == -(3/2) && x2 == 7 - 2 x3 && x1 == 9/2-用Mathematica制作。只想知道如何在python中达到相同的结果。

2 个答案:

答案 0 :(得分:1)

这是数学方面的问题,也是编程方面的问题。在数学方面,需要特别注意的是,如果ax = b具有多个解,则这些解为{y + b1 * t1 + b_2 * t_2 + ... + bN * tN |实数中的t1,...,tN}其中y是ax = b的任何解(例如最小二乘解),b1,...,bN是a的零空间的基向量。在编程方面,np.linalg.lstsq得到最小二乘解,而scipy.linalg.null_space得到空空间。您可以将它们组合在一起以获得与所需输出类似的输出的一种方法如下。

import numpy as np
import scipy.linalg
import sys


def print_parameterized_form(a, b):
    one_solution = np.linalg.lstsq(a, b, rcond=None)[0]
    null_space_basis = scipy.linalg.null_space(a)
    for i in range(a.shape[1]):
        sys.stdout.write('x{} = {}'.format(i, one_solution[i]))
        for j in range(null_space_basis.shape[1]):
            sys.stdout.write(' + ({}) * t{}'.format(null_space_basis[i, j], j))
        sys.stdout.write('\n')

a = np.array([[1,2,4,1,0,2],[0,1,2,0,0,1],[0,0,0,2,2,0],[0,0,0,0,14,4],[0,0,0,0,0,-2]])
b = np.array([3,0,1,0,14])

print_parameterized_form(a, b)

这应该给你这样的东西:

x0 = 4.500000000000011 + (-3.5160449919006082e-15) * t0
x1 = 1.4000000000000128 + (0.8944271909999162) * t0
x2 = 2.7999999999999887 + (-0.4472135954999573) * t0
x3 = -1.499999999999997 + (9.065580383436411e-17) * t0
x4 = 2.0000000000000004 + (4.62652890306841e-18) * t0
x5 = -6.999999999999999 + (1.86607760441072e-16) * t0

答案 1 :(得分:1)

使用SymPy

import numpy as np
import sympy as sym

a = np.array([[1,2,4,1,0,2],[0,1,2,0,0,1],[0,0,0,2,2,0],[0,0,0,0,14,4],[0,0,0,0,0,-2]])
b = np.array([3,0,1,0,14])
num_equations, num_variables = a.shape

x = sym.symarray('x', num_variables)
solution = sym.solve([sym.Eq(ax-b) for ax, b in zip(np.dot(a, x), b)])
print(solution)

收益

{x_5: -7, x_4: 2, x_3: -3/2, x_1: -2*x_2 + 7, x_0: 9/2}