"""Решение небольшой действительной системы линейных уравнений.

Вход: матрица A размера 2×2 и столбец b из двух чисел; выход: x и невязка
r = Ax − b. Числа безразмерные. Для физической системы согласуйте единицы
каждого уравнения и масштаб строк. Используется import numpy — совместимый
слой FEMM 5 поверх ulab; его np.linalg.solve доступен в этой среде.
Непосредственный import ulab.numpy предоставляет другой набор возможностей.
Проверка этой малой матрицы не устанавливает устойчивость любых систем.
"""

# 1. Импортируем совместимый NumPy FEMM 5.
import numpy as np

# Строка матрицы соответствует уравнению, столбец — неизвестной.
matrix = np.array([[2.0, 1.0], [1.0, 3.0]])
right = np.array([1.0, 2.0])

# 2. Решаем Ax = b напрямую через solve; обратную матрицу не формируем.
answer = np.linalg.solve(matrix, right)

# 3. Отдельно подставляем решение в исходные уравнения: r = Ax − b.
residual = np.dot(matrix, answer) - right

# Контролируем точное решение (1/5, 3/5) и обе компоненты невязки.
assert abs(answer[0] - 0.2) < 1e-12
assert abs(answer[1] - 0.6) < 1e-12
assert max(abs(residual[0]), abs(residual[1])) < 1e-12
print('Решение:', answer, sep=' ')
print('Невязка:', residual, sep=' ')
