Facebook
From Wojciech, 6 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 255
  1. #pragma warning (disable:4996)
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #define R 7
  6.  
  7. main()
  8. {
  9.         double A[R][R] = { 0 }, X[R] = { 0 }, B[R] = { 0 }, L[R][R] = { 0 }, D[R][R] = { 0 }, U[R][R] = { 0 }, Z[R] = { 0 }, Y[R] = { 0 };//macierze deklaracja
  10.         int i, j, k, rozmiar,pozycja,n;//inty    n jest tylko do wektora x wykorzystany
  11.         double iloczyn = 1, suma = 0, ysuma = 0, yiloczyn = 1;//do obliczania potrzebne
  12.                                                                                                                   /*Otwieranie pliku*/
  13.         FILE *plik1;
  14.         plik1 = fopen("plik01.txt", "r");
  15.         if (plik1 == NULL)
  16.         {
  17.                 printf("PLIK 1 JEST PUSTY LUB NIE ISTNIEJE\n");
  18.                 system("pause");
  19.         }
  20.         else
  21.         {
  22.                 /*KOMUNIKAT ZE PLIK ISTNIEJE*/
  23.                 printf("PLIK 1 ISTNIEJE :) \n");
  24.                 fscanf(plik1, "%d", &rozmiar);                                  //WCZYTANIE ROZMIARU MACIERZY
  25.                 printf("Rozmiar macierzy: %d\n\n", rozmiar);
  26.                 for (i = 0; i < rozmiar; i++)                                   //wczytujemy macierz A
  27.                 {
  28.                         for (j = 0; j < rozmiar; j++)
  29.                         {
  30.                                 fscanf(plik1, "%lf", &A[i][j]);
  31.                         }
  32.                 }
  33.                 //wczytanie wektora B
  34.                 for (i = 0; i < rozmiar; i++)
  35.                 {
  36.                         fscanf(plik1, "%lf", &B[i]);
  37.                 }
  38.  
  39.  
  40.                 /*ROZKLAD LDU ROZKLAD LDU ROZKLAD DLU*/
  41.                 /*KROK 1. DIAGONALKA I WIERSZ/KOLUMNA*/
  42.                 D[0][0] = A[0][0];
  43.                 for (i = 0; i < rozmiar; i++)                                   //L na kolumnie U na wierszu
  44.                 {
  45.                         L[i][0] = A[i][0] / D[0][0];
  46.                         U[0][i] = A[0][i] / D[0][0];
  47.                 }
  48.                 //TO JEST OK WIEC NIE RUSZAJ   
  49.                 /**/
  50.                 for (i = 1; i <rozmiar; i++)
  51.                 {
  52.                         L[i][i] = 1;
  53.                         U[i][i] = 1;
  54.                 }
  55.                 /*KROK 2. RESZTA DO OBLICZANIA MASAKRA*/
  56.                 for (i = 1; i < rozmiar; i++)
  57.                 {
  58.                         for (j = 1; j < rozmiar; j++)
  59.                         {
  60.                                 //DIAGONALNA gdy i=j
  61.                                 if (i == j)
  62.                                 {
  63.                                         suma = 0; iloczyn = 1;
  64.                                         for (k = 0; k < i; k++)
  65.                                         {
  66.                                                 iloczyn = L[i][k] * U[k][i] * D[k][k];
  67.                                                 suma += iloczyn;
  68.                                         }
  69.                                         D[i][i] = A[i][i] - suma;               //wynik diagonalki
  70.                                 }
  71.                                 //maczierz L gdy i>j
  72.                                 else if (i > j)
  73.                                 {
  74.                                         suma = 0; iloczyn = 1;
  75.                                         for (k = 0; k < j; k++)
  76.                                         {
  77.                                                 iloczyn = L[i][k] * U[k][j] * D[k][k];
  78.                                                 suma += iloczyn;
  79.                                         }
  80.                                         L[i][j] = (A[i][j] - suma) / D[j][j];
  81.                                         /*MACIERZ U TERAZ*/
  82.                                         k = i;//zamiana wspolrzednych
  83.                                         i = j;
  84.                                         j = k;
  85.                                         suma = 0; iloczyn = 1;
  86.                                         for (k = 0; k < j; k++)
  87.                                         {
  88.                                                 iloczyn = L[i][k] * U[k][j] * D[k][k];
  89.                                                 suma += iloczyn;
  90.                                         }
  91.                                         U[i][j] = (A[i][j] - suma) / D[i][i];
  92.                                         k = j;
  93.                                         j = i;
  94.                                         i = k;
  95.                                 }
  96.                         }
  97.                 }
  98.                 /* wypisanie LDU */
  99.                 printf("Macierz L \n");
  100.                 for (i = 0; i < rozmiar; i++)
  101.                 {
  102.                         for (j = 0; j < rozmiar; j++)
  103.                         {
  104.                                 printf("%lf\t", L[i][j]);
  105.                         }
  106.                         printf("\n");
  107.                 }
  108.                 printf("\nMacierz D  \n");
  109.                 for (i = 0; i < rozmiar; i++)
  110.                 {
  111.                         for (j = 0; j < rozmiar; j++)
  112.                         {
  113.                                 printf("%lf\t", D[i][j]);
  114.                         }
  115.                         printf("\n");
  116.                 }
  117.                 printf("\nMacierz U \n");
  118.                 for (i = 0; i < rozmiar; i++)
  119.                 {
  120.                         for (j = 0; j < rozmiar; j++)
  121.                         {
  122.                                 printf("%lf\t", U[i][j]);
  123.                         }
  124.                         printf("\n");
  125.                 }
  126.                 /*WYPISANIE MACIERZY A I WEKTORA X*/
  127.                 /*
  128.                 printf("\nMacierz A \n");
  129.                 for ( i = 0; i < rozmiar; i++)
  130.                 {
  131.                 for (j = 0; j < rozmiar; j++)
  132.                 {
  133.                 printf("%lf  ", A[i][j]);
  134.                 }
  135.                 printf("\n");
  136.                 }
  137.                 printf("\nWektor X \n");
  138.                 for (i = 0; i < rozmiar; i++)
  139.                 {
  140.                 printf("%lf  ", X[i]);
  141.                 }
  142.                 */
  143.                
  144.                 /*Wektor Y */
  145.                 Y[0] = B[0];
  146.                 ysuma = 0, yiloczyn = 1;
  147.                 for ( i = 1; i < rozmiar; i++)
  148.                 {
  149.                         for ( j = 0; j < rozmiar; j++)
  150.                         {
  151.                                 yiloczyn = L[i][j] * Y[j];
  152.                                 ysuma += yiloczyn;
  153.                         }
  154.                         Y[i] = B[i] - ysuma;
  155.                         ysuma = 0, yiloczyn = 1;
  156.                 }
  157.                 /*Wektor Z */
  158.                 for ( i = 0; i < rozmiar; i++)
  159.                 {
  160.                         Z[i] = Y[i] / D[i][i];
  161.                 }
  162.                 /*Wektor X */
  163.                 pozycja = rozmiar - 1;
  164.                 X[pozycja] = Z[pozycja];
  165.                 for ( i = pozycja; 0 < i ; i--)
  166.                 {
  167.                         n = i - 1;
  168.                         for ( j = i; j < rozmiar; j++)
  169.                         {
  170.                                 yiloczyn = U[n][j] * X[j];
  171.                                 ysuma += yiloczyn;
  172.                         }
  173.                         X[n] = Z[n] - ysuma;
  174.                         ysuma = 0, yiloczyn = 1;
  175.                 }
  176.  
  177.                 printf("\n\nWEKTOR XXXXXXX\n");
  178.                 for ( i = 0; i < rozmiar; i++)
  179.                 {
  180.                         printf("%lf   ", X[i]);
  181.                 }
  182.  
  183.                 printf("\n\n");
  184.                 system("pause");
  185.         }
  186. }