Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <fstream>
- using namespace std;
- vector<double> mnozenie(vector<double> matylda, double liczba){
- for(int i=0; i<matylda.size(); i++)
- matylda[i] = matylda[i]*liczba;
- return matylda;
- }
- vector<double> odejmowanie(vector<double> matylda, vector<double> wladyslaw){
- for(int i=0; i<matylda.size(); i++)
- matylda[i] = matylda[i]-wladyslaw[i];
- return matylda; //matylda - wladyslaw
- }
- double F(vector<double> a, double x)
- {
- double y=0;
- for(int i=0; i<a.size(); i++)
- y+=a[i]*pow(x, i);
- return y;
- }
- int main()
- {
- //Projekt nr 5 - Aproksymacja średniokwadratowa dyskretna przy pomocy wielomianu
- int times = 1;
- //cin >> times;
- int m=1;
- //int m=30;
- for(int tt=0; tt<times || m<21; tt++)
- //for(int tt=0; tt<times; tt++)
- {
- ifstream pliczek;
- pliczek.open("dane.txt");
- if(!pliczek.is_open())
- return 17;
- ofstream output;
- output.open("wyjscie.txt", std::ios_base::app);
- if(!output.is_open())
- return 69;
- //int m = 2; //stopień wielomianu aproksymującego
- int n =5; //liczba węzłów aproksymacji, po ludzku znanych punktow
- int kupa;
- //cin >> m >> n;
- //pliczek >> m >> n;
- pliczek >> kupa >> n;
- m++;
- vector<double> x; //double *x = new double[n];
- vector<double> y;//double *y = new double[n];
- vector<double> s; //double *s = new double[2*m];
- vector<double> x2 ;//double *x2 = new double[n];
- vector<vector<double> > macierz;//double **macierz = new double *[m];
- vector<double> a; //double *a = new double[m];
- for(int i=0; i<n; i++)
- {
- double xx; double yy;
- //cin >> xx >> yy;
- pliczek >> xx >> yy;
- x.push_back(xx);
- y.push_back(yy);
- x2.push_back(1.0);
- }
- pliczek.close();
- //s to na poczatku 0, x2 to na poczatku 1
- for(int i=0; i<2*m; i++)
- {
- s.push_back(0.0);
- if(i==m+1)
- {
- for(int j=0; j<m; j++)
- {
- macierz.push_back(s);
- a.push_back(0.0);
- }
- }
- }
- //tysiac forów później...
- //teraz sobie wyznaczymy s[i], jest ich 2*m
- for(int i=0; i<2*m; i++)
- {
- //liczymy si. czyli
- //si = sumie wszystkich probek do potegi i
- //najpierw dodawaj potem przemnazaj
- for(int j=0; j<n; j++)
- s[i]+=x2[j];
- int xx=0;
- int yy=i;
- for(int j=0; j<m; j++)
- {
- if(xx>=0 && xx<m && yy>=0 && yy<m)
- macierz[xx][yy]=s[i];
- xx++; yy--;
- }
- //zakladajac ze s sie dobrze liczy i przypisuje zrobie kolejne potegi
- //powinnam ogarnac t.
- if(i<m)
- {
- double t=0;
- for(int j=0; j<n; j++)
- {
- t+=y[j]*x2[j];
- }
- macierz[i][m]=t;
- }
- for(int j=0; j<n; j++)
- x2[j]=x2[j]*x[j]; //potegujemy
- }
- //teraz polece gaussem, bo to jedyny sposob jaki zrozumialam.
- //for(int i=0; i<m; i++)
- //{
- // for(int j=0; j<m+1; j++)
- // cout << macierz[i][j] << " ";
- // cout << "\n";
- //}
- for(int i=0; i<m; i++)
- {
- int najnaj=i;
- for(int j=i; j<m; j++)
- {
- if(macierz[j][i]>macierz[najnaj][i])
- najnaj=j;
- }
- macierz[i].swap(macierz[najnaj]);
- macierz[i] = mnozenie(macierz[i], 1/macierz[i][i]);
- for(int j=i+1; j<m; j++)
- {
- macierz[j]=odejmowanie(macierz[j], mnozenie(macierz[i], macierz[j][i]));
- }
- }
- //cout << "\n";
- //for(int i=0; i<m; i++)
- //{
- // for(int j=0; j<m+1; j++)
- // cout << macierz[i][j] << " ";
- // cout << "\n";
- //}
- a[m-1]=macierz[m-1][m];
- for(int i=m-2; i>=0; i--)
- {
- a[i]=macierz[i][m];
- for(int j=m-1; j>i; j--)
- {
- a[i]-=a[j]*macierz[i][j];
- }
- }
- //for(int i=0; i<m; i++)
- //{
- // cout << a[i] << "\n";
- //}
- for(int i=0; i<n; i++)
- {
- //cout << F(a, x[i]) << "\n";
- //output << F(a, x[i]) << "\n";
- }
- double d=0;
- double sredni=0;
- for(int i=0; i<n; i++)
- {
- d+=(y[i] - F(a, x[i]))*(y[i] - F(a, x[i]));
- sredni+=(pow(y[i] - F(a, x[i]), 2)/(double)n);
- }
- 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)
- {
- cout << m-1 << " " << d << " " << sredni << "\n";
- output << d << "\n";// " " << sredni << "\n";
- }
- //int ile; // liczba zapytań o aproksymowane wartości
- //cin >> ile;
- //pliczek >> ile;
- //ile=0;
- //for(int i=0; i<ile; i++)
- //{
- // double xxx;
- // //cin >> xxx;
- // //cout << F(a, xxx) << "\n";
- //}
- output.close();
- output.open("y.txt", std::ios_base::app);
- if(!output.is_open())
- return 69;
- output.setf(std::ios::fixed, std:: ios::floatfield);
- output.precision(7);
- output << "Fx =[ ";
- //double placki=0.5;
- for(double i=-3; i<=3.005; i+=0.01)
- {
- output << F(a, (double)i) << ", ";
- }
- output << "];\n";
- output << "xx =[ ";
- for(int i=0; i<n; i++)
- {
- output << x[i] << "; ";
- }
- output << "];\n";
- output << "yy =[ ";
- for(int i=0; i<n; i++)
- {
- output << F(a,x[i]) << "; ";
- }
- output << "];\n";
- output.close();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement