#cpp #алгоритм
Вопрос больше теоретического характера. Каким образом можно объединить прямой и обратный
ход Гаусса при решении СЛАУ в одну процедуру, то есть имеется в виду, в один цикл,
в один "проход"?
Еще раз повторюсь, мне не нужен целиком алгоритм. Мне нужна лишь идея на словах с
очень кратким пояснением к ней.
Быть может, попробовать организовать какой-нибудь цикл от n-1 до 0 (ну если СЛАУ
nxn), где магическим образом будут и коэффициенты матрицы зануляться, и вектор решения
считаться?
Если вдруг кому может понадобиться кусочек кода, реализующий эти два хода, то оно вот:
/// Прямой ход
bool gausss( tdouble ** mtx, tdouble * vect )
{
tdouble c;
for ( int j = 0; j < n; j++ ) {
tdouble temp = abs( mtx[j][j] );
int mem = j; максимум
for ( int i = j + 1; i < n; i++ ) { // от j+1
if ( temp < abs( mtx[i][j] ) ) {
temp = abs( mtx[i][j] );
mem = i;
}
}
if ( temp < eps ) return false;
changing( mtx, vect, mem, j );
for ( int i = j + 1; i < n; i++ ) {
c = mtx[i][j] / mtx[j][j];
for ( int k = j; k < n; k++ ) {
mtx[i][k] -= c * mtx[j][k];
}
vect[i] -= c * vect[j];
}
}
return true;
}
/// Обратный ход
void gausss_reverse( tdouble ** mtx, tdouble * vect, tdouble * sol )
{
for ( int i = n - 1; i >= 0; i-- ) {
tdouble temp = 0;
for ( int j = i + 1; j < n; j++ ) {
temp += mtx[i][j] * sol[j];
}
sol[i] = (vect[i] - temp) / mtx[i][i];
}
}
Ответы
Ответ 1
Ну смотрите. В чём заключается обычно метод Гаусса? Вы на прямом ходе получаете нули под диагональю. А на обратном — над диагональю. Это можно легко объединить. В объединённом алгоритме вы сначала выполняете шаг прямого метода — при этом под диагональю получаются нули. Теперь вы можете текущей строкой «убить» ненулевые коэффициенты над ней. Таким образом, у вас матрица будет выглядеть так (пример для третьего шага): a11 0 0 a14 0 a22 0 a24 0 0 a33 a34 0 0 0 a44 0 0 0 a54 .............. На каждом шаге у вас добавляется один столбец в диагональный вид матрицы. В принципе, вы можете на каждом шаге ещё и делить на диагональный элемент, чтобы получить там единицу. Тогда в конце у вас столбец свободных членов станет столбцом-решением.
Комментариев нет:
Отправить комментарий