Если вы умеете работать с двумерными объектами класса Matrix
, то сможете работать и с трехмерными. Например, здесь a
— трехмерная матрица, поэтому a[i]
— двумерная (при условии, что индекс i
не выходит за пределы допустимого диапазона); a[i][j]
— одномерная (при условии, что индекс j
не выходит за пределы допустимого диапазона); a[i][j][k]
— элемент типа int
(при условии, что индекс k
не выходит за пределы допустимого диапазона).
Поскольку мы видим трехмерный мир, при моделировании чаще используются трехмерные объекты класса Matrix
(например, в физическом моделировании в декартовой системе координат).
int grid_nx; // разрешение сетки; задается вначале
int grid_ny;
int grid_nz;
Matrix
Если добавить время в качестве четвертого измерения, то получим четырехмерное пространство, в котором необходимы четырехмерные объекты класса Matrix
. И так далее.
24.6. Пример: решение систем линейных уравнений
Данный пример выбран для того, чтобы продемонстрировать реалистичное и важное использование класса Matrix
. Мы решим систему линейных уравнений следующего вида:
1
+ ... + an,nxn = bn
где буквы
Наша цель — найти неизвестные, которые одновременно удовлетворяют указанные
где
Векторы
В зависимости от матрицы
Алгоритм несложен. Для того чтобы элемент в позиции (
Если все диагональные элементы окажутся ненулевыми, то система имеет единственное решение, которое можно найти в ходе обратной подстановки. Сначала решим последнее уравнение (это просто).
Очевидно, что
При каждом значении
24.6.1. Классическое исключение Гаусса
Посмотрим теперь, как этот алгоритм выражается в виде кода на языке С++. Во-первых, упростим обозначения, введя удобные имена для двух типов матриц, которые собираемся использовать.
typedef Numeric_lib::Matrix
typedef Numeric_lib::Matrix
Затем выразим сам алгоритм.
Vector classical_gaussian_elimination(Matrix A,Vector b)
{
classical_elimination(A, b);
return back_substitution(A, b);
}
Иначе говоря, мы создаем копии входных матрицы A
и вектора b
(используя механизм передачи аргументов по значению), вызываем функцию для решения системы, а затем вычисляем результат с помощью обратной подстановки. Такое разделение задачи на части и система обозначений приняты во всех учебниках. Для того чтобы завершить программу, мы должны реализовать функции classical_elimination()
и back_substitution()
. Решение также можно найти в учебнике.
void classical_elimination(Matrix& A,Vector& b)
{
const Index n = A.dim1();
// проходим от первого столбца до последнего,