Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: LU - разложение, для решения СЛАУ;  (Прочитано 14985 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Marat10.04

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
LU - разложение, для решения СЛАУ;
« : 09 Февраля 2011, 13:34:42 »
Пусть дано CЛАУ (Сист.Лин.Алгебр.Уравн.)
    Ax = b;
Можем матрицу A[ ][ ] представить в виде произведения двух матриц.
   A = LU
где L - нижн. треугольная матрица,
      U - верхн. треугольная, c единичками на диагонали.

Потом подставив LU вместо A получем:
  LUx = b
Обозначив y = Ux получем две простых систем
  Ly = b  - здесь найдем y
  Ux = y - отсюда x

код на C++ для LU - разложения:
#include <iostream>
using namespace std;

int main ()
{
  int n;
  double sum = 0;

  cout << "Введите порядок матрицы\n n = ";
  cin >> n;

  double A [ n ][ n ];
  double L [ n ][ n ];
  double U [ n ][ n ];

//задаем матрицу A[][] ...

  for (int i  = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
    {
      cout << "\na[" << i << "][" << j << "] = ";
      cin >> A [i][j];

      L [i][j] = 0;
      U [i][j] = 0;

      if (i == j)
        U [i][j] = 1;
    }
  }

//==============================================

//находим первый столбец L[][] и первую строку U[][]

  for (int i = 0; i < n; i++)
  {
    L [i][0] = A [i][0];
    U [0][i] = A [0][i] / L [0][0];
  }

//дальше вычисляем L[][], U[][] по формуле

  for (int i = 1; i < n; i++)
  {
      for (int j = 1; j < n; j++)
      {
          if (i >= j) //нижний треугольник
          {
              sum = 0;
              for (int k = 0; k < j; k++)
                  sum += L [i][k] * U [k][j];

              L [i][j] = A [i][j] - sum;
          }
          else // верхний
          {
              sum = 0;
              for (int k = 0; k < i; k++)
                  sum += L [i][k] * U [k][j];

              U [i][j] = (A [i][j] - sum) / L [i][i];
          }
      }
   }

//====================================================
   cout << "\n\n";
   for (int i = 0; i < n; i++)
   {
     for (int j = 0; j < n; j++)
       cout << "  " << L [i][j] << "   ";
     cout << "\n\n";
   }

   cout << "\n\n";

   for (int i  = 0; i < n; i++)
   {
     for (int j = 0; j < n; j++)
       cout << "  " << U [i][j] << "   ";
     cout << "\n\n";
   }

   return 0;
}



      

 

Страница сгенерирована за 0.061 секунд. Запросов: 26.