#include #include #include #include #include #include using namespace std; class Interpolacja { public: void readFromFile(string filename) { string str; fstream file(filename); if (!file) { cerr << "Nie udalo sie otworzyc pliku o nazwie: " << filename << "\n"; exit(EXIT_FAILURE); } while (getline(file, str)) { istringstream iss(str); if (iss >> a >> b) { x.push_back(a); y.push_back(b); } } liczba_wezlow = x.size(); if (liczba_wezlow < 2) { cerr << "Za malo danych do interpolacji.\n"; exit(EXIT_FAILURE); } h = x[1] - x[0]; file.close(); } void oblicz() { rowne_odstepy = true; float pierwszy_odstep = x[1] - x[0]; // Sprawdzenie czy odstępy x są takie same for (int i = 2; i < liczba_wezlow; i++) { if (std::abs((x[i] - x[i - 1]) - pierwszy_odstep) > 1e-6) { rowne_odstepy = false; break; } } if (rowne_odstepy) { // Newton tablica_roznic.assign(liczba_wezlow, vector(liczba_wezlow, 0)); for (int i = 0; i < liczba_wezlow; i++) { tablica_roznic[i][0] = y[i]; } for (int j = 1; j < liczba_wezlow; j++) { for (int i = 0; i < liczba_wezlow - j; i++) { tablica_roznic[i][j] = (tablica_roznic[i + 1][j - 1] - tablica_roznic[i][j - 1]); } } suma = tablica_roznic[0][0]; for (int i = 1; i < liczba_wezlow; i++) { czynnik = tablica_roznic[0][i]; for (int j = 0; j < i; j++) { czynnik *= (x[j] - x[0]); } suma += czynnik; } } else { // Lagrange suma = 0; for (int i = 0; i < liczba_wezlow; i++) { float L = 1; for (int j = 0; j < liczba_wezlow; j++) { if (i != j) { L *= (x[j] - x[0]) / (x[j] - x[i]); } } suma += L * y[i]; } } } void wyswietl_tabela() { if(rowne_odstepy) { // nagłowki cout << setw(5) << "i" << setw(10) << "x" << setw(10) << "y"; for (int j = 1; j < liczba_wezlow; ++j) cout << setw(10) << "Δ^" + to_string(j); cout << endl; // wartości for (int i = 0; i < liczba_wezlow; i++) { cout << setw(5) << i << setw(10) << x[i]; for (int j = 0; j < liczba_wezlow - i; j++) { cout << setw(10) << tablica_roznic[i][j]; } cout << endl; } } cout << "Interpolowany wynik: " << suma << endl; } private: float a, b, h, suma, czynnik; int liczba_wezlow; bool rowne_odstepy; vector x, y; vector > tablica_roznic; };