Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
6
Добавлен:
18.08.2022
Размер:
4.21 Кб
Скачать
#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;
}
Соседние файлы в папке методы вычислений Поплавский