Как найти значение переменной с помощью правила Крамера (Python)? - PullRequest
0 голосов
/ 05 января 2019

Проблема в том, что x + 3y - 2? = 1,3? + 2? + 6? = −2,2? + 4? + 3? = 2. Я хочу узнать значение ?, ? и ?, используя правило Крамера. Что ж, я сделал жестко закодированный материал, но инструкция ограничивала функцию «решить». Кроме того, эта ссылка является дополнительной информацией о Правиле Крамера .

import numpy as np 
from scipy.linalg import solve

a = np.matrix([[1, 3, -2], [3, 2, 6], [2, 4, 3]])
b = np.matrix([[1], [-2], [2]])

top_of_x = np.matrix([[1, 3, -2], [-2, 2, 6], [2, 4, 3]])
det_of_top_of_x = np.linalg.det(top_of_x)
det_of_a = np.linalg.det(a)
x = det_of_top_of_x / det_of_a
print x

1 Ответ

0 голосов
/ 05 января 2019

Возможно, вы захотите «вычислить» данные матрицы A и b.

AT = A.T # get an array of the matrix columns
top_of_x = np.matrix(b, AT[1], AT[2])
top_of_y = np.matrix(AT[0], b, AT[2])
top_of_z = np.matrix(AT[0], AT[1], b)

и т.д.

Или если вы не хотите менять A

top_of_x = A.copy()
top_of_x[:,0] = b

и т. Д.


Последний подход, использующий векторы и индексы, также работает для всех измерений, но становится все более расточительным, так как его усилия - это O (n ^ 4) операций, в то время как простая декомпозиция LU и треугольная обратная замена - O (n ^ 3). ).

det_A = np.linalg.det(A); # uses LU decomposition, which is the main part of solve
top = A.copy();
x = np.zeros_like(A[0])
for k in range(len(x)):
    top[:,k] = b;
    x[k] = np.linalg.det(top)/det_A;
    top[:,k] = A[:,k];  # restore column for next computation
print x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...