Насколько я понимаю, вы должны настроить матрицу вашей системы, чтобы позаботиться о RyA
и других переменных, которые в настоящее время находятся в правой части. Вы можете сделать это вручную (в этом случае этот вопрос выходит за рамки этого сайта, это чисто математическое упражнение) или использовать, например. sympy вместо np.linalg.solve()
, который может решить алгебраическую часть задачи за вас:
from sympy import Matrix, symbols, solve
x1, x2, f1 = symbols('x1 x2 f1')
X = Matrix([0, x1, x2])
B = Matrix([f1, 50, 60])
M = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
solve(M * X - B, [x1, x2, f1])
# {f1: 40, x2: 100/3, x1: -30}
Обратите внимание, что sympy
может медленнее решать числовые линейные системы, чем numpy.linalg
, поэтому вы можете использовать sympy
для выполнения алгебраической части работы, вычисления матрицы и правой части, а затем использовать numpy.linalg.solve
для ее решения.
import numpy as np
from sympy import expand
def symbolic_to_matrix(F, variables):
"""
F is a symbolic vector function that is a left hand side of equation F = 0
variables is a list of variables (sympy.Symbol's) which F depends on.
Assuming that there exists numeric matrix A such that equation F = 0
is equivalent to linear equation Ax = b, this function returns
tuple (A, b)
"""
A = []
b = []
for row in F:
coeffs = expand(row).as_coefficients_dict()
A.append([float(coeffs[x]) for x in variables])
b.append(-float(coeffs[1]))
return np.array(A), np.array(b)
A, b = symbolic_to_matrix(M * X - B, [x1, x2, f1])
# A
# array([[ 2., 3., -1.],
# [ 5., 6., 0.],
# [ 8., 9., 0.]])
# b
# array([ -0., 50., 60.])
np.linalg.solve(A, b)
# array([-30. , 33.33333333, 40. ])
# the same answer
06.11.2016