Добавил:
SSU_CSIT
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:методы вычислений Поплавский / Metod_NeoprKoef
.cpp#include <iostream>
#include <cmath>
#include <vector>
#include <iomanip>
using namespace std;
float y_tochn(float x, float t) {
return x * x * (x - t);
}
float p(float x) {
return x * x;
}
float q(float x) {
return x * x * x;
}
float f(float x, float t) {
return pow(x, 6) - t * pow(x, 5) + 3 * pow(x, 4) - 2 * pow(x, 3) + 6 * x - 2 * t;
}
float fi(float x, int i, float T) {
return pow(x, i + 1) - T * pow(x, i);
}
float fi_shtrih(float x, int i, float T) {
return (i + 1) * pow(x, i) - i * T * pow(x, i - 1);
}
float fi_shtrih_shtrih(float x, int i, float T) {
if (i < 2)
return i * (i + 1) * pow(x, i - 1) - (i - 1) * i * T;
else
return i * (i + 1) * pow(x, i - 1) - (i - 1) * i * T * pow(x, i - 2);
}
void print(pair <vector <vector <float>>, vector <float>> para) { // Вывод матрицы со столбцом
vector <vector <float>> result = para.first;
vector <float> b = para.second;
for (int i = 0; i < result.size(); i++, cout << endl) {
for (int j = 0; j < result[i].size(); j++)
cout << setw(7) << result[i][j];
cout << setw(7) << "| " << b[i];
}
cout << endl;
}
void print2(vector <vector <float>> result) { // Вывод матрицы без столбца
for (int i = 0; i < result.size(); i++, cout << endl)
for (int j = 0; j < result[i].size(); j++)
cout << setw(7) << result[i][j];
cout << endl;
}
pair <vector <vector <float>>, vector <float>> iter_str (pair <vector <vector <float>>, vector <float>> para, int m, int i, int j) { // Функция замены i и j строк матрицы
vector <vector <float>> mas = para.first;
vector <float> b = para.second;
vector <vector <float>> mas1 = mas;
vector <float> b1 = b;
for (int k = 0; k < m; k++) {
if (k == i) {
mas[k] = mas1[j];
b[k] = b1[j];
}
else if (k == j) {
mas[k] = mas1[i];
b[k] = b1[i];
}
else {
mas[k] = mas1[k];
b[k] = b1[k];
}
}
pair <vector <vector <float>>, vector <float>> para1(mas, b);
return para1;
}
vector <float> inverse_vector(vector <float> mas, int m) { //переворачивает вектор ответов
vector <float> res;
for (int i = m - 1; i >= 0; i--) {
res.push_back(mas[i]);
}
return res;
}
vector<float> Gauss_osn(pair <vector <vector <float>>, vector <float>> para, int m, vector <float> res) {
vector <vector <float>> mas = para.first;
vector <float> b = para.second;
vector <vector <float>> mas1 = mas; // Вспомогательный вектор
cout << "Процесс прямого хода: " << endl;
for (int k = 0; k < m; k++) {
if (mas1[k][k] == 0) { // Если знаменатель равен нулю
float max = 0;
int max_str = k;
for (int x = k; x < m; x++) { // Поиск в столбце максимального по модулю значения
if (abs(mas1[x][k]) > 0) {
max_str = x;
max = abs(mas1[x][k]);
}
}
if (max > 0) {
pair <vector <vector <float>>, vector <float>> para(mas1, b);
mas1 = iter_str(para, m, k, max_str).first;
b = iter_str(para, m, k, max_str).second;
cout << "Меняем местами строки с номерами " << k << " и " << max_str << endl;
pair <vector <vector <float>>, vector <float>> para1(mas1, b);
print(para1);
mas = mas1;
}
}
for (int j = k; j < m; j++)
mas[k][j] /= mas1[k][k];
b[k] /= mas1[k][k];
for (int i = k + 1; i < m; i++) {
for (int j = k; j < m; j++) {
mas[i][j] -= mas1[i][k] * mas[k][j];
}
b[i] -= mas1[i][k] * b[k];
}
mas1 = mas;
pair <vector <vector <float>>, vector <float>> para(mas, b);
print(para);
}
cout << "Процесс обратного хода: " << endl;
float raz = 0;
for (int k = m - 1; k >= 0; k--) {
cout << "x[" << k << "] = " << b[k];
for (int x = 0; x < m - 1 - k; x++) {
raz += res[x] * mas[k][m - x - 1];
cout << " - x[" << m - x - 1 << "] * " << mas[k][m - x - 1];
}
res.push_back(b[k] * 1.0 - raz);
cout << " = " << res[res.size() - 1] << endl;
raz = 0;
}
return res;
}
vector <vector <float>> matrix_for_metod_neopr_koef(int n, vector <float> x, int var) {
vector <vector <float>> res(n);
for (int i = 0; i < n; i++) {
for (int j = 1; j <= n; j++) {
res[i].push_back(fi_shtrih_shtrih(x[i], j, var) +
p(x[i]) * fi_shtrih(x[i], j, var) +
q(x[i]) * fi(x[i], j, var));
}
}
return res;
}
// Основная функция
int main() {
setlocale(LC_ALL, "RUS");
cout << "Введите ваш вариант: ";
int var, m, n, i, j, val;
cin >> var;
vector <float> d, res1, res2, x, y, a;
cout << "Введите количество узлов + 1: ";
cin >> n;
float h = 1.0 * var / n; // Шаг (нужно 5)
for (int i = 1; i < n; i++)
x.push_back(i * h);
for (int i = 0; i < n - 1; i++)
d.push_back(f(x[i], var));
vector <vector <float>> res = matrix_for_metod_neopr_koef(n - 1, x, var);
pair <vector <vector <float>>, vector <float>> para(res, d);
print(para);
a = inverse_vector(Gauss_osn(para, n - 1, res1), n - 1);
for (int i = 0; i < n - 1; i++) {
float sum = 0.0;
for (int j = 0; j < n - 1; j++)
sum += 1.0 * a[j] * fi(x[i], j + 1, var);
y.push_back(sum);
}
cout << setw(7) << "x[i]:";
for (int i = 0; i < n - 1; i++) cout << x[i] << setw(7);
cout << endl;
cout << setw(7) << "y_m:";
for (int i = 0; i < n - 1; i++) cout << y[i] << setw(7);
cout << endl;
cout << setw(7) << "y_t:";
for (int i = 0; i < n - 1; i++) cout << y_tochn(x[i], var) << setw(7);
cout << endl;
cout << setw(7) << "e[i]:";
for (int i = 0; i < n - 1; i++) cout << abs(y[i] - y_tochn(x[i], var)) << setw(7);
cout << endl;
system("pause");
return 0;
}
Соседние файлы в папке методы вычислений Поплавский