Как решить линейные уравнения с параметризацией? - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь решить мои уравнения следующим образом:

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 голосов
/ 03 марта 2019

Использование 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}
0 голосов
/ 03 марта 2019

Есть математическая сторона и программная сторона.Что касается математики, важно отметить, что если у 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
...