Для того чтобы избежать проблем с нулевыми диагональными элементами и повысить устойчивость алгоритма, можно переставить строки так, чтобы нули и малые величины на диагонали не стояли.
Говоря “повысить устойчивость”, мы имеем в виду понижение чувствительности к ошибкам округления. Однако по мере выполнения алгоритма элементы матрицы будут изменяться, поэтому перестановку строк приходится делать постоянно (иначе говоря, мы не можем лишь один раз переупорядочить матрицу, а затем применить классический алгоритм).
void elim_with_partial_pivot(Matrix& A, Vector& b)
{
const Index n = A.dim1();
for (Index j = 0; j < n; ++j) {
Index pivot_row = j;
// ищем подходящий опорный элемент: for (Index k = j + 1; k < n; ++k)
if (abs(A(k, j)) > abs(A(pivot_row, j))) pivot_row = k;
// переставляем строки, если найдется лучший опорный // элемент
if (pivot_row != j) {
A.swap_rows(j, pivot_row); std::swap(b(j), b(pivot_row));
}
// исключение:
for (Index i = j + 1; i < n; ++i) { const double pivot = A(j, j);
if (pivot==0) error("решения нет: pivot==0"); onst 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);
}
}
Для того чтобы не писать циклы явно и привести код в более традиционный вид, мы используем функции swap_rows() и scale_and_multiply().
Опубликовал katy
April 23 2015 11:28:32 ·
1 Комментариев ·
2776 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Oleg27 October 23 2023 12:17:49
Добрый день. Не думаю что есть особый смысл делать ставки если хочется азарта, так как шансов выиграть что-то низок. Лучше играть в казино, к примеру можно попробовать сыграть в вот этот игровой автомат 1Хбет зеркало
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.