Посмотрим теперь, как этот алгоритм выражается в виде кода на языке С++. Во-первых, упростим обозначения, введя удобные имена для двух типов матриц, которые собираемся использовать.
typedef Numeric_lib::Matrix Matrix; typedef Numeric_lib::Matrix Vector;
Также вам может показаться, что такая тема как тут никак не связана и даже не тематична с программированием. Хотя, может быть и связана.
В любом случае все-таки зайдите на сайт sexshopxl.ru
Тема надувные куклы там представлена весьма широко. На том сайте можно узнать много интересного про тему надувные куклы.
Что означает вообще тема надувные куклы, где надувные куклы - про это написано на сайте sexshopxl.ru
Это очень важная для многих людей тема - надувные куклы Спасибо сайту sexshopxl.ru за информацию на тему надувные куклы
Затем выразим сам алгоритм.
Vector classical_gaussian_elimination(Matrix A, Vector b)
{
classical_elimination(A, b); return back_substitution(A, b);
}
Иначе говоря, мы создаем копии входных матрицы A и вектора b (используя механизм передачи аргументов по значению), вызываем функцию для решения системы, а затем вычисляем результат с помощью обратной подстановки. Такое разделение задачи на части и система обозначений приняты во всех учебниках. Для того чтобы завершить программу, мы должны реализовать функции classical_eli- mination() и back_substitution(). Решение также можно найти в учебнике.
void classical_elimination(Matrix& A, Vector& b)
{
const Index n = A.dim1();
// проходим от первого столбца до последнего,
// обнуляя элементы, стоящие ниже диагонали: for (Index j = 0; j
const double pivot = A(j, j);
if (pivot == 0) throw Elim_failure(j);
// обнуляем элементы, стоящие ниже диагонали в строке i for (Index i = j+1; i
const double mult = A(i, j) / pivot;
A[i].slice(j) = scale_and_add(A[j].slice(j),
-mult, A[i].slice(j)); b(i) -= mult * b(j); // изменяем вектор b
}
}
}
Опорным называется элемент, лежащий на диагонали в строке, которую мы
в данный момент обрабатываем. Он должен быть ненулевым, потому что нам при
дется на него делить; если он равен нулю, то генерируется исключение.
Vector back_substitution(const Matrix& A, const Vector& b)
{
const Index n = A.dim1();
Vector x(n);
for (Index i = n - 1; i >= 0; —i) {
double s = b(i)-dot_product(A[i].slice(i+1),x.slice(i+1));
if (double m = A(i, i)) x(i) = s / m;
else
throw Back_subst_failure(i);
}
return x;
}
|