3.6. Задания#
3.6.1. Прямая и обратная подстановка#
Реализуйте прямую и обратную подстановки для решения треугольных систем
где \(\mathbf{L}\) и \(\mathbf{U}\) квадратные нижнетреугольная и верхнетреугольная матрицы, соответственно, а \(\mathbf{b}\) – вектор правой части системы.
Функция должны иметь следующую сигнатуру вызова
function forwardsub(L::AbstractMatrix, b::AbstractVector) end
function backwardsub(U::AbstractMatrix, b::AbstractVector) end
а возвращать вектор из Float64
чисел.
Добавьте в функции несколько проверок
На размерность — матрица квадратная, размер матрицы системы и правой части корректны;
На треугольность системы (см. Julia/LinearAlgebra);
На вырожденность системы.
Дополнительно
Напишите doc-string к каждой из функций (см. Julia/Documentation);
Напишите версии функций, не аллоцирующих память под вектор-решение \(x\), а принимающих вектор на запись ответа в качестве аргумента:
forwardsub!(x, L, b)
,backwardsub!(x, U, b)
.
3.6.2. Метод прогонки#
При численном решении дифференциальных уравнений часто возникает система
где \(a_1 = c_n = 0\), а \(\mathbf{f}\) – вектор правой части системы.
В матричном виде система записывается как \(\mathbf{A} \mathbf{x} = \mathbf{f}\), где матрица системы — трёхдиагональная
Для таких систем существует эффективный \(O(n)\) алгоритм решения, называемый методом прогонки или алгоритмом Томаса.
Напишите функцию tridiagsolve
, реализующую метод прогонки.
У функции должно быть два метода
tridiagsolve(a, b, c, f) -> x
;tridiagsolve(A::Tridiagonal, f) -> x
, гдеTridiagonal
тип определён вLinearAlgebra
.
Описание метода прогонки можно посмотреть здесь: [16] (Раздел 4.4.2), Википедия.
3.6.3. Системы уравнений#
Решите следующие системы уравнений. Для каждого примера создайте функцию, которая не принимает аргументов и возвращает решение системы и невязку \(\mathbf{b} - \mathbf{A}\mathbf{x}\).
Например,
function solution_a()
A = [1 0; 0 1]
b = [3, 4]
x = A \ x
return x, b - A * x
end
(а)
(б)
(в)