Добавил:
SSU_CSIT
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:методы вычислений Поплавский / Inter_Splines
.cpp#include <iostream>
#include <cmath>
#include <vector>
#include <string>
#include <iomanip>
using namespace std;
vector<vector<float>> splaym(vector<float> vec, vector<float> f, float x) {
vector<vector<float>> res(4 * (f.size() - 1));
float p;
for (int i = 0; i < f.size() - 1; i++) { // Первые n уравнений
for (int j = 0; j < i; j++)
res[i].push_back(0);
res[i].push_back(1);
while (res[i].size() < 4 * (f.size() - 1))
res[i].push_back(0);
}
for (int i = f.size() - 1; i < 2 * (f.size() - 1); i++) { // Вторые n уравнений
p = 1;
for (int j = f.size() - 1; j < i; j++)
res[i].push_back(0);
for (int j = i - (f.size() - 1); j < 4 * (f.size() - 1); j += f.size() - 1) {
res[i].push_back(p);
for (int k = 0; k < f.size() - 2 && res[i].size() < 4 * (f.size() - 1); k++)
res[i].push_back(0);
p *= (x - vec[i - (f.size() - 1)]);
}
}
for (int i = 2 * (f.size() - 1); i < 3 * (f.size() - 1) - 1; i++) { // Третьи n-1 уравнений
for (int j = f.size() - 1; j < i; j++)
res[i].push_back(0);
res[i].push_back(1);
res[i].push_back(-1);
for (int j = 0; j < f.size() - 3; j++)
res[i].push_back(0);
res[i].push_back(2 * (x - vec[i - 2 * (f.size() - 1)]));
for (int j = 0; j < f.size() - 2; j++)
res[i].push_back(0);
res[i].push_back(3 * (x - vec[i - 2 * (f.size() - 1)]) * (x - vec[i - 2 * (f.size() - 1)]));
while (res[i].size() < 4 * (f.size() - 1))
res[i].push_back(0);
}
for (int i = 3 * (f.size() - 1) - 1; i < 4 * (f.size() - 1) - 2; i++) { // Четвертые n-1 уравнений
for (int j = (f.size() - 1) - 1; j < i; j++)
res[i].push_back(0);
res[i].push_back(2);
res[i].push_back(-2);
for (int j = 0; j < f.size() - 3; j++)
res[i].push_back(0);
res[i].push_back(6 * (x - vec[i - (3 * (f.size() - 1) - 1)]));
while (res[i].size() < 4 * (f.size() - 1))
res[i].push_back(0);
}
int i = 4 * (f.size() - 1) - 2;
for (int j = 0; j < 2 * (f.size() - 1); j++)
res[i].push_back(0);
res[i].push_back(1); // Уравнение с1 = 0;
while (res[i].size() < 4 * (f.size() - 1))
res[i].push_back(0);
i++;
for (int j = 0; j < 3 * (f.size() - 1) - 1; j++)
res[i].push_back(0);
res[i].push_back(2);
for (int j = 0; j < (f.size() - 1) - 1; j++)
res[i].push_back(0);
res[i].push_back(6 * (vec[f.size() - 1] - vec[f.size() - 2])); // Крайнее уравнение: c_n + 6 * (x_n - x_n-1) = 0
return res;
}
void print(vector<vector<float>> result, vector<float> f) {
float res;
cout << "Решаем СЛАУ вида: " << endl;
for (int i = 1; i < f.size(); i++, cout << endl)
cout << "a" << i << " = f" << i - 1;
for (int i = 1; i < f.size(); i++, cout << endl) {
cout << "a" << i << " + b" << i << "(x - x" << i - 1 << ") + c" << i << "(x - x" << i - 1 << ")^2 + d";
cout << i << "(x - x" << i - 1 << ")^3 = f" << i;
}
for (int i = 1; i < f.size() - 1; i++, cout << endl)
cout << "b" << i << " + 2c" << i << "(x - x" << i - 1 << ") + 3d" << i << "(x - x" << i - 1 << ")^2 = b" << i + 1;
for (int i = 1; i < f.size() - 1; i++, cout << endl)
cout << "2c" << i << " + 6d" << i << "(x - x" << i - 1 << ") = 2c" << i + 1;
cout << "c1 = 0" << endl;
cout << "2c" << f.size() - 1 << " + 6d" << f.size() - 1 << "(x" << f.size() - 1 << " - x" << f.size() - 1 - 1 << ") = 0" << endl;
for (int i = 0; i < result.size(); i++, cout << endl) {
for (int j = 0; j < result[i].size(); j++)
cout << setw(4) << result[i][j];
if (i < f.size() - 1)
res = f[i];
else if (i < 2 * (f.size() - 1))
res = f[i - (f.size() - 1 - 1)];
else
res = 0;
cout << setw(4) << "/ " << res;
}
}
int main() {
setlocale(LC_ALL, "RUS");
vector<float> vec, f;
int n;
cout << "Введите количество элементов: ";
cin >> n;
float x, val;
for (int i = 0; i < n; i++) {
cout << "x" << i << ": ";
cin >> x;
vec.push_back(x);
}
for (int i = 0; i < n; i++) {
cout << "f(x" << i << "): ";
cin >> val;
f.push_back(val);
}
cout << "Введите х: ";
cin >> x;
vector<vector<float>> res = splaym(vec, f, x);
print (res, f);
system("pause");
return 0;
}
Соседние файлы в папке методы вычислений Поплавский