Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.02 KB | None | 0 0
  1. // ConsoleApplication10.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include<iostream>
  6. #include<fstream>
  7. #include<string>
  8. #include<cmath>
  9.  
  10. #define n 21 // rozmiar tabeli - stopien wielomianu + 1, wynika to z przesuniecia w tabeli
  11. #define e 50 // liczba wezlow
  12. #define m 20 // stopien wielomianu
  13. #define a -2.0 // dolna granica przedzialu
  14. #define b 2.0 // gorna granica przedzialu
  15.  
  16. double x[e];
  17. double y[e];// tablica argumentow
  18. double yy[e];// tablica argumentow
  19.  
  20. double A[n + 1][n + 1]; // macierz wspolczynnikow A
  21. double B[n+1]; // macierz wyrazow wolnych
  22. double **U; // macierz U
  23. double **L; // macierz L
  24. double *X; // wektor wspolczynnikow A
  25. double *Y;
  26. using namespace std;
  27. double blad;
  28.  
  29. void GenerujTablice()// generuje tablice z argumentami i wartosciami funkcji aproksymowanej w tych punktach
  30. {       double w = a; // dolna granica przedzialu  
  31.     double odstep = (double)(abs(a)+abs(b))/(e-1); // odstep miedzy kolejnymi punktami ->dlugoscprzedzialu przez liczbeelementow - 1  
  32.     for(int i = 0; i <e; i++)
  33.     {   x[i] = w;  
  34.         y[i] = sin(x[i])*sin(3*x[i]);  
  35.         w += odstep;
  36.     }
  37. }
  38.  
  39. int macierzeUL() // obliczanie macierzy posrednich L i U
  40. {
  41.     U = new double* [n+1];  
  42.     for(int i = 0; i<= n; i++)  
  43.     {  
  44.         U[i] = new double[n+1]; //Alokacja pamieci  
  45.         memset( U[i], 0, (n+1) * sizeof(double));
  46.     }  L = new double* [n+1];  
  47.     for(int i = 0; i<= n; i++)
  48.     {   L[i] = new double[n+1]; //Alokacja pamieci  
  49.     memset( L[i], 0, (n+1) * sizeof(double) );
  50.     }  for(int i = 1; i <= n; i++)
  51. {
  52.     for (int j = 1; j <= n; j++) {
  53.         U[i][j] = A[i][j]; //Przepisujemy zawartosc macierzy A do macierzy U  
  54.         L[i][j] = 0;  // zerowanie macierzy L  
  55.     }  }  for(int i=1;i<=n;i++)
  56.     {   L[i][i]=1;  
  57.     if( U[i][i] == 0 ) //Sprawdzanie czy na głównej przekątnej nie ma 0  
  58.         return 2;
  59.     }
  60.     for(int k=1;k<n;k++)  
  61.     {   for(int i=k+1;i<=n;i++)  
  62.         {    if (U[k][k]==0)
  63.             return 2; // sprawdzenie czy dzielimy przez 0  
  64.             L[i][k]=U[i][k]/U[k][k]; // obliczanie macierzy L
  65.             for(int j=k+1;j<=n;j++)  // obliczanie macierzy U  
  66.             {     U[i][j]=U[i][j] - ((U[i][k]*U[k][j])/U[k][k]);
  67.             }    U[i][k]=0;  
  68.         }
  69.     }
  70.     return 0;
  71. }
  72.  
  73. void rozwiaz() // rozwiazanie macierzy trojkatynychgornych
  74. {
  75.         X= new double [n+1];
  76.         Y= new double [n+1];
  77.         Y[1]=B[1];
  78.         for( int i= 2; i<=n; i++)
  79.         {  
  80.             double suma=0.0;
  81.             for(int k=1; k<=i-1; k++)  
  82.                 suma+=L[i][k]* Y[k];  
  83.         Y[i]=B[i] - suma;
  84.         }
  85.         X[n]= Y[n] / U[n][n];
  86.         for (int i=n-1; i>=1; i--)
  87.         {   double suma=0.0;  
  88.         for(int k= i+1; k<=n; k++)  
  89.             suma+=U[i][k]*X[k];  
  90.         X[i]=(Y[i]- suma) / U[i][i];  }
  91. }
  92.  
  93. void GenerujMacierz() // funkcja odpowiadajaca za wygenerowanie macierzy współczynników
  94.  {
  95.             for (int j = 0; j <= m; j++)  
  96.             for (int k = 0; k <= m; k++)  
  97.             {    A[k+1][j+1] = 0;  
  98.             for (int i = 0; i <e; i++)    
  99.                 A[k+1][j+1] += pow(x[i],(k+j));
  100.             }
  101. }
  102.  
  103. double LiczR(int j) // funkcja wykorzystywana podczas generowanie kolumny wyrazów wolnych B ( w skryptowych wzorach wektor R)
  104. {  
  105.         double w = 0.0;
  106.         for(int i = 0; i <e; i++)
  107.             w += y[i]*pow(x[i],j);
  108.         return w;
  109. }
  110.  
  111.     void GenerujB() // funkcja odpowiadająca za wygenerowanie kolumny wyrazów wolnych ( w skryptowych wzorach wektor R
  112.     {
  113.  
  114.         for (int i = 0; i <= m; i++)  
  115.             B[i + 1] = LiczR(i);
  116. }
  117.  
  118. void WartosciFunkcjiAproksymujacej() // funkcja obliczajacawartosc funkcji aproksymowanej w punktach
  119. {  for (int i = 0; i <e; i++)
  120. {   yy[i] = 0;  
  121.     for (int j = 1; j <= m+1; j++)  
  122.     yy[i] += X[j] * pow(x[i], j-1);  
  123. }
  124. }
  125.  
  126. void ObliczBlad() // funkcja obliczajcablad
  127. {
  128.     double tmp = 0;
  129.     for (int i = 0; i <e; ++i)  
  130.         tmp += pow(yy[i] - y[i], 2);
  131.     blad = sqrt(tmp / e);
  132. }
  133.  
  134. void SaveToFile()
  135. {
  136.     string filename;
  137.     cout << "Podaj nazwe pliku gdzie zapisac raport: ";
  138.     cin >> filename;
  139.     ofstream output (filename.c_str(),ios_base::out);
  140.     output << "Liczba wezlow: " << e;
  141.     output << "\nStopien wielomianu: " << m;
  142.     output << "\nPrzedzial: [" << a << ", " << b << "]";
  143.     output.setf(ios_base::scientific);
  144.     output.precision(12);
  145.     output << "\nBlad aproksymacji: " << blad;
  146.     output.setf(ios_base::fixed, ios_base::floatfield);
  147.     output << "\nTabela wartości funkcji stablicowanej i aproksymujacej (dokladnosc do 12 miejsc po przecinku):\n";
  148.     output << "Wezel Wartoscdokladna Wartosc funkcji aproksymujacej\n";
  149.     for (long i = 0; i <e; ++i)
  150.     {
  151.         output << " ";
  152.         output << x[i];
  153.         output << " ";
  154.         output << y[i];
  155.         output << " ";
  156.         output << yy[i] << endl;
  157.     }
  158.     for (long i = 0; i < e; ++i)
  159.     {
  160.         output << yy[i] << endl;
  161.     }
  162.     output.unsetf(ios_base::fixed);
  163.     output.setf(ios_base::scientific);
  164.     output << "\nWspolczynniki A\n";
  165.     for (int i = 0; i <= m; ++i)
  166.     {
  167.         output.width(3);
  168.         output << i << ": ";
  169.         output.width(21);
  170.         output << X[i] << endl;
  171.     }
  172.     output.close();
  173. }
  174.  
  175. int main() {
  176.  
  177.     GenerujTablice();
  178.     GenerujMacierz();
  179.     GenerujB();
  180.     macierzeUL();
  181.     rozwiaz();
  182.     WartosciFunkcjiAproksymujacej();
  183.     ObliczBlad();
  184.     SaveToFile();
  185.     getchar();
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement