135 lines
3.3 KiB
C++
135 lines
3.3 KiB
C++
#include <iostream>
|
|
#include <fstream>
|
|
#include <sstream>
|
|
#include <vector>
|
|
#include <iomanip>
|
|
#include <cmath>
|
|
|
|
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()
|
|
{
|
|
bool 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<float>(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.0;
|
|
for (int i = 0; i < liczba_wezlow; i++)
|
|
{
|
|
double iloczyn = tablica_roznic[i][0];
|
|
for (int j = 0; j < liczba_wezlow; j++)
|
|
{
|
|
if (i != j)
|
|
{
|
|
iloczyn *= (x[j] - x[0]) / (x[i] - x[j]);
|
|
}
|
|
}
|
|
suma += iloczyn;
|
|
}
|
|
}
|
|
}
|
|
|
|
void wyswietl_tabela()
|
|
{
|
|
// 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;
|
|
vector<float> x, y;
|
|
vector<vector<float> > tablica_roznic;
|
|
};
|
|
|