/* Zadanie: Napisz klase Regresja do obslugi regresli liniowej. Klasa ma zawierac: * - 2 prywatne tablice (np. valarray) * - 4 zmienne prywatne przechowujace wspolczynniki dopasowania a i b oraz ich niepewnosci da i db * - konstruktor przyjmujacy 2 tablice, jako argumenty * - metode obliczajaca regresje * - metode wypisujaca wynik * * Napisz funkcje main, ktora umozliwi przetestowanie klasy. * Wzory mozesz znalezc tu: http://fluid.itcmp.pwr.wroc.pl/~lewkow/regresja-liniowa.pdf */ // kompilacja z flaga -std=c++11 #include #include #include using namespace std; class Regresja { valarray X; valarray Y; double a, b, da, db; public: Regresja (valarray, valarray); void Oblicz (); void PodajWynik (); } ; Regresja::Regresja (valarray x, valarray y) { X = x; Y = y; } void Regresja::Oblicz () { double Sx = X.sum(); double Sy = Y.sum(); double Sxy = (X*Y).sum(); double Sx2 = (X*X).sum(); double Sy2 = (Y*Y).sum(); int Np = X.size(); double Ysred = Y.sum() / Y.size(); double Xsred = X.sum() / X.size(); a = (Np*Sxy - Sx*Sy) / (Np * Sx2 - Sx*Sx); b = Ysred - a * Xsred; double SSx = ( (X-Xsred)*(X-Xsred) ).sum() ; double SSy = ( (Y-Ysred)*(Y-Ysred) ).sum() ; double S_yx = sqrt ( ( pow(Y-(a*X+b),2) ).sum() / (Np - 2) ); da = sqrt( (SSy/SSx - a*a) / (Np-2) ); db = S_yx * sqrt (1/Np + Xsred*Xsred/ SSx); } void Regresja::PodajWynik () { cout << "\na = " << a << " +- " << da << endl; cout << "b = " << b << " +- " << db << endl; } int main() { valarray X = {1. , 2. , 3. , 4. , 5. }; valarray Y = {2.95, 5.04, 7.01, 8.92, 10.98}; Regresja R (X, Y); R.Oblicz(); R.PodajWynik(); return 0; }