Facebook
From Walloping Pintail, 1 Month ago, written in C++.
Embed
Download Paste or View Raw
Hits: 47
  1. #include <iostream>
  2. #include <cmath>
  3. #include <iomanip>
  4. #include <fstream>
  5.  
  6. //PRZEDZIA£ APROKSYMACJI
  7. const double granica_lewa = -2.0;
  8. const double granica_prawa = 2.0;
  9. const double przedzial =  granica_prawa - granica_lewa;
  10. const int n = 49;   // ILOŒÆ WÊZ£ÓW
  11. const int m = 4;   // STOPIEÑ WIELOMIANU
  12. double wektor_X[n+1];
  13. double wektor_Y[n+1];
  14. double wektor_R[m+1];
  15. double macierz_G[m+1][m+1];
  16. double wektor_A[m+1];
  17. double wektor_Q[n+1];
  18. double blad_aproksymacji;
  19.  
  20. using namespace std;
  21.  
  22. //WZÓR ZADANEJ FUNKCJI
  23. double funkcja (double x){
  24.      return sin(2*x)*sin(3*x);
  25.     }
  26.  
  27. //OBLICZANIE WEKTORA Z WARTOŚCIĄ X I WARTOŚCIĄ FUNKCJI
  28. void oblicz_wektor_XY(){
  29.     for (int i = 0; i < n+1; ++i){
  30.         wektor_X[i] = granica_lewa + i*((przedzial) / n);
  31.         wektor_Y[i] = funkcja(wektor_X[i]);
  32.     }
  33. }
  34.  
  35. //OBLICZANIE MACIERZY G
  36. void wypelnij_macierz_G(){
  37.     for (int i = 0; i <= m; ++i){
  38.         for (int j = 0; j <= m; ++j){
  39.             macierz_G[j][i] = 0;
  40.             for (int k = 0; k <= n; ++k){
  41.                 macierz_G[j][i] += pow(wektor_X[k], j + i);
  42.             }
  43.         }
  44.     }
  45. }
  46.  
  47. //OBLICZANIE WEKTORA R
  48. void oblicz_wektor_R(){
  49.     for(int i = 0; i < m+1; ++i){
  50.         wektor_R[i] = 0;
  51.         for (int j = 0; j < n+1; ++j){
  52.             wektor_R[i] += wektor_Y[j] * pow(wektor_X[j], i);
  53.         }
  54.     }
  55. }
  56.  
  57. //ROZWIĄZANIE RÓWNANIA METORDĄ GAUSSA
  58. bool rozwiazanie_Gaussa(){
  59.     for (int k = 0; k <= m; ++k){
  60.         for (int i = k + 1; i <= m; ++i){
  61.             wektor_R[i] -= (macierz_G[i][k] * wektor_R[k]) / macierz_G[k][k];
  62.             for (int j = k + 1; j <= m; ++j){
  63.                 if (macierz_G[k][k] == 0) return false;
  64.                 macierz_G[i][j] -= (macierz_G[i][k] * macierz_G[k][j]) / macierz_G[k][k];
  65.             }
  66.             macierz_G[i][k] = 0;
  67.         }
  68.     }
  69.     double suma;
  70.     wektor_A[m] = wektor_R[m] / macierz_G[m][m];
  71.     for (int i = m - 1; i >= 0; --i){
  72.         suma = 0;
  73.         for (int j = i + 1; j <= m; ++j) {
  74.             suma += macierz_G[i][j] * wektor_A[j];
  75.             }
  76.         wektor_A[i] = (wektor_R[i] - suma) / macierz_G[i][i];
  77.     }
  78.     return true;
  79. }
  80.  
  81. //OBLICZANIE WEKTORA Q - WARTOŚCI FUNKCJI APROKSYMOWANEJ
  82. void oblicz_wektor_Q(){
  83.     for (int i = 0; i < n+1; ++i){
  84.         double suma = 0;
  85.         for (int j = 0; j < m+1; ++j){
  86.             suma += wektor_A[j] * pow(wektor_X[i], j);
  87.         }
  88.         wektor_Q[i]=suma;
  89.     }
  90. }
  91.  
  92. //OBLICZANIE BŁĘDU APROKSYMACJI
  93. double oblicz_blad() {
  94.         double tmp = 0;
  95.         for (int i = 0; i < n+1; ++i)
  96.                 tmp += pow(wektor_Q[i] - wektor_Y[i], 2);
  97.         blad_aproksymacji = sqrt(tmp / n+1);
  98. }
  99.  
  100.  
  101. //STWORZENIE RAPORTU APROKSYMACJI
  102. void raport(){
  103.     fstream plik;
  104.     plik.open("raport.txt");
  105.  
  106.     //WYPISYWANIE WEZŁOW, WARTOŚCI FUNKCJI DOKŁADNEJ I WARTOŚCI FUNKCJI APROKSYMWOANEJ DO UŻYCIA W PROGRAMIE EXCEL
  107.     plik <<"wezel" << endl;
  108.     for (long i = 0; i < n; ++i){
  109.         plik << wektor_X[i] <<  endl;
  110.     }
  111.     plik << endl;
  112.  
  113.     plik <<"dokladna" << endl;
  114.     for (long i = 0; i < n+1; ++i){
  115.         plik << wektor_Y[i] <<  endl;
  116.     }
  117.     plik << endl;
  118.  
  119.     plik <<"aproksymowana"<< endl;
  120.     for (long i = 0; i < n+1; ++i){
  121.         plik << wektor_Q[i] <<  endl;
  122.     }
  123.     plik << endl;
  124.  
  125.     //WSPÓŁCZYNNIK A
  126.     for (int i = 0; i < m+1; ++i){
  127.         plik <<"A_"<< i <<" = ";
  128.         plik << wektor_A[i] << endl;
  129.     }
  130.  
  131.     //BŁĄD APROKSYMACJI
  132.     plik <<"\n\n Blad aproksymacji = "<< blad_aproksymacji <<"\n\n\n\n\n";
  133.  
  134.     plik.close();
  135. }