Advertisement
desdemona

aproksymacja sredniokwadratowa bla bli.

May 25th, 2013
448
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6. vector<double> mnozenie(vector<double> matylda, double liczba){
  7.     for(int i=0; i<matylda.size(); i++)
  8.         matylda[i] = matylda[i]*liczba;
  9.     return matylda;
  10. }
  11. vector<double> odejmowanie(vector<double> matylda, vector<double> wladyslaw){
  12.     for(int i=0; i<matylda.size(); i++)
  13.         matylda[i] = matylda[i]-wladyslaw[i];
  14.     return matylda; //matylda - wladyslaw
  15. }
  16. double F(vector<double> a, double x)
  17. {
  18.     double y=0;
  19.     for(int i=0; i<a.size(); i++)
  20.         y+=a[i]*pow(x, i);
  21.  
  22.     return y;
  23. }
  24.  
  25. int main()
  26. {
  27.     //Projekt nr 5 - Aproksymacja średniokwadratowa dyskretna przy pomocy wielomianu
  28.     int times = 1;
  29.     //cin >> times;
  30.     int m=1;
  31.     //int m=30;
  32.     for(int tt=0; tt<times || m<21; tt++)
  33.     //for(int tt=0; tt<times; tt++)
  34.     {
  35.         ifstream pliczek;
  36.         pliczek.open("dane.txt");
  37.         if(!pliczek.is_open())
  38.             return 17;
  39.  
  40.         ofstream output;
  41.         output.open("wyjscie.txt", std::ios_base::app);
  42.         if(!output.is_open())
  43.             return 69;
  44.  
  45.         //int m = 2;  //stopień wielomianu aproksymującego
  46.         int n =5;  //liczba węzłów aproksymacji, po ludzku znanych punktow
  47.         int kupa;
  48.         //cin >> m >> n;
  49.         //pliczek >> m >> n;
  50.         pliczek >> kupa >> n;
  51.         m++;
  52.  
  53.         vector<double> x; //double *x = new double[n];
  54.         vector<double> y;//double *y = new double[n];
  55.         vector<double> s; //double *s = new double[2*m];
  56.         vector<double> x2 ;//double *x2 = new double[n];
  57.         vector<vector<double> > macierz;//double **macierz = new double *[m];
  58.         vector<double> a; //double *a = new double[m];
  59.         for(int i=0; i<n; i++)
  60.         {
  61.             double xx; double yy;
  62.             //cin >> xx >> yy;
  63.             pliczek >> xx >> yy;
  64.             x.push_back(xx);
  65.             y.push_back(yy);
  66.             x2.push_back(1.0);
  67.         }
  68.         pliczek.close();
  69.         //s to na poczatku 0, x2 to na poczatku 1
  70.         for(int i=0; i<2*m; i++)
  71.         {
  72.             s.push_back(0.0);
  73.             if(i==m+1)
  74.             {
  75.                 for(int j=0; j<m; j++)
  76.                 {
  77.                     macierz.push_back(s);
  78.                     a.push_back(0.0);
  79.                 }
  80.             }
  81.         }
  82.         //tysiac forów później...
  83.         //teraz sobie wyznaczymy s[i], jest ich 2*m
  84.         for(int i=0; i<2*m; i++)
  85.         {
  86.             //liczymy si. czyli
  87.             //si = sumie wszystkich probek do potegi i
  88.             //najpierw dodawaj potem przemnazaj
  89.             for(int j=0; j<n; j++)
  90.                 s[i]+=x2[j];
  91.  
  92.             int xx=0;
  93.             int yy=i;
  94.             for(int j=0; j<m; j++)
  95.             {
  96.                 if(xx>=0 && xx<m && yy>=0 && yy<m)
  97.                     macierz[xx][yy]=s[i];
  98.  
  99.                 xx++; yy--;
  100.             }
  101.             //zakladajac ze s sie dobrze liczy i przypisuje zrobie kolejne potegi
  102.             //powinnam ogarnac t.
  103.             if(i<m)
  104.             {
  105.                 double t=0;
  106.                 for(int j=0; j<n; j++)
  107.                 {
  108.                     t+=y[j]*x2[j];
  109.                 }
  110.                 macierz[i][m]=t;
  111.             }
  112.  
  113.  
  114.             for(int j=0; j<n; j++)
  115.                 x2[j]=x2[j]*x[j]; //potegujemy
  116.            
  117.         }
  118.         //teraz polece gaussem, bo to jedyny sposob jaki zrozumialam.
  119.  
  120.         //for(int i=0; i<m; i++)
  121.         //{
  122.         //  for(int j=0; j<m+1; j++)
  123.         //      cout << macierz[i][j] << " ";
  124.         //  cout << "\n";
  125.         //}
  126.  
  127.         for(int i=0; i<m; i++)
  128.         {
  129.             int najnaj=i;
  130.             for(int j=i; j<m; j++)
  131.             {
  132.                 if(macierz[j][i]>macierz[najnaj][i])
  133.                     najnaj=j;
  134.             }
  135.            
  136.             macierz[i].swap(macierz[najnaj]);
  137.             macierz[i] = mnozenie(macierz[i], 1/macierz[i][i]);
  138.             for(int j=i+1; j<m; j++)
  139.             {
  140.                 macierz[j]=odejmowanie(macierz[j], mnozenie(macierz[i], macierz[j][i]));
  141.             }
  142.         }
  143.         //cout << "\n";
  144.         //for(int i=0; i<m; i++)
  145.         //{
  146.         //  for(int j=0; j<m+1; j++)
  147.         //      cout << macierz[i][j] << " ";
  148.         //  cout << "\n";
  149.         //}
  150.  
  151.         a[m-1]=macierz[m-1][m];
  152.         for(int i=m-2; i>=0; i--)
  153.         {
  154.             a[i]=macierz[i][m];
  155.             for(int j=m-1; j>i; j--)
  156.             {
  157.                 a[i]-=a[j]*macierz[i][j];
  158.             }
  159.         }
  160.  
  161.         //for(int i=0; i<m; i++)
  162.         //{
  163.         //  cout << a[i] << "\n";
  164.         //}
  165.  
  166.         for(int i=0; i<n; i++)
  167.         {
  168.             //cout << F(a, x[i]) << "\n";
  169.             //output << F(a, x[i]) << "\n";
  170.         }
  171.  
  172.         double d=0;
  173.         double sredni=0;
  174.         for(int i=0; i<n; i++)
  175.         {
  176.             d+=(y[i] - F(a, x[i]))*(y[i] - F(a, x[i]));
  177.             sredni+=(pow(y[i] - F(a, x[i]), 2)/(double)n);
  178.         }
  179.         if(m-1 == 1 ||m-1 == 2 ||m-1 == 5 ||m-1 == 10 || m-1 == 15 ||m-1 == 20 || m-1==25 ||m-1 == 30 ||m-1 == 50)
  180.         {
  181.             cout << m-1 << " " << d << " " << sredni << "\n";
  182.             output << d << "\n";// " " << sredni << "\n";
  183.         }
  184.        
  185.  
  186.         //int ile; // liczba zapytań o aproksymowane wartości
  187.         //cin >> ile;
  188.         //pliczek >> ile;
  189.         //ile=0;
  190.         //for(int i=0; i<ile; i++)
  191.         //{
  192.         //  double xxx;
  193.         //  //cin >> xxx;
  194.         //  //cout << F(a, xxx) << "\n";
  195.         //}
  196.        
  197.         output.close();
  198.         output.open("y.txt", std::ios_base::app);
  199.        
  200.         if(!output.is_open())
  201.             return 69;
  202.         output.setf(std::ios::fixed, std:: ios::floatfield);
  203.         output.precision(7);
  204.         output << "Fx =[ ";
  205.         //double placki=0.5;
  206.         for(double i=-3; i<=3.005; i+=0.01)
  207.         {
  208.             output << F(a, (double)i) << ", ";
  209.  
  210.         }
  211.         output << "];\n";
  212.         output << "xx =[ ";
  213.         for(int i=0; i<n; i++)
  214.         {
  215.             output << x[i] << "; ";
  216.         }
  217.         output << "];\n";
  218.         output << "yy =[ ";
  219.         for(int i=0; i<n; i++)
  220.         {
  221.             output << F(a,x[i]) << "; ";
  222.         }
  223.         output << "];\n";
  224.         output.close();
  225.     }
  226.    
  227.     return 0;
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement