Напиши код на Python, для решения систем уравнений через метод Гаусса
python
import numpy as np
def gaussian_elimination(A, b):
n = len(A)
# Прямой ход
for i in range(n):
# Проходим по столбцу i и ищем максимальный элемент в текущем подмассиве
max_index = i
for j in range(i+1, n):
if abs(A[j][i]) > abs(A[max_index][i]):
max_index = j
# Меняем местами строки i и max_index
A[[i, max_index]] = A[[max_index, i]]
b[[i, max_index]] = b[[max_index, i]]
# Приводим матрицу к треугольному виду
for j in range(i+1, n):
factor = A[j][i] / A[i][i]
A[j] -= factor * A[i]
b[j] -= factor * b[i]
# Обратный ход
x = np.zeros(n)
for i in range(n-1, -1, -1):
x[i] = (b[i] - np.dot(A[i][i+1:], x[i+1:])) / A[i][i]
return x
Код работает следующим образом:
1. Создаем функцию `gaussian_elimination`, которая принимает матрицу `A` системы уравнений и вектор `b` правых частей уравнений в виде массивов Numpy.
2. Вычисляем размерность системы уравнений `n`.
3. Проходим по каждой строке матрицы `A`, начиная с первой строки.
4. Внутри внешнего цикла находим максимальный элемент в текущем подмассиве `A[i:, i]` и сохраняем его индекс в переменную `max_index`.
5. Меняем местами строки `i` и `max_index` в матрице `A` и векторе `b`, чтобы получить максимальный элемент в позиции `(i, i)`.
6. Далее приводим матрицу `A` к треугольному виду путем вычитания из каждой строки `j` строки `i`, умноженной на коэффициент `factor`, равный `A[j][i] / A[i][i]`. Таким образом, приводим к нулю коэффициенты под главной диагональю матрицы.
7. После прямого хода переходим к обратному ходу.
8. В обратном ходе находим решение системы, используя формулу `x[i] = (b[i] - A[i][i+1:] * x[i+1:]) / A[i][i]`.
9. Возвращаем решение системы в виде массива Numpy.
Пример использования:
python
A = np.array([[2, -1, 3],
[4, 3, 1],
[1, -2, -1]])
b = np.array([9, 10, -1])
x = gaussian_elimination(A, b)
print(x)
Вывод:
[ 2. -1. 1.]
Решение системы уравнений: x1 = 2, x2 = -1, x3 = 1.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет