Facebook
From Soiled Pintail, 4 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 598
  1. #include <iostream>
  2. #include <math.h>
  3. #include <fstream>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. // y = cos^2(x) * sin(sqrt(5)*x)
  9. // metoda potęgowa
  10.  
  11. double y(double x) {
  12.         return (cos(x)*cos(x))*sin((sqrt(5)*x));
  13. }
  14.  
  15. void dyskretyzuj(double a, double b, double n, double *X, double *Y) {
  16.         for (int i = 0; i <= n; i++){
  17.                 X[i] = a + i * (b - a) / n;
  18.                 Y[i] = y(X[i]);
  19.         }
  20. }
  21.  
  22. void macierzGR(double **G, double *R, double *X, double *Y, double m, double n){
  23.         double pom = 0;
  24.  
  25.         for (int k = 0; k <= m; k++){
  26.                 for (int j = 0; j <= m; j++){
  27.                         pom = 0;
  28.                         for (int i = 0; i <= n; i++){
  29.                                 pom += pow(X[i], j + k);
  30.                         }
  31.                         G[k][j] = pom;
  32.                 }
  33.         }
  34.  
  35.         for (int k = 0; k <= m; k++){
  36.                 pom = 0;
  37.                 for (int i = 0; i <= n; i++){
  38.                         pom += Y[i] * pow(X[i], k);
  39.                 }
  40.                 R[k] = pom;
  41.         }
  42. }
  43.  
  44. void rozwiaz(double **G, double *R, double *A, int m){
  45.         for (int k = 1; k < m; k++){
  46.                 for (int i = k + 1; i < m; i++){
  47.                         for (int j = k + 1; j < m; j++){
  48.                                 if (G[k][k] == 0){
  49.                                         for (int l = 0; l < m; l++){
  50.                                                 G[k][l] += G[k + 1][l];
  51.                                         }
  52.                                         R[k] += R[k + 1];
  53.                                 }
  54.                                 else{
  55.                                         G[i][j] -= ((G[i][k] * G[k][j]) / G[k][k]);
  56.                                 }
  57.                         }
  58.                         R[i] -= ((G[i][k] * R[k]) / G[k][k]);
  59.                 }
  60.         }
  61.  
  62.         for (int i = 1; i <= m; i++){
  63.                 for (int j = 0; j < i; j++){
  64.                         G[i][j] = 0;
  65.                 }
  66.         }
  67.  
  68.         double suma = 0;
  69.  
  70.         A[m] = R[m] / G[m][m];
  71.  
  72.         for (int i = m - 1; i >= 0; i--){
  73.                 for (int j = i + 1; j < m; j++){
  74.                         suma += G[i][j] * A[j];
  75.                 }
  76.                 A[i] = ((R[i] - suma) / G[i][i]);
  77.                 suma = 0;
  78.         }
  79. }
  80.  
  81. double delta(double *X, double *Y, double *A, int m, int n){
  82.         double suma = 0;
  83.         for (int i = 0; i <= n; i++){
  84.                 double suma2 = 0;
  85.                 for (int j = 0; j <= m; j++){
  86.                         suma2 += A[j] * pow(X[i], j);
  87.                 }
  88.                 suma2 -= Y[i];
  89.                 suma += pow(suma2, 2);
  90.         }
  91.         suma /= (double)(n + 1);
  92.         return sqrt(suma);
  93. }
  94.  
  95. double Q(double *A, double x, int m){
  96.         double suma = 0;
  97.         for (int j = 0; j < m; j++){
  98.                 suma += A[j] * pow(x, j);
  99.         }
  100.  
  101.         return suma;
  102. }
  103.  
  104. void zapisz(double a, double b, int n, int m, double *X, double *Y, double **G, double *R, double *A, double blad, string s){
  105.         ofstream plik(s);
  106.  
  107.         plik << "n = " << n << "\tm = " << m << "\t <a, b> = " << a << " " << b << endl;
  108.        
  109.         plik << "\nX\tY\tQ\n";
  110.         for (int i = 0; i <= n; i++){
  111.                 plik << X[i] << "\t" << Y[i] << "\t" << Q(A, X[i], m) << endl;
  112.         }
  113.  
  114.         plik << "\nA\n";
  115.         for (int i = 0; i <= m; i++){
  116.                 plik << A[i] << endl;
  117.         }
  118.  
  119.         plik << "\nBlad = " << blad << endl;
  120.  
  121.         plik.close();
  122. }
  123.  
  124. int main() {
  125.  
  126.         double a = -2;
  127.         double b = 2;
  128.         int n = 49;
  129.         int m = 1;
  130.  
  131.         for (m; m < 20; m++){
  132.                 double *X = new double[n + 1];
  133.                 double *Y = new double[n + 1];
  134.  
  135.                 double **G = new double*[m + 1];
  136.                 double *R = new double[m + 1];
  137.  
  138.                 double *A = new double[m + 1];
  139.  
  140.                 for (int i = 0; i <= m; i++){
  141.                         G[i] = new double[m + 1];
  142.                 }
  143.  
  144.                 dyskretyzuj(a, b, n, X, Y);
  145.  
  146.                 macierzGR(G, R, X, Y, m, n);
  147.  
  148.                 rozwiaz(G, R, A, m);
  149.                
  150.                 string str = "wynik" + to_string(m) + ".txt";
  151.  
  152.                 zapisz(a, b, n, m, X, Y, G, R, A, delta(X, Y, A, m, n), str);
  153.         }
  154.  
  155.         system("pause");
  156.  
  157.         return 0;
  158. }