2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 LDR разложение, алгоритм.
Сообщение14.09.2014, 10:45 
Добрый день, уважаемые участники форума!
Не могли бы вы мне подсказать (или дать источник, где это есть) про алгоритм разложения матрицы в произведение LDR (нижнетреугольная, диагональная, верхнетреугольная) для решений СЛАУ. Сам в интернете нигде не найду.
Материалы из линейной алгебры дают очень запутанный и бессмысленный рекурсивный алгоритм. (Хотя бы тем, что для вычислений там необходимо вычислять обратную матрицу.)

 
 
 
 Re: LDR разложение, алгоритм.
Сообщение14.09.2014, 12:33 
Аватара пользователя
shukshin в сообщении #907565 писал(а):
Сам в интернете нигде не найду.

Учебники не пробовали смотреть (Воеводин?)?

 
 
 
 Re: LDR разложение, алгоритм.
Сообщение14.09.2014, 12:52 
там есть на эту тему, но все-таки не оно (разложение $A = L L^T $ вроде)

 
 
 
 Re: LDR разложение, алгоритм.
Сообщение14.09.2014, 15:36 
Обычно это, насколько я понимаю, называется LDU — может, потому плохо искалось?

 
 
 
 Re: LDR разложение, алгоритм.
Сообщение14.09.2014, 18:06 
Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра.
Алгоритм I.7 на стр.92 (разложение LDU).

 
 
 
 Re: LDR разложение, алгоритм.
Сообщение14.09.2014, 21:44 
Нашел вот здесь в итоге:

Изображение
Но не получается алгоритм, ни в какую. Может свежим взглядом, кто зацепит? (индексы сдвинуты на 1, так как в С нумерация массивов с 0)
код: [ скачать ] [ спрятать ]
Используется синтаксис C
  1. void LDU_decomposition(matrix_t *A, matrix_t *L, matrix_t *D, matrix_t *U)
  2. {
  3.         int i, j ,k;
  4.         double S;
  5.  
  6.         Make_E(L), Make_E(D), Make_E(U);
  7.  
  8.         D->p[0][0] = A->p[0][0];
  9.  
  10.         for(j = 1; j < A->x; ++j)
  11.         {
  12.        
  13.           for(i = 0; i <= j - 1; ++i)
  14.           {
  15.                     if(i == 0)
  16.                         {
  17.                                 U->p[i][j] = (double)(A->p[i][j]) / (D->p[i][i]);
  18.                                 L->p[j][i] = (double)(A->p[j][i]) / (D->p[i][i]);
  19.                         }
  20.                         else if(i > 0)
  21.                         {
  22.                                 for(S = 0, k = 0; k < i - 1; ++k)
  23.                                         S += L->p[i][k] * D->p[k][k] * U->p[k][j];
  24.                                 U->p[i][j] = (double)(A->p[i][j] - S) / (D->p[i][i]);
  25.  
  26.                                 for(S = 0, k = 0; k < j - 1; ++k)
  27.                                         S += U->p[k][i] * D->p[k][k] * L->p[j][k];
  28.                         L->p[j][i] = (double)(A->p[j][i] - S) / (D->p[i][i]);
  29.                         }
  30.           }
  31.          
  32.           for(S = 0, k = 0; k < j - 1; ++k)
  33.                 S += (U->p[k][j]) * (D->p[k][k]) * (L->p[j][k]);
  34.           D->p[j][j] = (A->p[j][j] - S);
  35.          
  36.          
  37.         }
  38. }

 
 
 
 Re: LDR разложение, алгоритм.
Сообщение14.09.2014, 22:58 
Аватара пользователя
А в этой вашей книге отражено. что для устойчивости вычислений в матрице на каждом шагу надо находить максимальный элемент (по модулю)?

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group